@@ -128,16 +128,19 @@ trait EvalContextExtPrivate<'tcx>: crate::MiriInterpCxExt<'tcx> {
128
128
let ( created_sec, created_nsec) = metadata. created . unwrap_or ( ( 0 , 0 ) ) ;
129
129
let ( modified_sec, modified_nsec) = metadata. modified . unwrap_or ( ( 0 , 0 ) ) ;
130
130
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 ;
131
134
132
135
let buf = this. deref_pointer_as ( buf_op, this. libc_ty_layout ( "stat" ) ) ?;
133
136
this. write_int_fields_named (
134
137
& [
135
- ( "st_dev" , 0 ) ,
138
+ ( "st_dev" , dev . into ( ) ) ,
136
139
( "st_mode" , mode. try_into ( ) . unwrap ( ) ) ,
137
140
( "st_nlink" , 0 ) ,
138
141
( "st_ino" , 0 ) ,
139
- ( "st_uid" , 0 ) ,
140
- ( "st_gid" , 0 ) ,
142
+ ( "st_uid" , uid . into ( ) ) ,
143
+ ( "st_gid" , gid . into ( ) ) ,
141
144
( "st_rdev" , 0 ) ,
142
145
( "st_atime" , access_sec. into ( ) ) ,
143
146
( "st_mtime" , modified_sec. into ( ) ) ,
@@ -1544,6 +1547,9 @@ struct FileMetadata {
1544
1547
created : Option < ( u64 , u32 ) > ,
1545
1548
accessed : Option < ( u64 , u32 ) > ,
1546
1549
modified : Option < ( u64 , u32 ) > ,
1550
+ dev : u64 ,
1551
+ uid : u32 ,
1552
+ gid : u32 ,
1547
1553
}
1548
1554
1549
1555
impl FileMetadata {
@@ -1575,6 +1581,9 @@ impl FileMetadata {
1575
1581
ecx : & mut MiriInterpCx < ' tcx > ,
1576
1582
metadata : Result < std:: fs:: Metadata , std:: io:: Error > ,
1577
1583
) -> InterpResult < ' tcx , Result < FileMetadata , IoError > > {
1584
+ #[ cfg( unix) ]
1585
+ use std:: os:: unix:: fs:: MetadataExt ;
1586
+
1578
1587
let metadata = match metadata {
1579
1588
Ok ( metadata) => metadata,
1580
1589
Err ( e) => {
@@ -1601,6 +1610,20 @@ impl FileMetadata {
1601
1610
let modified = extract_sec_and_nsec ( metadata. modified ( ) ) ?;
1602
1611
1603
1612
// 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 } ) )
1605
1628
}
1606
1629
}
0 commit comments