summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fs.rs19
-rw-r--r--src/msg.fbs3
-rw-r--r--src/ops.rs12
3 files changed, 30 insertions, 4 deletions
diff --git a/src/fs.rs b/src/fs.rs
index 9748cffab..ff0da95e5 100644
--- a/src/fs.rs
+++ b/src/fs.rs
@@ -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())
})
}