summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2017-02-08 16:40:02 +0100
committerLinus Färnstrand <linus@mullvad.net>2017-02-08 16:40:02 +0100
commit7aa4ead921e41a7b8c3e078838013fc690c06dc6 (patch)
treedf758c0ad4cfd5d2f9bcd77bbbe5fa22eb6f728a
parent3738df928c5b49a564e067b584c442fd66edfc01 (diff)
downloadmullvadvpn-7aa4ead921e41a7b8c3e078838013fc690c06dc6.tar.xz
mullvadvpn-7aa4ead921e41a7b8c3e078838013fc690c06dc6.zip
Stop using foreign_link in an invalid(?) way
-rw-r--r--src/net.rs19
-rw-r--r--src/process/monitor.rs15
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())