diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:41 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:41 +0000 |
commit | 4f9fe856a25ab29345b90e7725509e9ee38a37be (patch) | |
tree | e4ffd8a9374cae7b21f7cbfb352927e0e074aff6 /vendor/filetime/src | |
parent | Adding upstream version 1.68.2+dfsg1. (diff) | |
download | rustc-upstream/1.69.0+dfsg1.tar.xz rustc-upstream/1.69.0+dfsg1.zip |
Adding upstream version 1.69.0+dfsg1.upstream/1.69.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/filetime/src')
-rw-r--r-- | vendor/filetime/src/unix/linux.rs | 33 | ||||
-rw-r--r-- | vendor/filetime/src/unix/mod.rs | 15 |
2 files changed, 31 insertions, 17 deletions
diff --git a/vendor/filetime/src/unix/linux.rs b/vendor/filetime/src/unix/linux.rs index c803e0217..255fcfb61 100644 --- a/vendor/filetime/src/unix/linux.rs +++ b/vendor/filetime/src/unix/linux.rs @@ -34,6 +34,11 @@ pub fn set_file_handle_times( static INVALID: AtomicBool = AtomicBool::new(false); if !INVALID.load(SeqCst) { let times = [super::to_timespec(&atime), super::to_timespec(&mtime)]; + + // We normally use a syscall because the `utimensat` function is documented + // as not accepting a file descriptor in the first argument (even though, on + // Linux, the syscall itself can accept a file descriptor there). + #[cfg(not(target_env = "musl"))] let rc = unsafe { libc::syscall( libc::SYS_utimensat, @@ -43,6 +48,24 @@ pub fn set_file_handle_times( 0, ) }; + // However, on musl, we call the musl libc function instead. This is because + // on newer musl versions starting with musl 1.2, `timespec` is always a 64-bit + // value even on 32-bit targets. As a result, musl internally converts their + // `timespec` values to the correct ABI before invoking the syscall. Since we + // use `timespec` from the libc crate, it matches musl's definition and not + // the Linux kernel's version (for some platforms) so we must use musl's + // `utimensat` function to properly convert the value. musl's `utimensat` + // function allows file descriptors in the path argument so this is fine. + #[cfg(target_env = "musl")] + let rc = unsafe { + libc::utimensat( + f.as_raw_fd(), + ptr::null::<libc::c_char>(), + times.as_ptr(), + 0, + ) + }; + if rc == 0 { return Ok(()); } @@ -78,15 +101,7 @@ fn set_times( if !INVALID.load(SeqCst) { let p = CString::new(p.as_os_str().as_bytes())?; let times = [super::to_timespec(&atime), super::to_timespec(&mtime)]; - let rc = unsafe { - libc::syscall( - libc::SYS_utimensat, - libc::AT_FDCWD, - p.as_ptr(), - times.as_ptr(), - flags, - ) - }; + let rc = unsafe { libc::utimensat(libc::AT_FDCWD, p.as_ptr(), times.as_ptr(), flags) }; if rc == 0 { return Ok(()); } diff --git a/vendor/filetime/src/unix/mod.rs b/vendor/filetime/src/unix/mod.rs index 8b7788837..df62de429 100644 --- a/vendor/filetime/src/unix/mod.rs +++ b/vendor/filetime/src/unix/mod.rs @@ -58,17 +58,16 @@ fn to_timespec(ft: &Option<FileTime>) -> timespec { } } + let mut ts: timespec = unsafe { std::mem::zeroed() }; if let &Some(ft) = ft { - timespec { - tv_sec: ft.seconds() as time_t, - tv_nsec: ft.nanoseconds() as _, - } + ts.tv_sec = ft.seconds() as time_t; + ts.tv_nsec = ft.nanoseconds() as _; } else { - timespec { - tv_sec: 0, - tv_nsec: UTIME_OMIT as _, - } + ts.tv_sec = 0; + ts.tv_nsec = UTIME_OMIT as _; } + + ts } pub fn from_last_modification_time(meta: &fs::Metadata) -> FileTime { |