diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/msg.fbs | 7 | ||||
-rw-r--r-- | src/ops.rs | 31 |
2 files changed, 38 insertions, 0 deletions
diff --git a/src/msg.fbs b/src/msg.fbs index 870da1c40..a3c9bcb84 100644 --- a/src/msg.fbs +++ b/src/msg.fbs @@ -13,6 +13,7 @@ union Any { MakeTempDir, MakeTempDirRes, Mkdir, + Chmod, Remove, ReadFile, ReadFileRes, @@ -213,6 +214,12 @@ table Mkdir { // mode specified by https://godoc.org/os#FileMode } +table Chmod { + path: string; + mode: uint; + // mode specified by https://godoc.org/os#FileMode +} + table Remove { path: string; recursive: bool; 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, |