1 #[cfg(not(any(target_os = "redox", target_os = "wasi")))]
2 #[test]
test_utimensat()3 fn test_utimensat() {
4 use rustix::fs::{cwd, openat, statat, utimensat, AtFlags, Mode, OFlags, Timespec, Timestamps};
5
6 let tmp = tempfile::tempdir().unwrap();
7 let dir = openat(
8 cwd(),
9 tmp.path(),
10 OFlags::RDONLY | OFlags::CLOEXEC,
11 Mode::empty(),
12 )
13 .unwrap();
14
15 let _ = openat(
16 &dir,
17 "foo",
18 OFlags::CREATE | OFlags::WRONLY | OFlags::CLOEXEC,
19 Mode::empty(),
20 )
21 .unwrap();
22
23 let times = Timestamps {
24 last_access: Timespec {
25 tv_sec: 44000,
26 tv_nsec: 45000,
27 },
28 last_modification: Timespec {
29 tv_sec: 46000,
30 tv_nsec: 47000,
31 },
32 };
33 utimensat(&dir, "foo", ×, AtFlags::empty()).unwrap();
34
35 let after = statat(&dir, "foo", AtFlags::empty()).unwrap();
36
37 assert_eq!(times.last_modification.tv_sec as u64, after.st_mtime as u64);
38 #[cfg(not(target_os = "netbsd"))]
39 assert_eq!(
40 times.last_modification.tv_nsec as u64,
41 after.st_mtime_nsec as u64
42 );
43 #[cfg(target_os = "netbsd")]
44 assert_eq!(
45 times.last_modification.tv_nsec as u64,
46 after.st_mtimensec as u64
47 );
48 assert!(times.last_access.tv_sec as u64 >= after.st_atime as u64);
49 #[cfg(not(target_os = "netbsd"))]
50 assert!(
51 times.last_access.tv_sec as u64 > after.st_atime as u64
52 || times.last_access.tv_nsec as u64 >= after.st_atime_nsec as u64
53 );
54 #[cfg(target_os = "netbsd")]
55 assert!(
56 times.last_access.tv_sec as u64 > after.st_atime as u64
57 || times.last_access.tv_nsec as u64 >= after.st_atimensec as u64
58 );
59 }
60
61 #[cfg(not(any(target_os = "redox", target_os = "wasi")))]
62 #[test]
test_utimensat_noent()63 fn test_utimensat_noent() {
64 use rustix::fs::{cwd, openat, utimensat, AtFlags, Mode, OFlags, Timespec, Timestamps};
65
66 let tmp = tempfile::tempdir().unwrap();
67 let dir = openat(
68 cwd(),
69 tmp.path(),
70 OFlags::RDONLY | OFlags::CLOEXEC,
71 Mode::empty(),
72 )
73 .unwrap();
74
75 let times = Timestamps {
76 last_access: Timespec {
77 tv_sec: 44000,
78 tv_nsec: 45000,
79 },
80 last_modification: Timespec {
81 tv_sec: 46000,
82 tv_nsec: 47000,
83 },
84 };
85 assert_eq!(
86 utimensat(&dir, "foo", ×, AtFlags::empty()).unwrap_err(),
87 rustix::io::Errno::NOENT
88 );
89 }
90
91 #[cfg(not(any(target_os = "redox", target_os = "wasi")))]
92 #[test]
test_utimensat_notdir()93 fn test_utimensat_notdir() {
94 use rustix::fs::{cwd, openat, utimensat, AtFlags, Mode, OFlags, Timespec, Timestamps};
95
96 let tmp = tempfile::tempdir().unwrap();
97 let dir = openat(
98 cwd(),
99 tmp.path(),
100 OFlags::RDONLY | OFlags::CLOEXEC,
101 Mode::empty(),
102 )
103 .unwrap();
104
105 let foo = openat(
106 &dir,
107 "foo",
108 OFlags::CREATE | OFlags::WRONLY | OFlags::CLOEXEC,
109 Mode::empty(),
110 )
111 .unwrap();
112
113 let times = Timestamps {
114 last_access: Timespec {
115 tv_sec: 44000,
116 tv_nsec: 45000,
117 },
118 last_modification: Timespec {
119 tv_sec: 46000,
120 tv_nsec: 47000,
121 },
122 };
123 assert_eq!(
124 utimensat(&foo, "bar", ×, AtFlags::empty()).unwrap_err(),
125 rustix::io::Errno::NOTDIR
126 );
127 }
128