diff options
| author | Linus Färnstrand <linus@mullvad.net> | 2017-02-08 16:40:02 +0100 |
|---|---|---|
| committer | Linus Färnstrand <linus@mullvad.net> | 2017-02-08 16:40:02 +0100 |
| commit | 7aa4ead921e41a7b8c3e078838013fc690c06dc6 (patch) | |
| tree | df758c0ad4cfd5d2f9bcd77bbbe5fa22eb6f728a | |
| parent | 3738df928c5b49a564e067b584c442fd66edfc01 (diff) | |
| download | mullvadvpn-7aa4ead921e41a7b8c3e078838013fc690c06dc6.tar.xz mullvadvpn-7aa4ead921e41a7b8c3e078838013fc690c06dc6.zip | |
Stop using foreign_link in an invalid(?) way
| -rw-r--r-- | src/net.rs | 19 | ||||
| -rw-r--r-- | src/process/monitor.rs | 15 |
2 files changed, 21 insertions, 13 deletions
diff --git a/src/net.rs b/src/net.rs index 3ee5aaca76..487949f572 100644 --- a/src/net.rs +++ b/src/net.rs @@ -11,11 +11,10 @@ use std::vec; error_chain! { errors { /// Error indicating parsing the address failed - AddrParseError - } - foreign_links { - AddrParsePortError(::std::num::ParseIntError) - #[doc = "The port part of the string did not correspond to a valid network port"]; + AddrParse(s: String) { + description("Invalid address format") + display("Unable to parse address. {}", s) + } } } @@ -57,9 +56,12 @@ impl RemoteAddr { fn from_domain_str(s: &str) -> Result<Self> { let (address, port_str) = Self::split_at_last_colon(s)?; - let port = u16::from_str(port_str)?; + let port = u16::from_str(port_str).chain_err(|| { + ErrorKind::AddrParse(format!("Invalid port: \"{}\"", port_str)) + })?; if address.is_empty() || address.contains(':') { - return Err(Error::from(ErrorKind::AddrParseError)); + let msg = format!("Invalid IP or domain: \"{}\"", address); + return Err(Error::from(ErrorKind::AddrParse(msg))); } Ok(RemoteAddr::Domain(address.to_owned(), port)) } @@ -67,7 +69,8 @@ impl RemoteAddr { fn split_at_last_colon(s: &str) -> Result<(&str, &str)> { let mut iter = s.rsplitn(2, ':'); let port = iter.next().unwrap(); - let address = iter.next().ok_or_else(|| Error::from(ErrorKind::AddrParseError))?; + let address = iter.next() + .ok_or_else(|| Error::from(ErrorKind::AddrParse("No colon".to_owned())))?; Ok((address, port)) } } diff --git a/src/process/monitor.rs b/src/process/monitor.rs index 3553f783cf..8caac5cc79 100644 --- a/src/process/monitor.rs +++ b/src/process/monitor.rs @@ -11,9 +11,14 @@ error_chain! { InvalidState { description("Invalid state for desired transition") } - } - foreign_links { - Io(::std::io::Error) #[doc = "The monitor state transition failed because of an IO error"]; + /// Error representing a failure in spawning the child process + Spawn { + description("Unable to spawn child process") + } + /// Error representing a failure in sending a kill signal to the child process + Kill { + description("Unable to send kill signal to process") + } } } @@ -77,7 +82,7 @@ impl<S: ChildSpawner> ChildMonitor<S> { { let mut state_lock = self.state.lock().unwrap(); if let State::Stopped = *state_lock { - let mut child = self.spawner.spawn()?; + let mut child = self.spawner.spawn().chain_err(|| ErrorKind::Spawn)?; let io = (child.stdout(), child.stderr()); let thread_handle = self.spawn_monitor(child.clone(), listener); *state_lock = State::Running(RunningState { @@ -108,7 +113,7 @@ impl<S: ChildSpawner> ChildMonitor<S> { pub fn stop(&self) -> Result<()> { let state_lock = self.state.lock().unwrap(); if let State::Running(ref running_state) = *state_lock { - running_state.child.kill()?; + running_state.child.kill().chain_err(|| ErrorKind::Kill)?; Ok(()) } else { Err(ErrorKind::InvalidState.into()) |
