Show More
@@ -20,8 +20,11 b' use tokio_hglib::UnixClient;' | |||||
20 | use tokio_process::{Child, CommandExt}; |
|
20 | use tokio_process::{Child, CommandExt}; | |
21 | use tokio_timer; |
|
21 | use tokio_timer; | |
22 |
|
22 | |||
|
23 | use super::message::ServerSpec; | |||
23 | use super::procutil; |
|
24 | use super::procutil; | |
24 |
|
25 | |||
|
26 | const REQUIRED_SERVER_CAPABILITIES: &[&str] = &["attachio", "chdir", "runcommand"]; | |||
|
27 | ||||
25 | /// Helper to connect to and spawn a server process. |
|
28 | /// Helper to connect to and spawn a server process. | |
26 | #[derive(Clone, Debug)] |
|
29 | #[derive(Clone, Debug)] | |
27 | pub struct Locator { |
|
30 | pub struct Locator { | |
@@ -68,10 +71,15 b' impl Locator {' | |||||
68 | /// Tries to connect to the existing server, or spawns new if not running. |
|
71 | /// Tries to connect to the existing server, or spawns new if not running. | |
69 | fn try_connect(self) -> impl Future<Item = (Self, UnixClient), Error = io::Error> { |
|
72 | fn try_connect(self) -> impl Future<Item = (Self, UnixClient), Error = io::Error> { | |
70 | debug!("try connect to {}", self.base_sock_path.display()); |
|
73 | debug!("try connect to {}", self.base_sock_path.display()); | |
71 |
UnixClient::connect(self.base_sock_path.clone()) |
|
74 | UnixClient::connect(self.base_sock_path.clone()) | |
72 | Ok(client) => Either::A(future::ok((self, client))), |
|
75 | .then(|res| match res { | |
73 | Err(_) => Either::B(self.spawn_connect()), |
|
76 | Ok(client) => Either::A(future::ok((self, client))), | |
74 | }) |
|
77 | Err(_) => Either::B(self.spawn_connect()), | |
|
78 | }) | |||
|
79 | .and_then(|(loc, client)| { | |||
|
80 | check_server_capabilities(client.server_spec())?; | |||
|
81 | Ok((loc, client)) | |||
|
82 | }) | |||
75 | } |
|
83 | } | |
76 |
|
84 | |||
77 | /// Spawns new server process and connects to it. |
|
85 | /// Spawns new server process and connects to it. | |
@@ -239,3 +247,20 b' where' | |||||
239 | Err(io::Error::new(io::ErrorKind::Other, "insecure directory")) |
|
247 | Err(io::Error::new(io::ErrorKind::Other, "insecure directory")) | |
240 | } |
|
248 | } | |
241 | } |
|
249 | } | |
|
250 | ||||
|
251 | fn check_server_capabilities(spec: &ServerSpec) -> io::Result<()> { | |||
|
252 | let unsupported: Vec<_> = REQUIRED_SERVER_CAPABILITIES | |||
|
253 | .iter() | |||
|
254 | .cloned() | |||
|
255 | .filter(|&s| !spec.capabilities.contains(s)) | |||
|
256 | .collect(); | |||
|
257 | if unsupported.is_empty() { | |||
|
258 | Ok(()) | |||
|
259 | } else { | |||
|
260 | let msg = format!( | |||
|
261 | "insufficient server capabilities: {}", | |||
|
262 | unsupported.join(", ") | |||
|
263 | ); | |||
|
264 | Err(io::Error::new(io::ErrorKind::Other, msg)) | |||
|
265 | } | |||
|
266 | } |
General Comments 0
You need to be logged in to leave comments.
Login now