diff options
Diffstat (limited to 'src/handlers.rs')
-rw-r--r-- | src/handlers.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/handlers.rs b/src/handlers.rs index 4638288ca..866ca8b3a 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -65,6 +65,13 @@ pub extern "C" fn msg_from_js(d: *const DenoC, buf: deno_buf) { let msg = msg::Exit::init_from_table(base.msg().unwrap()); std::process::exit(msg.code()) } + msg::Any::MakeTempDir => { + let msg = msg::MakeTempDir::init_from_table(base.msg().unwrap()); + let dir = msg.dir(); + let prefix = msg.prefix(); + let suffix = msg.suffix(); + handle_make_temp_dir(d, &mut builder, dir, prefix, suffix) + } msg::Any::ReadFileSync => { // TODO base.msg_as_ReadFileSync(); let msg = msg::ReadFileSync::init_from_table(base.msg().unwrap()); @@ -395,6 +402,43 @@ fn send_timer_ready(d: *const DenoC, timer_id: u32, done: bool) { ); } +fn handle_make_temp_dir( + d: *const DenoC, + builder: &mut FlatBufferBuilder, + dir: Option<&str>, + prefix: Option<&str>, + suffix: Option<&str>, +) -> HandlerResult { + let deno = from_c(d); + if !deno.flags.allow_write { + let err = std::io::Error::new( + std::io::ErrorKind::PermissionDenied, + "allow_write is off.", + ); + return Err(err.into()); + } + // TODO(piscisaureus): use byte vector for paths, not a string. + // See https://github.com/denoland/deno/issues/627. + // We can't assume that paths are always valid utf8 strings. + let path = deno_fs::make_temp_dir(dir.map(Path::new), prefix, suffix)?; + let path_off = builder.create_string(path.to_str().unwrap()); + let msg = msg::MakeTempDirRes::create( + builder, + &msg::MakeTempDirResArgs { + path: Some(path_off), + ..Default::default() + }, + ); + Ok(create_msg( + builder, + &msg::BaseArgs { + msg: Some(flatbuffers::Offset::new(msg.value())), + msg_type: msg::Any::MakeTempDirRes, + ..Default::default() + }, + )) +} + // Prototype https://github.com/denoland/deno/blob/golang/os.go#L171-L184 fn handle_read_file_sync( _d: *const DenoC, |