mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 02:03:53 +00:00
Rollup merge of #110093 - beetrees:set-times-32-bit, r=joshtriplett
Add 64-bit `time_t` support on 32-bit glibc Linux to `set_times` Add support to `set_times` for 64-bit `time_t` on 32-bit glibc Linux platforms which have a 32-bit `time_t`. Split from #109773. Tracking issue: #98245
This commit is contained in:
commit
9e863aefba
@ -1193,8 +1193,6 @@ impl File {
|
|||||||
None => Ok(libc::timespec { tv_sec: 0, tv_nsec: libc::UTIME_OMIT as _ }),
|
None => Ok(libc::timespec { tv_sec: 0, tv_nsec: libc::UTIME_OMIT as _ }),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#[cfg(not(any(target_os = "redox", target_os = "espidf", target_os = "horizon")))]
|
|
||||||
let times = [to_timespec(times.accessed)?, to_timespec(times.modified)?];
|
|
||||||
cfg_if::cfg_if! {
|
cfg_if::cfg_if! {
|
||||||
if #[cfg(any(target_os = "redox", target_os = "espidf", target_os = "horizon"))] {
|
if #[cfg(any(target_os = "redox", target_os = "espidf", target_os = "horizon"))] {
|
||||||
// Redox doesn't appear to support `UTIME_OMIT`.
|
// Redox doesn't appear to support `UTIME_OMIT`.
|
||||||
@ -1206,6 +1204,7 @@ impl File {
|
|||||||
"setting file times not supported",
|
"setting file times not supported",
|
||||||
))
|
))
|
||||||
} else if #[cfg(any(target_os = "android", target_os = "macos"))] {
|
} else if #[cfg(any(target_os = "android", target_os = "macos"))] {
|
||||||
|
let times = [to_timespec(times.accessed)?, to_timespec(times.modified)?];
|
||||||
// futimens requires macOS 10.13, and Android API level 19
|
// futimens requires macOS 10.13, and Android API level 19
|
||||||
cvt(unsafe {
|
cvt(unsafe {
|
||||||
weak!(fn futimens(c_int, *const libc::timespec) -> c_int);
|
weak!(fn futimens(c_int, *const libc::timespec) -> c_int);
|
||||||
@ -1232,6 +1231,22 @@ impl File {
|
|||||||
})?;
|
})?;
|
||||||
Ok(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
|
#[cfg(all(target_os = "linux", target_env = "gnu", target_pointer_width = "32", not(target_arch = "riscv32")))]
|
||||||
|
{
|
||||||
|
use crate::sys::{time::__timespec64, weak::weak};
|
||||||
|
|
||||||
|
// Added in glibc 2.34
|
||||||
|
weak!(fn __futimens64(libc::c_int, *const __timespec64) -> libc::c_int);
|
||||||
|
|
||||||
|
if let Some(futimens64) = __futimens64.get() {
|
||||||
|
let to_timespec = |time: Option<SystemTime>| time.map(|time| time.t.to_timespec64())
|
||||||
|
.unwrap_or(__timespec64::new(0, libc::UTIME_OMIT as _));
|
||||||
|
let times = [to_timespec(times.accessed), to_timespec(times.modified)];
|
||||||
|
cvt(unsafe { futimens64(self.as_raw_fd(), times.as_ptr()) })?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let times = [to_timespec(times.accessed)?, to_timespec(times.modified)?];
|
||||||
cvt(unsafe { libc::futimens(self.as_raw_fd(), times.as_ptr()) })?;
|
cvt(unsafe { libc::futimens(self.as_raw_fd(), times.as_ptr()) })?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -166,6 +166,16 @@ impl Timespec {
|
|||||||
}
|
}
|
||||||
self.to_timespec()
|
self.to_timespec()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(all(
|
||||||
|
target_os = "linux",
|
||||||
|
target_env = "gnu",
|
||||||
|
target_pointer_width = "32",
|
||||||
|
not(target_arch = "riscv32")
|
||||||
|
))]
|
||||||
|
pub fn to_timespec64(&self) -> __timespec64 {
|
||||||
|
__timespec64::new(self.tv_sec, self.tv_nsec.0 as _)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<libc::timespec> for Timespec {
|
impl From<libc::timespec> for Timespec {
|
||||||
@ -190,6 +200,18 @@ pub(in crate::sys::unix) struct __timespec64 {
|
|||||||
_padding: i32,
|
_padding: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(all(
|
||||||
|
target_os = "linux",
|
||||||
|
target_env = "gnu",
|
||||||
|
target_pointer_width = "32",
|
||||||
|
not(target_arch = "riscv32")
|
||||||
|
))]
|
||||||
|
impl __timespec64 {
|
||||||
|
pub(in crate::sys::unix) fn new(tv_sec: i64, tv_nsec: i32) -> Self {
|
||||||
|
Self { tv_sec, tv_nsec, _padding: 0 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(all(
|
#[cfg(all(
|
||||||
target_os = "linux",
|
target_os = "linux",
|
||||||
target_env = "gnu",
|
target_env = "gnu",
|
||||||
|
Loading…
Reference in New Issue
Block a user