summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKevin (Kun) "Kassimo" Qian <kevinkassimo@gmail.com>2018-10-26 13:01:45 -0700
committerRyan Dahl <ry@tinyclouds.org>2018-10-26 13:01:45 -0700
commita99aaf5def7d2e223f8303e7a00bd9de4d3efdf6 (patch)
tree21297f1d3d2ebbc2f61b113996110bb86a7b97a5 /src
parentfe97217fa8483cb2e4f75a63b3a50e9df1c233b7 (diff)
Add chmod/chmodSync on unix (and fix Cargo.toml) (#1088)
Initial implementation by Srijan Reddy (@srijanreddy98, #672).
Diffstat (limited to 'src')
-rw-r--r--src/msg.fbs7
-rw-r--r--src/ops.rs31
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,