summaryrefslogtreecommitdiff
path: root/src/ops.rs
diff options
context:
space:
mode:
authorKevin (Kun) "Kassimo" Qian <kevinkassimo@gmail.com>2018-10-05 09:16:24 -0700
committerRyan Dahl <ry@tinyclouds.org>2018-10-05 12:16:23 -0400
commit941e27d8c1c2748e62972510f8059838fdc84dad (patch)
tree831a8b52f35c2a25db8f2ccb19d922747be4f31d /src/ops.rs
parent6c42ded0970826aaf424f3ae572cb35a4ff212dc (diff)
Implement closeRead/closeWrite using TcpStream::shutdown (#903)
Diffstat (limited to 'src/ops.rs')
-rw-r--r--src/ops.rs35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/ops.rs b/src/ops.rs
index 53163dfd4..fb67d4bef 100644
--- a/src/ops.rs
+++ b/src/ops.rs
@@ -9,6 +9,8 @@ use isolate::Isolate;
use isolate::IsolateState;
use isolate::Op;
use msg;
+use resources;
+use resources::Resource;
use tokio_util;
use flatbuffers::FlatBufferBuilder;
@@ -19,10 +21,9 @@ use hyper;
use hyper::rt::{Future, Stream};
use hyper::Client;
use remove_dir_all::remove_dir_all;
-use resources;
use std;
use std::fs;
-use std::net::SocketAddr;
+use std::net::{Shutdown, SocketAddr};
#[cfg(any(unix))]
use std::os::unix::fs::PermissionsExt;
use std::path::Path;
@@ -84,6 +85,7 @@ pub fn dispatch(
msg::Any::Read => op_read,
msg::Any::Write => op_write,
msg::Any::Close => op_close,
+ msg::Any::Shutdown => op_shutdown,
msg::Any::Remove => op_remove,
msg::Any::ReadFile => op_read_file,
msg::Any::ReadDir => op_read_dir,
@@ -614,6 +616,35 @@ fn op_close(
}
}
+fn op_shutdown(
+ _state: Arc<IsolateState>,
+ base: &msg::Base,
+ data: &'static mut [u8],
+) -> Box<Op> {
+ assert_eq!(data.len(), 0);
+ let inner = base.inner_as_shutdown().unwrap();
+ let rid = inner.rid();
+ let how = inner.how();
+ match resources::lookup(rid) {
+ None => odd_future(errors::new(
+ errors::ErrorKind::BadFileDescriptor,
+ String::from("Bad File Descriptor"),
+ )),
+ Some(mut resource) => {
+ let shutdown_mode = match how {
+ 0 => Shutdown::Read,
+ 1 => Shutdown::Write,
+ _ => unimplemented!(),
+ };
+ blocking!(base.sync(), || {
+ // Use UFCS for disambiguation
+ Resource::shutdown(&mut resource, shutdown_mode)?;
+ Ok(empty_buf())
+ })
+ }
+ }
+}
+
fn op_read(
_state: Arc<IsolateState>,
base: &msg::Base,