@@ -1192,8 +1192,6 @@ impl File {
11921192 None => Ok ( libc:: timespec { tv_sec : 0 , tv_nsec : libc:: UTIME_OMIT as _ } ) ,
11931193 }
11941194 } ;
1195- #[ cfg( not( any( target_os = "redox" , target_os = "espidf" , target_os = "horizon" ) ) ) ]
1196- let times = [ to_timespec ( times. accessed ) ?, to_timespec ( times. modified ) ?] ;
11971195 cfg_if:: cfg_if! {
11981196 if #[ cfg( any( target_os = "redox" , target_os = "espidf" , target_os = "horizon" ) ) ] {
11991197 // Redox doesn't appear to support `UTIME_OMIT`.
@@ -1205,6 +1203,7 @@ impl File {
12051203 "setting file times not supported" ,
12061204 ) )
12071205 } else if #[ cfg( any( target_os = "android" , target_os = "macos" ) ) ] {
1206+ let times = [ to_timespec( times. accessed) ?, to_timespec( times. modified) ?] ;
12081207 // futimens requires macOS 10.13, and Android API level 19
12091208 cvt( unsafe {
12101209 weak!( fn futimens( c_int, * const libc:: timespec) -> c_int) ;
@@ -1231,6 +1230,22 @@ impl File {
12311230 } ) ?;
12321231 Ok ( ( ) )
12331232 } else {
1233+ #[ cfg( all( target_os = "linux" , target_env = "gnu" , target_pointer_width = "32" , not( target_arch = "riscv32" ) ) ) ]
1234+ {
1235+ use crate :: sys:: { time:: __timespec64, weak:: weak} ;
1236+
1237+ // Added in glibc 2.34
1238+ weak!( fn __futimens64( libc:: c_int, * const __timespec64) -> libc:: c_int) ;
1239+
1240+ if let Some ( futimens64) = __futimens64. get( ) {
1241+ let to_timespec = |time: Option <SystemTime >| time. map( |time| time. t. to_timespec64( ) )
1242+ . unwrap_or( __timespec64:: new( 0 , libc:: UTIME_OMIT as _) ) ;
1243+ let times = [ to_timespec( times. accessed) , to_timespec( times. modified) ] ;
1244+ cvt( unsafe { futimens64( self . as_raw_fd( ) , times. as_ptr( ) ) } ) ?;
1245+ return Ok ( ( ) ) ;
1246+ }
1247+ }
1248+ let times = [ to_timespec( times. accessed) ?, to_timespec( times. modified) ?] ;
12341249 cvt( unsafe { libc:: futimens( self . as_raw_fd( ) , times. as_ptr( ) ) } ) ?;
12351250 Ok ( ( ) )
12361251 }
0 commit comments