From 8078d976d29aa12819e3f5a781c846d67868b0d6 Mon Sep 17 00:00:00 2001 From: dubiousjim Date: Tue, 10 Mar 2020 15:11:27 -0400 Subject: Add Deno.umask (#4290) --- cli/ops/fs.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'cli/ops') 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)); @@ -221,6 +222,43 @@ fn op_seek( } } +#[derive(Deserialize)] +struct UmaskArgs { + mask: Option, +} + +fn op_umask( + _state: &State, + args: Value, + _zero_copy: Option, +) -> Result { + 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, -- cgit v1.2.3