/* Include <config.h> and a form of <stdio.h> first. */
+#include <errno.h>
#include <stdlib.h>
+#include <unistd.h>
#define ASSERT(expr) \
do \
} \
while (0)
-int
-main ()
+/* Test fopen. Assumes BASE is defined. */
+
+static int
+test_fopen (void)
{
+ FILE *f;
+ /* Remove anything from prior partial run. */
+ unlink (BASE "file");
+
+ /* Read requires existing file. */
+ errno = 0;
+ ASSERT (fopen (BASE "file", "r") == NULL);
+ ASSERT (errno == ENOENT);
+
+ /* Write can create a file. */
+ f = fopen (BASE "file", "w");
+ ASSERT (f);
+ ASSERT (fclose (f) == 0);
+
+ /* Trailing slash is invalid on non-directory. */
+ errno = 0;
+ ASSERT (fopen (BASE "file/", "r") == NULL);
+ ASSERT (errno == ENOTDIR || errno == EISDIR || errno == EINVAL);
+
+ /* Cannot create a directory. */
+ errno = 0;
ASSERT (fopen ("nonexist.ent/", "w") == NULL);
- ASSERT (fopen ("/dev/null/", "r") == NULL);
+ ASSERT (errno == ENOTDIR || errno == EISDIR || errno == ENOENT
+ || errno == EINVAL);
+
+ /* Directories cannot be opened for writing. */
+ errno = 0;
+ ASSERT (fopen (".", "w") == NULL);
+ ASSERT (errno == EISDIR || errno == EINVAL || errno == EACCES);
+
+ /* /dev/null must exist, and be writable. */
+ f = fopen ("/dev/null", "r");
+ ASSERT (f);
+ ASSERT (fclose (f) == 0);
+ f = fopen ("/dev/null", "w");
+ ASSERT (f);
+ ASSERT (fclose (f) == 0);
- ASSERT (fopen ("/dev/null", "r") != NULL);
+ /* Cleanup. */
+ ASSERT (unlink (BASE "file") == 0);
return 0;
}