diff options
author | Kevin (Kun) "Kassimo" Qian <kevinkassimo@gmail.com> | 2018-10-26 13:01:45 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-10-26 13:01:45 -0700 |
commit | a99aaf5def7d2e223f8303e7a00bd9de4d3efdf6 (patch) | |
tree | 21297f1d3d2ebbc2f61b113996110bb86a7b97a5 /src/ops.rs | |
parent | fe97217fa8483cb2e4f75a63b3a50e9df1c233b7 (diff) |
Add chmod/chmodSync on unix (and fix Cargo.toml) (#1088)
Initial implementation by Srijan Reddy (@srijanreddy98, #672).
Diffstat (limited to 'src/ops.rs')
-rw-r--r-- | src/ops.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/ops.rs b/src/ops.rs index d769b0231..37cbd6826 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -74,6 +74,7 @@ pub fn dispatch( let op_creator: OpCreator = match inner_type { msg::Any::Accept => op_accept, msg::Any::Chdir => op_chdir, + msg::Any::Chmod => op_chmod, msg::Any::Close => op_close, msg::Any::CodeCache => op_code_cache, msg::Any::CodeFetch => op_code_fetch, @@ -572,6 +573,36 @@ fn op_mkdir( }) } +fn op_chmod( + state: Arc<IsolateState>, + base: &msg::Base, + data: &'static mut [u8], +) -> Box<Op> { + assert_eq!(data.len(), 0); + let inner = base.inner_as_chmod().unwrap(); + let _mode = inner.mode(); + let path = String::from(inner.path().unwrap()); + + if !state.flags.allow_write { + return odd_future(permission_denied()); + } + + blocking!(base.sync(), || { + debug!("op_chmod {}", &path); + let path = PathBuf::from(&path); + // Still check file/dir exists on windows + let _metadata = fs::metadata(&path)?; + // Only work in unix + #[cfg(any(unix))] + { + let mut permissions = _metadata.permissions(); + permissions.set_mode(_mode); + fs::set_permissions(&path, permissions)?; + } + Ok(empty_buf()) + }) +} + fn op_open( _state: Arc<IsolateState>, base: &msg::Base, |