@@ -349,6 +349,8 @@ pub struct FilePermissions {
349349pub  struct  FileTimes  { 
350350    accessed :  Option < SystemTime > , 
351351    modified :  Option < SystemTime > , 
352+     #[ cfg( any( target_os = "macos" ,  target_os = "ios" ,  target_os = "watchos" ) ) ]  
353+     created :  Option < SystemTime > , 
352354} 
353355
354356#[ derive( Copy ,  Clone ,  Eq ,  Debug ) ]  
@@ -591,6 +593,11 @@ impl FileTimes {
591593    pub  fn  set_modified ( & mut  self ,  t :  SystemTime )  { 
592594        self . modified  = Some ( t) ; 
593595    } 
596+ 
597+     #[ cfg( any( target_os = "macos" ,  target_os = "ios" ,  target_os = "watchos" ) ) ]  
598+     pub  fn  set_created ( & mut  self ,  t :  SystemTime )  { 
599+         self . created  = Some ( t) ; 
600+     } 
594601} 
595602
596603impl  FileType  { 
@@ -1215,26 +1222,41 @@ impl File {
12151222                    io:: ErrorKind :: Unsupported , 
12161223                    "setting file times not supported" , 
12171224                ) ) 
1218-             }  else if  #[ cfg( any( target_os = "android" ,  target_os = "macos" ) ) ]  { 
1225+             }  else if  #[ cfg( any( target_os = "macos" ,  target_os = "ios" ,  target_os = "watchos" ) ) ]  { 
1226+                 let  mut  buf = [ mem:: MaybeUninit :: <libc:: timespec>:: uninit( ) ;  3 ] ; 
1227+                 let  mut  num_times = 0 ; 
1228+                 let  mut  attrlist:  libc:: attrlist = unsafe  {  mem:: zeroed( )  } ; 
1229+                 attrlist. bitmapcount = libc:: ATTR_BIT_MAP_COUNT ; 
1230+                 if  times. created. is_some( )  { 
1231+                     buf[ num_times] . write( to_timespec( times. created) ?) ; 
1232+                     num_times += 1 ; 
1233+                     attrlist. commonattr |= libc:: ATTR_CMN_CRTIME ; 
1234+                 } 
1235+                 if  times. modified. is_some( )  { 
1236+                     buf[ num_times] . write( to_timespec( times. modified) ?) ; 
1237+                     num_times += 1 ; 
1238+                     attrlist. commonattr |= libc:: ATTR_CMN_MODTIME ; 
1239+                 } 
1240+                 if  times. accessed. is_some( )  { 
1241+                     buf[ num_times] . write( to_timespec( times. accessed) ?) ; 
1242+                     num_times += 1 ; 
1243+                     attrlist. commonattr |= libc:: ATTR_CMN_ACCTIME ; 
1244+                 } 
1245+                 cvt( unsafe  {  libc:: fsetattrlist( 
1246+                     self . as_raw_fd( ) , 
1247+                     ( & attrlist as  * const  libc:: attrlist) . cast:: <libc:: c_void>( ) . cast_mut( ) , 
1248+                     buf. as_ptr( ) . cast:: <libc:: c_void>( ) . cast_mut( ) , 
1249+                     num_times *  mem:: size_of:: <libc:: timespec>( ) , 
1250+                     0 
1251+                 )  } ) ?; 
1252+                 Ok ( ( ) ) 
1253+             }  else if  #[ cfg( target_os = "android" ) ]  { 
12191254                let  times = [ to_timespec( times. accessed) ?,  to_timespec( times. modified) ?] ; 
1220-                 // futimens requires macOS 10.13, and  Android API level 19 
1255+                 // futimens requires Android API level 19 
12211256                cvt( unsafe  { 
12221257                    weak!( fn  futimens( c_int,  * const  libc:: timespec)  -> c_int) ; 
12231258                    match  futimens. get( )  { 
12241259                        Some ( futimens)  => futimens( self . as_raw_fd( ) ,  times. as_ptr( ) ) , 
1225-                         #[ cfg( target_os = "macos" ) ] 
1226-                         None  => { 
1227-                             fn  ts_to_tv( ts:  & libc:: timespec)  -> libc:: timeval { 
1228-                                 libc:: timeval { 
1229-                                     tv_sec:  ts. tv_sec, 
1230-                                     tv_usec:  ( ts. tv_nsec / 1000 )  as  _
1231-                                 } 
1232-                             } 
1233-                             let  timevals = [ ts_to_tv( & times[ 0 ] ) ,  ts_to_tv( & times[ 1 ] ) ] ; 
1234-                             libc:: futimes( self . as_raw_fd( ) ,  timevals. as_ptr( ) ) 
1235-                         } 
1236-                         // futimes requires even newer Android. 
1237-                         #[ cfg( target_os = "android" ) ] 
12381260                        None  => return  Err ( io:: const_io_error!( 
12391261                            io:: ErrorKind :: Unsupported , 
12401262                            "setting file times requires Android API level >= 19" , 
0 commit comments