about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorDavid Carlier <devnexen@gmail.com>2025-07-05 05:06:18 +0100
committerDavid Carlier <devnexen@gmail.com>2025-07-05 10:10:32 +0100
commitd87984e12934cc2f1cf64461f2416a82d76383fe (patch)
tree153582b268d8977bf56ce036b74bff9e3a156eca /src
parent23b3be5ada3ca3ba98b99e1145f4e771b71d7fad (diff)
shims::fs adding more fields to FileMetadata
addressing, partially at least, FIXME comment and
targetting unixes, adding device, user and group ids.
Diffstat (limited to 'src')
-rw-r--r--src/tools/miri/src/shims/unix/fs.rs31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/tools/miri/src/shims/unix/fs.rs b/src/tools/miri/src/shims/unix/fs.rs
index 0f7d453b296..073072a883d 100644
--- a/src/tools/miri/src/shims/unix/fs.rs
+++ b/src/tools/miri/src/shims/unix/fs.rs
@@ -128,16 +128,19 @@ trait EvalContextExtPrivate<'tcx>: crate::MiriInterpCxExt<'tcx> {
         let (created_sec, created_nsec) = metadata.created.unwrap_or((0, 0));
         let (modified_sec, modified_nsec) = metadata.modified.unwrap_or((0, 0));
         let mode = metadata.mode.to_uint(this.libc_ty_layout("mode_t").size)?;
+        let dev = metadata.dev;
+        let uid = metadata.uid;
+        let gid = metadata.gid;
 
         let buf = this.deref_pointer_as(buf_op, this.libc_ty_layout("stat"))?;
         this.write_int_fields_named(
             &[
-                ("st_dev", 0),
+                ("st_dev", dev.into()),
                 ("st_mode", mode.try_into().unwrap()),
                 ("st_nlink", 0),
                 ("st_ino", 0),
-                ("st_uid", 0),
-                ("st_gid", 0),
+                ("st_uid", uid.into()),
+                ("st_gid", gid.into()),
                 ("st_rdev", 0),
                 ("st_atime", access_sec.into()),
                 ("st_mtime", modified_sec.into()),
@@ -1544,6 +1547,9 @@ struct FileMetadata {
     created: Option<(u64, u32)>,
     accessed: Option<(u64, u32)>,
     modified: Option<(u64, u32)>,
+    dev: u64,
+    uid: u32,
+    gid: u32,
 }
 
 impl FileMetadata {
@@ -1575,6 +1581,9 @@ impl FileMetadata {
         ecx: &mut MiriInterpCx<'tcx>,
         metadata: Result<std::fs::Metadata, std::io::Error>,
     ) -> InterpResult<'tcx, Result<FileMetadata, IoError>> {
+        #[cfg(unix)]
+        use std::os::unix::fs::MetadataExt;
+
         let metadata = match metadata {
             Ok(metadata) => metadata,
             Err(e) => {
@@ -1601,6 +1610,20 @@ impl FileMetadata {
         let modified = extract_sec_and_nsec(metadata.modified())?;
 
         // FIXME: Provide more fields using platform specific methods.
-        interp_ok(Ok(FileMetadata { mode, size, created, accessed, modified }))
+
+        cfg_select! {
+            unix => {
+                let dev = metadata.dev();
+                let uid = metadata.uid();
+                let gid = metadata.gid();
+            }
+            _ => {
+                let dev = 0;
+                let uid = 0;
+                let gid = 0;
+            }
+        }
+
+        interp_ok(Ok(FileMetadata { mode, size, created, accessed, modified, dev, uid, gid }))
     }
 }