1: #include <stdio.h>
2: #include <fcntl.h>
3: #include <stdlib.h>
4: #include <unistd.h>
5: #include <dirent.h>
6: #include <stdbool.h>
7: #include <string.h>
8:
9:
10: static int
11: do_test (void)
12: {
13: char fname[] = "/tmp/jXXXXXX";
14: int fd = mkstemp (fname);
15: if (fd == -1)
16: {
17: puts ("mkstemp failed");
18: return 1;
19: }
20:
21: write (fd, "hello", 5);
22: close (fd);
23:
24: struct stat64 st;
25: if (stat64 (fname, &st) == -1)
26: {
27: puts ("first stat failed");
28: return 0;
29: }
30:
31:
32: sleep (2);
33:
34: fd = open (fname, O_RDONLY | O_NOATIME);
35: if (fd == -1)
36: {
37: puts ("first open failed");
38: return 1;
39: }
40:
41: char buf[5];
42: read(fd, buf, sizeof (buf));
43: close(fd);
44:
45: struct stat64 st2;
46: if (stat64 (fname, &st2) == -1)
47: {
48: puts ("second stat failed");
49: return 0;
50: }
51:
52: bool no_noatime = false;
53: #ifdef _STATBUF_ST_NSEC
54: if (st.st_atim.tv_sec != st2.st_atim.tv_sec
55: || st.st_atim.tv_nsec != st2.st_atim.tv_nsec)
56: #else
57: if (st.st_atime != st2.st_atime)
58: #endif
59: {
60: puts ("file atime changed");
61: no_noatime = true;
62: }
63:
64: unlink(fname);
65:
66: strcpy(fname, "/tmp/dXXXXXX");
67: char *d = mkdtemp (fname);
68: if (d == NULL)
69: {
70: puts ("mkdtemp failed");
71: return 1;
72: }
73:
74: if (stat64 (d, &st) == -1)
75: {
76: puts ("third stat failed");
77: return 0;
78: }
79: sleep (2);
80:
81: fd = open64 (d, O_RDONLY|O_NDELAY|O_DIRECTORY|O_NOATIME);
82: if (fd == -1)
83: {
84: puts ("second open failed");
85: return 1;
86: }
87: DIR *dir = fdopendir (fd);
88: if (dir == NULL)
89: {
90: puts ("fdopendir failed");
91: return 1;
92: }
93:
94: struct dirent *de;
95: while ((de = readdir (dir)) != NULL)
96: ;
97:
98: closedir (dir);
99:
100: if (stat64 (d, &st2) == -1)
101: {
102: puts ("fourth stat failed");
103: return 0;
104: }
105: #ifdef _STATBUF_ST_NSEC
106: if (!no_noatime
107: && (st.st_atim.tv_sec != st2.st_atim.tv_sec
108: || st.st_atim.tv_nsec != st2.st_atim.tv_nsec))
109: #else
110: if (!no_noatime && st.st_atime != st2.st_atime)
111: #endif
112: {
113: puts ("directory atime changed");
114: return 1;
115: }
116:
117: rmdir(fname);
118:
119: return 0;
120: }
121:
122: #define TIMEOUT 6
123: #define TEST_FUNCTION do_test ()
124: #include "../test-skeleton.c"