diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/msg.fbs | 13 | ||||
-rw-r--r-- | src/ops.rs | 53 |
2 files changed, 62 insertions, 4 deletions
diff --git a/src/msg.fbs b/src/msg.fbs index 43fde4d68..5b60213ad 100644 --- a/src/msg.fbs +++ b/src/msg.fbs @@ -41,6 +41,9 @@ union Any { Accept, Dial, NewConn, + Chdir, + Cwd, + CwdRes, Metrics, MetricsRes, } @@ -93,6 +96,12 @@ enum ErrorKind: byte { HttpOther, } +table Cwd {} + +table CwdRes { + cwd: string; +} + table Base { cmd_id: uint32; sync: bool = true; // TODO(ry) Change default to false. @@ -135,6 +144,10 @@ table CodeCache { output_code: string; } +table Chdir { + directory: string; +} + table SetTimeout { timeout: double; } diff --git a/src/ops.rs b/src/ops.rs index a58532baf..261ed67f5 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -101,6 +101,8 @@ pub fn dispatch( msg::Any::Listen => op_listen, msg::Any::Accept => op_accept, msg::Any::Dial => op_dial, + msg::Any::Chdir => op_chdir, + msg::Any::Cwd => op_cwd, msg::Any::Metrics => op_metrics, _ => panic!(format!( "Unhandled message {}", @@ -110,8 +112,7 @@ pub fn dispatch( op_creator(isolate.state.clone(), &base, data) }; - let boxed_op = Box::new( - op.or_else(move |err: DenoError| -> DenoResult<Buf> { + let boxed_op = Box::new(op.or_else(move |err: DenoError| -> DenoResult<Buf> { debug!("op err {}", err); // No matter whether we got an Err or Ok, we want a serialized message to // send back. So transform the DenoError into a deno_buf. @@ -143,8 +144,7 @@ pub fn dispatch( ) }; Ok(buf) - }), - ); + })); debug!( "msg_from_js {} sync {}", @@ -283,6 +283,20 @@ fn op_code_cache( }())) } +fn op_chdir( + _state: Arc<IsolateState>, + base: &msg::Base, + data: &'static mut [u8], +) -> Box<Op> { + assert_eq!(data.len(), 0); + let inner = base.inner_as_chdir().unwrap(); + let directory = inner.directory().unwrap(); + Box::new(futures::future::result(|| -> OpResult { + let _result = std::env::set_current_dir(&directory)?; + Ok(empty_buf()) + }())) +} + fn op_set_timeout( isolate: &mut Isolate, base: &msg::Base, @@ -811,6 +825,37 @@ fn get_mode(_perm: fs::Permissions) -> u32 { 0 } +fn op_cwd( + _state: Arc<IsolateState>, + base: &msg::Base, + data: &'static mut [u8], +) -> Box<Op> { + assert_eq!(data.len(), 0); + let cmd_id = base.cmd_id(); + Box::new(futures::future::result(|| -> OpResult { + let path = std::env::current_dir()?; + let builder = &mut FlatBufferBuilder::new(); + let cwd = + builder.create_string(&path.into_os_string().into_string().unwrap()); + let inner = msg::CwdRes::create( + builder, + &msg::CwdResArgs { + cwd: Some(cwd), + ..Default::default() + }, + ); + Ok(serialize_response( + cmd_id, + builder, + msg::BaseArgs { + inner: Some(inner.as_union_value()), + inner_type: msg::Any::CwdRes, + ..Default::default() + }, + )) + }())) +} + fn op_stat( _config: Arc<IsolateState>, base: &msg::Base, |