]>
git.saurik.com Git - apple/xnu.git/blob - tools/tests/darwintests/utimensat.c
13 #include <darwintest.h>
14 #include <darwintest_utils.h>
16 #define FILENAME "utimensat"
18 static const struct timespec tptr
[][2] = {
19 { { 0x12345678, 987654321 }, { 0x15263748, 123456789 }, },
21 { { 0, UTIME_NOW
}, { 0x15263748, 123456789 }, },
22 { { 0x12345678, 987654321 }, { 0, UTIME_NOW
}, },
23 { { 0, UTIME_NOW
}, { 0, UTIME_NOW
}, },
25 { { 0, UTIME_OMIT
}, { 0x15263748, 123456789 }, },
26 { { 0x12345678, 987654321 }, { 0, UTIME_OMIT
}, },
27 { { 0, UTIME_OMIT
}, { 0, UTIME_OMIT
}, },
29 { { 0, UTIME_NOW
}, { 0, UTIME_OMIT
}, },
30 { { 0, UTIME_OMIT
}, { 0, UTIME_NOW
}, },
33 T_DECL(utimensat
, "Try various versions of utimensat")
36 T_ASSERT_POSIX_ZERO(chdir(dt_tmpdir()), NULL
);
39 struct stat pre_st
, post_st
;
42 T_ASSERT_POSIX_SUCCESS((fd
= open(FILENAME
, O_CREAT
|O_RDWR
, 0644)), NULL
);
43 T_ASSERT_POSIX_ZERO(close(fd
), NULL
);
45 for (size_t i
= 0; i
< sizeof(tptr
)/sizeof(tptr
[0]); i
++) {
46 T_LOG("=== {%ld, %ld} {%ld, %ld} ===",
47 tptr
[i
][0].tv_sec
, tptr
[i
][0].tv_nsec
,
48 tptr
[i
][1].tv_sec
, tptr
[i
][1].tv_nsec
);
51 clock_gettime(CLOCK_REALTIME
, &now
);
53 T_ASSERT_POSIX_ZERO(stat(FILENAME
, &pre_st
), NULL
);
54 T_ASSERT_POSIX_ZERO(utimensat(AT_FDCWD
, FILENAME
, tptr
[i
], 0), NULL
);
55 T_ASSERT_POSIX_ZERO(stat(FILENAME
, &post_st
), NULL
);
57 if (tptr
[i
][0].tv_nsec
== UTIME_NOW
) {
58 T_ASSERT_GE(post_st
.st_atimespec
.tv_sec
, now
.tv_sec
, NULL
);
59 } else if (tptr
[i
][0].tv_nsec
== UTIME_OMIT
) {
60 T_ASSERT_EQ(post_st
.st_atimespec
.tv_sec
, pre_st
.st_atimespec
.tv_sec
, NULL
);
61 T_ASSERT_EQ(post_st
.st_atimespec
.tv_nsec
, pre_st
.st_atimespec
.tv_nsec
, NULL
);
63 T_ASSERT_EQ(post_st
.st_atimespec
.tv_sec
, tptr
[i
][0].tv_sec
, NULL
);
64 T_ASSERT_EQ(post_st
.st_atimespec
.tv_nsec
, tptr
[i
][0].tv_nsec
, NULL
);
67 if (tptr
[i
][1].tv_nsec
== UTIME_NOW
) {
68 T_ASSERT_GE(post_st
.st_mtimespec
.tv_sec
, now
.tv_sec
, NULL
);
69 } else if (tptr
[i
][1].tv_nsec
== UTIME_OMIT
) {
70 T_ASSERT_EQ(post_st
.st_mtimespec
.tv_sec
, pre_st
.st_mtimespec
.tv_sec
, NULL
);
71 T_ASSERT_EQ(post_st
.st_mtimespec
.tv_nsec
, pre_st
.st_mtimespec
.tv_nsec
, NULL
);
73 T_ASSERT_EQ(post_st
.st_mtimespec
.tv_sec
, tptr
[i
][1].tv_sec
, NULL
);
74 T_ASSERT_EQ(post_st
.st_mtimespec
.tv_nsec
, tptr
[i
][1].tv_nsec
, NULL
);