diff options
author | Ulrich Drepper <drepper@redhat.com> | 2005-09-28 21:19:53 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2005-09-28 21:19:53 +0000 |
commit | 1812d50bc9ad034c8406f5e3de83b5a6c668f3a9 (patch) | |
tree | 54c88f0ffa5e7ccdece3941a630f5c19f59d3f70 /dirent/tst-fdopendir.c | |
parent | a898514259e9fef06feddbe74df4d11fb94baf66 (diff) | |
download | glibc-1812d50bc9ad034c8406f5e3de83b5a6c668f3a9.tar.gz glibc-1812d50bc9ad034c8406f5e3de83b5a6c668f3a9.tar.xz glibc-1812d50bc9ad034c8406f5e3de83b5a6c668f3a9.zip |
* dirent/dirent.h: Declare fdopendir.
* dirent/Versions: Export fdopendir for GLIBC_2.4. * dirent/Makefile (routines): Add fdopendir. (tests): Add tst-fdopendir. * dirent/tst-fdopendir.c: New file. * include/dirent.h: Declare __alloc_dir. * sysdeps/generic/fdopendir.c: New file. * sysdeps/unix/fdopendir.c: New file. * sysdeps/unix/opendir.c: Split off back part of opendir into new function __alloc_dir.
Diffstat (limited to 'dirent/tst-fdopendir.c')
-rw-r--r-- | dirent/tst-fdopendir.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/dirent/tst-fdopendir.c b/dirent/tst-fdopendir.c new file mode 100644 index 0000000000..3cf315d85c --- /dev/null +++ b/dirent/tst-fdopendir.c @@ -0,0 +1,124 @@ +#include <stdio.h> +#include <fcntl.h> +#include <stdlib.h> +#include <unistd.h> +#include <dirent.h> +#include <stdbool.h> +#include <string.h> + + +static int +do_test (void) +{ + char fname[] = "/tmp/jXXXXXX"; + int fd = mkstemp (fname); + if (fd == -1) + { + puts ("mkstemp failed"); + return 1; + } + + write (fd, "hello", 5); + close (fd); + + struct stat64 st; + if (stat64 (fname, &st) == -1) + { + puts ("first stat failed"); + return 0; + } + + /* Make sure there is enough time between the creation and the access. */ + sleep (2); + + fd = open (fname, O_RDONLY | O_NOATIME); + if (fd == -1) + { + puts ("first open failed"); + return 1; + } + + char buf[5]; + read(fd, buf, sizeof (buf)); + close(fd); + + struct stat64 st2; + if (stat64 (fname, &st2) == -1) + { + puts ("second stat failed"); + return 0; + } + + bool no_noatime = false; +#ifdef _STATBUF_ST_NSEC + if (st.st_atim.tv_sec != st2.st_atim.tv_sec + || st.st_atim.tv_nsec != st2.st_atim.tv_nsec) +#else + if (st.st_atime != st2.st_atime) +#endif + { + puts ("file atime changed"); + no_noatime = true; + } + + unlink(fname); + + strcpy(fname, "/tmp/dXXXXXX"); + char *d = mkdtemp (fname); + if (d == NULL) + { + puts ("mkdtemp failed"); + return 1; + } + + if (stat64 (d, &st) == -1) + { + puts ("third stat failed"); + return 0; + } + sleep (2); + + fd = open64 (d, O_RDONLY|O_NDELAY|O_DIRECTORY|O_NOATIME); + if (fd == -1) + { + puts ("second open failed"); + return 1; + } + DIR *dir = fdopendir (fd); + if (dir == NULL) + { + puts ("fdopendir failed"); + return 1; + } + + struct dirent *de; + while ((de = readdir (dir)) != NULL) + ; + + closedir (dir); + + if (stat64 (d, &st2) == -1) + { + puts ("fourth stat failed"); + return 0; + } +#ifdef _STATBUF_ST_NSEC + if (!no_noatime + && (st.st_atim.tv_sec != st2.st_atim.tv_sec + || st.st_atim.tv_nsec != st2.st_atim.tv_nsec)) +#else + if (!no_noatime && st.st_atime != st2.st_atime) +#endif + { + puts ("directory atime changed"); + return 1; + } + + rmdir(fname); + + return 0; +} + +#define TIMEOUT 6 +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |