@@ -128,16 +128,19 @@ trait EvalContextExtPrivate<'tcx>: crate::MiriInterpCxExt<'tcx> {
128128 let ( created_sec, created_nsec) = metadata. created . unwrap_or ( ( 0 , 0 ) ) ;
129129 let ( modified_sec, modified_nsec) = metadata. modified . unwrap_or ( ( 0 , 0 ) ) ;
130130 let mode = metadata. mode . to_uint ( this. libc_ty_layout ( "mode_t" ) . size ) ?;
131+ let dev = metadata. dev ;
132+ let uid = metadata. uid ;
133+ let gid = metadata. gid ;
131134
132135 let buf = this. deref_pointer_as ( buf_op, this. libc_ty_layout ( "stat" ) ) ?;
133136 this. write_int_fields_named (
134137 & [
135- ( "st_dev" , 0 ) ,
138+ ( "st_dev" , dev . into ( ) ) ,
136139 ( "st_mode" , mode. try_into ( ) . unwrap ( ) ) ,
137140 ( "st_nlink" , 0 ) ,
138141 ( "st_ino" , 0 ) ,
139- ( "st_uid" , 0 ) ,
140- ( "st_gid" , 0 ) ,
142+ ( "st_uid" , uid . into ( ) ) ,
143+ ( "st_gid" , gid . into ( ) ) ,
141144 ( "st_rdev" , 0 ) ,
142145 ( "st_atime" , access_sec. into ( ) ) ,
143146 ( "st_mtime" , modified_sec. into ( ) ) ,
@@ -1544,6 +1547,9 @@ struct FileMetadata {
15441547 created : Option < ( u64 , u32 ) > ,
15451548 accessed : Option < ( u64 , u32 ) > ,
15461549 modified : Option < ( u64 , u32 ) > ,
1550+ dev : u64 ,
1551+ uid : u32 ,
1552+ gid : u32 ,
15471553}
15481554
15491555impl FileMetadata {
@@ -1575,6 +1581,9 @@ impl FileMetadata {
15751581 ecx : & mut MiriInterpCx < ' tcx > ,
15761582 metadata : Result < std:: fs:: Metadata , std:: io:: Error > ,
15771583 ) -> InterpResult < ' tcx , Result < FileMetadata , IoError > > {
1584+ #[ cfg( unix) ]
1585+ use std:: os:: unix:: fs:: MetadataExt ;
1586+
15781587 let metadata = match metadata {
15791588 Ok ( metadata) => metadata,
15801589 Err ( e) => {
@@ -1601,6 +1610,20 @@ impl FileMetadata {
16011610 let modified = extract_sec_and_nsec ( metadata. modified ( ) ) ?;
16021611
16031612 // FIXME: Provide more fields using platform specific methods.
1604- interp_ok ( Ok ( FileMetadata { mode, size, created, accessed, modified } ) )
1613+
1614+ cfg_select ! {
1615+ unix => {
1616+ let dev = metadata. dev( ) ;
1617+ let uid = metadata. uid( ) ;
1618+ let gid = metadata. gid( ) ;
1619+ }
1620+ _ => {
1621+ let dev = 0 ;
1622+ let uid = 0 ;
1623+ let gid = 0 ;
1624+ }
1625+ }
1626+
1627+ interp_ok ( Ok ( FileMetadata { mode, size, created, accessed, modified, dev, uid, gid } ) )
16051628 }
16061629}
0 commit comments