summaryrefslogtreecommitdiff
path: root/src/handlers.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/handlers.rs')
-rw-r--r--src/handlers.rs71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/handlers.rs b/src/handlers.rs
index 8d321c46f..407ecf5c8 100644
--- a/src/handlers.rs
+++ b/src/handlers.rs
@@ -45,6 +45,7 @@ pub extern "C" fn msg_from_js(d: *const DenoC, buf: deno_buf) {
let output_code = msg.output_code().unwrap();
handle_code_cache(d, &mut builder, filename, source_code, output_code)
}
+ msg::Any::Environ => handle_env(d, &mut builder),
msg::Any::FetchReq => {
// TODO base.msg_as_FetchReq();
let msg = msg::FetchReq::init_from_table(base.msg().unwrap());
@@ -79,6 +80,13 @@ pub extern "C" fn msg_from_js(d: *const DenoC, buf: deno_buf) {
let filename = msg.filename().unwrap();
handle_read_file_sync(d, &mut builder, filename)
}
+ msg::Any::SetEnv => {
+ // TODO base.msg_as_SetEnv();
+ let msg = msg::SetEnv::init_from_table(base.msg().unwrap());
+ let key = msg.key().unwrap();
+ let value = msg.value().unwrap();
+ handle_set_env(d, &mut builder, key, value)
+ }
msg::Any::StatSync => {
// TODO base.msg_as_StatSync();
let msg = msg::StatSync::init_from_table(base.msg().unwrap());
@@ -244,6 +252,69 @@ fn handle_code_cache(
Ok(null_buf()) // null response indicates success.
}
+fn handle_set_env(
+ d: *const DenoC,
+ _builder: &mut FlatBufferBuilder,
+ key: &str,
+ value: &str,
+) -> HandlerResult {
+ let deno = from_c(d);
+ if !deno.flags.allow_env {
+ let err = std::io::Error::new(
+ std::io::ErrorKind::PermissionDenied,
+ "allow_env is off.",
+ );
+ return Err(err.into());
+ }
+
+ std::env::set_var(key, value);
+ Ok(null_buf())
+}
+
+fn handle_env(
+ d: *const DenoC,
+ builder: &mut FlatBufferBuilder,
+) -> HandlerResult {
+ let deno = from_c(d);
+ if !deno.flags.allow_env {
+ let err = std::io::Error::new(
+ std::io::ErrorKind::PermissionDenied,
+ "allow_env is off.",
+ );
+ return Err(err.into());
+ }
+
+ let vars: Vec<_> = std::env::vars().map(|(key, value)| {
+ let key = builder.create_string(&key);
+ let value = builder.create_string(&value);
+
+ msg::EnvPair::create(builder, &msg::EnvPairArgs {
+ key: Some(key),
+ value: Some(value),
+ ..Default::default()
+ })
+ }).collect();
+
+ let tables = builder.create_vector_of_reverse_offsets(&vars);
+
+ let msg = msg::EnvironRes::create(
+ builder,
+ &msg::EnvironResArgs {
+ map: Some(tables),
+ ..Default::default()
+ },
+ );
+
+ Ok(create_msg(
+ builder,
+ &msg::BaseArgs {
+ msg: Some(flatbuffers::Offset::new(msg.value())),
+ msg_type: msg::Any::EnvironRes,
+ ..Default::default()
+ },
+ ))
+}
+
fn handle_fetch_req(
d: *const DenoC,
_builder: &mut FlatBufferBuilder,