diff options
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]; |