summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKevin (Kun) "Kassimo" Qian <kevinkassimo@gmail.com>2018-09-10 20:40:03 -0700
committerRyan Dahl <ry@tinyclouds.org>2018-09-12 10:24:17 -0400
commit1ffae651655746b95dd40207d91ba7c360b90c40 (patch)
tree4e37fafa7f712fc25b59f67de1faeb9b7190dafa /src
parent7c50c11f40556240a3693662e2cbae6da3090b89 (diff)
Add remove(), removeAll().
and removeSync(), removeAllSync().
Diffstat (limited to 'src')
-rw-r--r--src/handlers.rs28
-rw-r--r--src/main.rs1
-rw-r--r--src/msg.fbs6
3 files changed, 35 insertions, 0 deletions
diff --git a/src/handlers.rs b/src/handlers.rs
index 2ea00391e..18152c682 100644
--- a/src/handlers.rs
+++ b/src/handlers.rs
@@ -12,6 +12,7 @@ use hyper::Client;
use libdeno;
use libdeno::{deno_buf, DenoC};
use msg;
+use remove_dir_all::remove_dir_all;
use std;
use std::fs;
use std::path::Path;
@@ -50,6 +51,7 @@ pub extern "C" fn msg_from_js(d: *const DenoC, buf: deno_buf) {
msg::Any::TimerClear => handle_timer_clear,
msg::Any::MakeTempDir => handle_make_temp_dir,
msg::Any::Mkdir => handle_mkdir,
+ msg::Any::Remove => handle_remove,
msg::Any::ReadFile => handle_read_file,
msg::Any::RenameSync => handle_rename_sync,
msg::Any::SetEnv => handle_set_env,
@@ -435,6 +437,32 @@ fn handle_mkdir(d: *const DenoC, base: &msg::Base) -> Box<Op> {
}()))
}
+fn handle_remove(d: *const DenoC, base: &msg::Base) -> Box<Op> {
+ let msg = base.msg_as_remove().unwrap();
+ let path = msg.path().unwrap();
+ let recursive = msg.recursive();
+ let deno = from_c(d);
+ if !deno.flags.allow_write {
+ return odd_future(permission_denied());
+ }
+ // TODO Use tokio_threadpool.
+ Box::new(futures::future::result(|| -> OpResult {
+ debug!("handle_remove {}", path);
+ let path_ = Path::new(&path);
+ let metadata = fs::metadata(&path_)?;
+ if metadata.is_file() {
+ fs::remove_file(&path_)?;
+ } else {
+ if recursive {
+ remove_dir_all(&path_)?;
+ } else {
+ fs::remove_dir(&path_)?;
+ }
+ }
+ Ok(None)
+ }()))
+}
+
// Prototype https://github.com/denoland/deno/blob/golang/os.go#L171-L184
fn handle_read_file(_d: *const DenoC, base: &msg::Base) -> Box<Op> {
let msg = base.msg_as_read_file().unwrap();
diff --git a/src/main.rs b/src/main.rs
index 68e680c71..12179ac6e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -10,6 +10,7 @@ extern crate url;
#[macro_use]
extern crate log;
extern crate hyper_rustls;
+extern crate remove_dir_all;
extern crate ring;
mod deno_dir;
diff --git a/src/msg.fbs b/src/msg.fbs
index f988c9d0b..4437ad1bc 100644
--- a/src/msg.fbs
+++ b/src/msg.fbs
@@ -15,6 +15,7 @@ union Any {
MakeTempDir,
MakeTempDirRes,
Mkdir,
+ Remove,
ReadFile,
ReadFileRes,
WriteFile,
@@ -173,6 +174,11 @@ table Mkdir {
// mode specified by https://godoc.org/os#FileMode
}
+table Remove {
+ path: string;
+ recursive: bool;
+}
+
table ReadFile {
filename: string;
}