Skip to content

Commit fe41b77

Browse files
committed
shims::fs adding more fields to FileMetadata
addressing, partially at least, FIXME comment and targetting unixes, adding device, user and group ids.
1 parent d9afd0f commit fe41b77

File tree

1 file changed

+27
-4
lines changed

1 file changed

+27
-4
lines changed

src/shims/unix/fs.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

15491555
impl 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

Comments
 (0)