From 062b22fe569fffc0f52ec36de99e5048e4d42703 Mon Sep 17 00:00:00 2001 From: ztplz Date: Mon, 1 Oct 2018 03:06:20 +0800 Subject: Add deno.truncate (#805) --- src/handlers.rs | 23 +++++++++++++++++++++++ src/msg.fbs | 6 ++++++ 2 files changed, 29 insertions(+) (limited to 'src') 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, + base: &msg::Base, + data: &'static mut [u8], +) -> Box { + 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]; -- cgit v1.2.3