/* Test that openat works.
- Copyright (C) 2009 Free Software Foundation, Inc.
+ Copyright (C) 2009-2013 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <fcntl.h>
+#include "signature.h"
+SIGNATURE_CHECK (openat, int, (int, char const *, int, ...));
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdbool.h>
#include <stdio.h>
-#include <stdlib.h>
#include <unistd.h>
-#define ASSERT(expr) \
- do \
- { \
- if (!(expr)) \
- { \
- fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
- fflush (stderr); \
- abort (); \
- } \
- } \
- while (0)
+#include "progname.h"
+#include "macros.h"
+
+#define BASE "test-openat.t"
+
+#include "test-open.h"
+
+static int dfd = AT_FDCWD;
+
+/* Wrapper around openat to test open behavior. */
+static int
+do_open (char const *name, int flags, ...)
+{
+ if (flags & O_CREAT)
+ {
+ mode_t mode = 0;
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ return openat (dfd, name, flags, mode);
+ }
+ return openat (dfd, name, flags);
+}
int
-main (void)
+main (int argc _GL_UNUSED, char *argv[])
{
- /* FIXME - add more tests. For example, share /dev/null and
- trailing slash tests with test-open, and do more checks for
- proper fd handling. */
+ int result;
+
+ set_program_name (argv[0]);
+
+ /* Test behaviour for invalid file descriptors. */
+ {
+ errno = 0;
+ ASSERT (openat (-1, "foo", O_RDONLY) == -1);
+ ASSERT (errno == EBADF);
+ }
+ {
+ close (99);
+ errno = 0;
+ ASSERT (openat (99, "foo", O_RDONLY) == -1);
+ ASSERT (errno == EBADF);
+ }
+
+ /* Basic checks. */
+ result = test_open (do_open, false);
+ dfd = open (".", O_RDONLY);
+ ASSERT (0 <= dfd);
+ ASSERT (test_open (do_open, false) == result);
+ ASSERT (close (dfd) == 0);
/* Check that even when *-safer modules are in use, plain openat can
land in fd 0. Do this test last, since it is destructive to
ASSERT (close (STDIN_FILENO) == 0);
ASSERT (openat (AT_FDCWD, ".", O_RDONLY) == STDIN_FILENO);
{
- int dfd = open (".", O_RDONLY);
+ dfd = open (".", O_RDONLY);
ASSERT (STDIN_FILENO < dfd);
ASSERT (chdir ("..") == 0);
ASSERT (close (STDIN_FILENO) == 0);
ASSERT (openat (dfd, ".", O_RDONLY) == STDIN_FILENO);
ASSERT (close (dfd) == 0);
}
- return 0;
+ return result;
}