X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=inline;f=tests%2Ftest-fchdir.c;h=2e6b06760ff2cba012495ed6f3f678e1aafe78b7;hb=e677143bef643fc74c206d19a7f8767745ba8774;hp=53d6631ccd4af694117a139a1e7860e59422b4ff;hpb=82381b9e5b37125305709d412d8322b35e5c4796;p=gnulib.git diff --git a/tests/test-fchdir.c b/tests/test-fchdir.c index 53d6631cc..2e6b06760 100644 --- a/tests/test-fchdir.c +++ b/tests/test-fchdir.c @@ -1,5 +1,5 @@ /* Test changing to a directory named by a file descriptor. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009-2011 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 @@ -20,35 +20,43 @@ #include +#include "signature.h" +SIGNATURE_CHECK (fchdir, int, (int)); + #include #include -#include #include #include -#define ASSERT(expr) \ - do \ - { \ - if (!(expr)) \ - { \ - fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ - fflush (stderr); \ - abort (); \ - } \ - } \ - while (0) +#include "cloexec.h" +#include "macros.h" int main (void) { - char *cwd = getcwd (NULL, 0); - int fd = open (".", O_RDONLY); + char *cwd; + int fd; int i; + cwd = getcwd (NULL, 0); ASSERT (cwd); + + fd = open (".", O_RDONLY); ASSERT (0 <= fd); - /* Check for failure cases. */ + /* Test behaviour for invalid file descriptors. */ + { + errno = 0; + ASSERT (fchdir (-1) == -1); + ASSERT (errno == EBADF); + } + { + errno = 0; + ASSERT (fchdir (99) == -1); + ASSERT (errno == EBADF); + } + + /* Check for other failure cases. */ { int bad_fd = open ("/dev/null", O_RDONLY); ASSERT (0 <= bad_fd); @@ -56,9 +64,6 @@ main (void) ASSERT (fchdir (bad_fd) == -1); ASSERT (errno == ENOTDIR); ASSERT (close (bad_fd) == 0); - errno = 0; - ASSERT (fchdir (-1) == -1); - ASSERT (errno == EBADF); } /* Repeat test twice, once in '.' and once in '..'. */ @@ -67,23 +72,36 @@ main (void) ASSERT (chdir (".." + 1 - i) == 0); ASSERT (fchdir (fd) == 0); { - size_t len = strlen (cwd) + 1; - char *new_dir = malloc (len); - ASSERT (new_dir); - ASSERT (getcwd (new_dir, len) == new_dir); - ASSERT (strcmp (cwd, new_dir) == 0); - free (new_dir); + size_t len = strlen (cwd) + 1; + char *new_dir = malloc (len); + ASSERT (new_dir); + ASSERT (getcwd (new_dir, len) == new_dir); + ASSERT (strcmp (cwd, new_dir) == 0); + free (new_dir); } /* For second iteration, use a cloned fd, to ensure that dup - remembers whether an fd was associated with a directory. */ + remembers whether an fd was associated with a directory. */ if (!i) - { - int new_fd = dup (fd); - ASSERT (0 <= new_fd); - ASSERT (close (fd) == 0); - fd = new_fd; - } + { + int new_fd = dup (fd); + ASSERT (0 <= new_fd); + ASSERT (close (fd) == 0); + ASSERT (dup2 (new_fd, fd) == fd); + ASSERT (close (new_fd) == 0); + ASSERT (dup_cloexec (fd) == new_fd); + ASSERT (dup2 (new_fd, fd) == fd); + ASSERT (close (new_fd) == 0); + ASSERT (fcntl (fd, F_DUPFD_CLOEXEC, new_fd) == new_fd); + ASSERT (close (fd) == 0); + ASSERT (fcntl (new_fd, F_DUPFD, fd) == fd); + ASSERT (close (new_fd) == 0); +#if GNULIB_TEST_DUP3 + ASSERT (dup3 (fd, new_fd, 0) == new_fd); + ASSERT (dup3 (new_fd, fd, 0) == fd); + ASSERT (close (new_fd) == 0); +#endif + } } free (cwd);