diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/fs.rs | 19 | ||||
-rw-r--r-- | src/msg.fbs | 3 | ||||
-rw-r--r-- | src/ops.rs | 12 |
3 files changed, 30 insertions, 4 deletions
@@ -18,16 +18,29 @@ pub fn write_file<T: AsRef<[u8]>>( data: T, perm: u32, ) -> std::io::Result<()> { - let is_append = perm & (1 << 31) != 0; + write_file_2(filename, data, true, perm, true, false) +} + +pub fn write_file_2<T: AsRef<[u8]>>( + filename: &Path, + data: T, + update_perm: bool, + perm: u32, + is_create: bool, + is_append: bool, +) -> std::io::Result<()> { let mut file = OpenOptions::new() .read(false) .write(true) .append(is_append) .truncate(!is_append) - .create(true) + .create(is_create) .open(filename)?; - set_permissions(&mut file, perm)?; + if update_perm { + set_permissions(&mut file, perm)?; + } + file.write_all(data.as_ref()) } diff --git a/src/msg.fbs b/src/msg.fbs index 06a2d8660..1035d7149 100644 --- a/src/msg.fbs +++ b/src/msg.fbs @@ -295,8 +295,11 @@ table ReadDirRes { table WriteFile { filename: string; data: [ubyte]; + update_perm: bool; perm: uint; // perm specified by https://godoc.org/os#FileMode + is_create: bool; + is_append: bool; } table CopyFile { diff --git a/src/ops.rs b/src/ops.rs index 3826b73ff..4c3d31218 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -1058,7 +1058,10 @@ fn op_write_file( ) -> Box<Op> { let inner = base.inner_as_write_file().unwrap(); let filename = String::from(inner.filename().unwrap()); + let update_perm = inner.update_perm(); let perm = inner.perm(); + let is_create = inner.is_create(); + let is_append = inner.is_append(); if let Err(e) = state.check_write(&filename) { return odd_future(e); @@ -1066,7 +1069,14 @@ fn op_write_file( blocking(base.sync(), move || -> OpResult { debug!("op_write_file {} {}", filename, data.len()); - deno_fs::write_file(Path::new(&filename), data, perm)?; + deno_fs::write_file_2( + Path::new(&filename), + data, + update_perm, + perm, + is_create, + is_append, + )?; Ok(empty_buf()) }) } |