diff options
Diffstat (limited to 'cli/ops/fs.rs')
-rw-r--r-- | cli/ops/fs.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/cli/ops/fs.rs b/cli/ops/fs.rs index ad1283c12..df5ad7bef 100644 --- a/cli/ops/fs.rs +++ b/cli/ops/fs.rs @@ -23,6 +23,7 @@ use std::os::unix::fs::{MetadataExt, PermissionsExt}; pub fn init(i: &mut Isolate, s: &State) { i.register_op("op_open", s.stateful_json_op(op_open)); i.register_op("op_seek", s.stateful_json_op(op_seek)); + i.register_op("op_umask", s.stateful_json_op(op_umask)); i.register_op("op_chdir", s.stateful_json_op(op_chdir)); i.register_op("op_mkdir", s.stateful_json_op(op_mkdir)); i.register_op("op_chmod", s.stateful_json_op(op_chmod)); @@ -222,6 +223,43 @@ fn op_seek( } #[derive(Deserialize)] +struct UmaskArgs { + mask: Option<u32>, +} + +fn op_umask( + _state: &State, + args: Value, + _zero_copy: Option<ZeroCopyBuf>, +) -> Result<JsonOp, OpError> { + let args: UmaskArgs = serde_json::from_value(args)?; + // TODO implement umask for Windows + // see https://github.com/nodejs/node/blob/master/src/node_process_methods.cc + // and https://docs.microsoft.com/fr-fr/cpp/c-runtime-library/reference/umask?view=vs-2019 + #[cfg(not(unix))] + { + let _ = args.mask; // avoid unused warning. + return Err(OpError::not_implemented()); + } + #[cfg(unix)] + { + use nix::sys::stat::mode_t; + use nix::sys::stat::umask; + use nix::sys::stat::Mode; + let r = if let Some(mask) = args.mask { + // If mask provided, return previous. + umask(Mode::from_bits_truncate(mask as mode_t)) + } else { + // If no mask provided, we query the current. Requires two syscalls. + let prev = umask(Mode::from_bits_truncate(0o777)); + let _ = umask(prev); + prev + }; + Ok(JsonOp::Sync(json!(r.bits() as u32))) + } +} + +#[derive(Deserialize)] struct ChdirArgs { directory: String, } |