diff options
author | ztplz <mysticzt@gmail.com> | 2018-10-01 03:06:20 +0800 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-09-30 15:06:20 -0400 |
commit | 062b22fe569fffc0f52ec36de99e5048e4d42703 (patch) | |
tree | fb436c7163b414ea08a2050f4284fe87362f484c /src | |
parent | f51903f7736e3969ba0003c074d80950aca74f70 (diff) |
Add deno.truncate (#805)
Diffstat (limited to 'src')
-rw-r--r-- | src/handlers.rs | 23 | ||||
-rw-r--r-- | src/msg.fbs | 6 |
2 files changed, 29 insertions, 0 deletions
diff --git a/src/handlers.rs b/src/handlers.rs index b1ef67d94..c615f5669 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -77,6 +77,7 @@ pub fn msg_from_js( msg::Any::Symlink => handle_symlink, msg::Any::SetEnv => handle_set_env, msg::Any::Stat => handle_stat, + msg::Any::Truncate => handle_truncate, msg::Any::WriteFile => handle_write_file, msg::Any::Exit => handle_exit, _ => panic!(format!( @@ -977,3 +978,25 @@ fn handle_read_link( )) }) } + +fn handle_truncate( + state: Arc<IsolateState>, + base: &msg::Base, + data: &'static mut [u8], +) -> Box<Op> { + assert_eq!(data.len(), 0); + + if !state.flags.allow_write { + return odd_future(permission_denied()); + } + + let msg = base.msg_as_truncate().unwrap(); + let filename = String::from(msg.name().unwrap()); + let len = msg.len(); + blocking!(base.sync(), || { + debug!("handle_truncate {} {}", filename, len); + let f = fs::OpenOptions::new().write(true).open(&filename)?; + f.set_len(len as u64)?; + Ok(empty_buf()) + }) +} diff --git a/src/msg.fbs b/src/msg.fbs index 7f42cd637..6b2e920e8 100644 --- a/src/msg.fbs +++ b/src/msg.fbs @@ -27,6 +27,7 @@ union Any { Stat, StatRes, SetEnv, + Truncate, Open, OpenRes, Read, @@ -247,6 +248,11 @@ table StatRes { has_mode: bool; // false on windows } +table Truncate { + name: string; + len: uint; +} + table WriteFileSync { filename: string; data: [ubyte]; |