windows nightly can give us filestat info
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -2368,9 +2368,11 @@ version = "0.21.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"cap-std",
|
"cap-std",
|
||||||
|
"cfg-if 1.0.0",
|
||||||
"fs-set-times",
|
"fs-set-times",
|
||||||
"getrandom 0.2.0",
|
"getrandom 0.2.0",
|
||||||
"libc",
|
"libc",
|
||||||
|
"rustc_version",
|
||||||
"system-interface",
|
"system-interface",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ readme = "README.md"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
include = ["src/**/*", "LICENSE", "build.rs"]
|
include = ["src/**/*", "LICENSE", "build.rs"]
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
publish = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0"
|
anyhow = "1.0"
|
||||||
@@ -22,6 +23,10 @@ tracing = "0.1.19"
|
|||||||
system-interface = "0.2"
|
system-interface = "0.2"
|
||||||
cap-std = "0.6"
|
cap-std = "0.6"
|
||||||
fs-set-times = "0.2.1"
|
fs-set-times = "0.2.1"
|
||||||
|
cfg-if = "1"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
rustc_version = "0.2"
|
||||||
|
|
||||||
[badges]
|
[badges]
|
||||||
maintenance = { status = "actively-developed" }
|
maintenance = { status = "actively-developed" }
|
||||||
|
|||||||
@@ -5,4 +5,14 @@ fn main() {
|
|||||||
let wasi = cwd.join("..").join("wasi-common").join("WASI");
|
let wasi = cwd.join("..").join("wasi-common").join("WASI");
|
||||||
println!("cargo:wasi={}", wasi.display());
|
println!("cargo:wasi={}", wasi.display());
|
||||||
println!("cargo:rustc-env=WASI_ROOT={}", wasi.display());
|
println!("cargo:rustc-env=WASI_ROOT={}", wasi.display());
|
||||||
|
|
||||||
|
match rustc_version::version_meta()
|
||||||
|
.expect("query rustc release channel")
|
||||||
|
.channel
|
||||||
|
{
|
||||||
|
rustc_version::Channel::Nightly => {
|
||||||
|
println!("cargo:rustc-cfg=nightly");
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use crate::Error;
|
use crate::Error;
|
||||||
|
use cfg_if::cfg_if;
|
||||||
use fs_set_times::SetTimes;
|
use fs_set_times::SetTimes;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use system_interface::fs::FileIoExt;
|
use system_interface::fs::FileIoExt;
|
||||||
@@ -193,14 +194,26 @@ impl WasiFile for cap_std::fs::File {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
fn get_filestat(&self) -> Result<Filestat, Error> {
|
fn get_filestat(&self) -> Result<Filestat, Error> {
|
||||||
// XXX cap-std does not expose every part of filestat
|
|
||||||
#![allow(unreachable_code, unused_variables)]
|
|
||||||
let meta = self.metadata()?;
|
let meta = self.metadata()?;
|
||||||
|
let (device_id, inode, nlink) = cfg_if! {
|
||||||
|
if #[cfg(unix)] {
|
||||||
|
use std::os::unix::fs::MetadataExt;
|
||||||
|
(meta.dev(), meta.ino(), meta.nlink())
|
||||||
|
} else if #[cfg(windows)] && #[cfg_attr(feature = "nightly")] {
|
||||||
|
use std::os::windows::fs::MetadataExt;
|
||||||
|
( meta.volume_serial_number().unwrap_or(-1),
|
||||||
|
meta.file_index().unwrap_or(-1),
|
||||||
|
meta.number_of_links().unwrap_or(0),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
(-1, -1, 0)
|
||||||
|
}
|
||||||
|
};
|
||||||
Ok(Filestat {
|
Ok(Filestat {
|
||||||
device_id: todo!(),
|
device_id,
|
||||||
inode: todo!(),
|
inode,
|
||||||
filetype: self.get_filetype()?,
|
filetype: self.get_filetype()?,
|
||||||
nlink: todo!(),
|
nlink,
|
||||||
size: meta.len(),
|
size: meta.len(),
|
||||||
atim: meta.accessed()?.into_std(),
|
atim: meta.accessed()?.into_std(),
|
||||||
mtim: meta.modified()?.into_std(),
|
mtim: meta.modified()?.into_std(),
|
||||||
|
|||||||
Reference in New Issue
Block a user