summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--talpid-core/Cargo.toml1
-rw-r--r--talpid-core/src/routing/linux.rs45
-rw-r--r--talpid-core/src/routing/macos.rs45
3 files changed, 55 insertions, 36 deletions
diff --git a/talpid-core/Cargo.toml b/talpid-core/Cargo.toml
index 2ebdf0a59e..d7116a7457 100644
--- a/talpid-core/Cargo.toml
+++ b/talpid-core/Cargo.toml
@@ -10,6 +10,7 @@ edition = "2018"
atty = "0.2"
duct = "0.12"
error-chain = "0.12"
+err-derive = "0.1.5"
futures = "0.1"
jsonrpc-core = { git = "https://github.com/mullvad/jsonrpc", branch = "mullvad-fork" }
jsonrpc-macros = { git = "https://github.com/mullvad/jsonrpc", branch = "mullvad-fork" }
diff --git a/talpid-core/src/routing/linux.rs b/talpid-core/src/routing/linux.rs
index 4c4712ac1e..73de509a0e 100644
--- a/talpid-core/src/routing/linux.rs
+++ b/talpid-core/src/routing/linux.rs
@@ -1,21 +1,30 @@
use super::{NetNode, RequiredRoutes, Route};
use super::subprocess::{Exec, RunExpr};
-use std::{collections::HashSet, net::IpAddr};
+use std::{
+ collections::HashSet,
+ io,
+ net::{AddrParseError, IpAddr},
+};
+pub type Result<T> = std::result::Result<T, Error>;
-error_chain! {
- errors {
- FailedToAddRoute {
- description("Failed to add route")
- }
- FailedToRemoveRoute {
- description("Failed to remove route")
- }
- FailedToGetDefaultRoute {
- description("Failed to get default route")
- }
- }
+#[derive(err_derive::Error, Debug)]
+pub enum Error {
+ #[error(display = "Failed to add route")]
+ FailedToAddRoute(#[error(cause)] io::Error),
+
+ #[error(display = "Failed to remove route")]
+ FailedToRemoveRoute(#[error(cause)] io::Error),
+
+ #[error(display = "Error while running \"ip route\"")]
+ FailedToRunIp(#[error(cause)] io::Error),
+
+ #[error(display = "No default route in \"ip route\" output")]
+ NoDefaultRoute,
+
+ #[error(display = "Failed to parse default route as IP: {}", _0)]
+ ParseDefaultRoute(String, #[error(cause)] AddrParseError),
}
@@ -42,7 +51,7 @@ impl RouteManager {
cmd.into_expr()
.run_expr()
- .chain_err(|| ErrorKind::FailedToAddRoute)?;
+ .map_err(Error::FailedToAddRoute)?;
self.added_routes.insert(route);
Ok(())
@@ -99,7 +108,7 @@ impl super::RoutingT for RouteManager {
route.prefix.to_string()
)
.run_expr()
- .chain_err(|| ErrorKind::FailedToRemoveRoute);
+ .map_err(Error::FailedToRemoveRoute);
if let Err(e) = result {
log::error!("Failed to remove route {} - {}", route.prefix, e);
end_result = Err(e);
@@ -112,15 +121,15 @@ impl super::RoutingT for RouteManager {
fn get_default_route_node(&mut self) -> Result<IpAddr> {
let output = duct::cmd!("ip", "route")
.stdout()
- .chain_err(|| ErrorKind::FailedToGetDefaultRoute)?;
+ .map_err(Error::FailedToRunIp)?;
let ip_str: &str = output
.lines()
.find(|line| line.trim().starts_with("default via "))
.and_then(|line| line.trim().split_whitespace().nth(2))
- .ok_or_else(|| Error::from(ErrorKind::FailedToGetDefaultRoute))?;
+ .ok_or(Error::NoDefaultRoute)?;
ip_str
.parse()
- .map_err(|_| Error::from(ErrorKind::FailedToGetDefaultRoute))
+ .map_err(|e| Error::ParseDefaultRoute(ip_str.to_owned(), e))
}
}
diff --git a/talpid-core/src/routing/macos.rs b/talpid-core/src/routing/macos.rs
index 582c453439..d0e9497c1c 100644
--- a/talpid-core/src/routing/macos.rs
+++ b/talpid-core/src/routing/macos.rs
@@ -1,22 +1,31 @@
use super::{NetNode, RequiredRoutes, Route};
use super::subprocess::{Exec, RunExpr};
-use std::{collections::HashSet, net::IpAddr};
+use std::{
+ collections::HashSet,
+ io,
+ net::{AddrParseError, IpAddr},
+};
-error_chain! {
- errors {
- FailedToAddRoute {
- description("Failed to add route")
- }
- FailedToGetDefaultRoute {
- description("Failed to get default route")
- }
+pub type Result<T> = std::result::Result<T, Error>;
- FailedToRemoveRoute {
- description("Failed to remove route")
- }
- }
+#[derive(err_derive::Error, Debug)]
+pub enum Error {
+ #[error(display = "Failed to add route")]
+ FailedToAddRoute(#[error(cause)] io::Error),
+
+ #[error(display = "Failed to remove route")]
+ FailedToRemoveRoute(#[error(cause)] io::Error),
+
+ #[error(display = "Error while running \"ip route\"")]
+ FailedToRunIp(#[error(cause)] io::Error),
+
+ #[error(display = "No default route in \"ip route\" output")]
+ NoDefaultRoute,
+
+ #[error(display = "Failed to parse default route as IP: {}", _0)]
+ ParseDefaultRoute(String, #[error(cause)] AddrParseError),
}
pub struct RouteManager {
@@ -51,7 +60,7 @@ impl RouteManager {
cmd.into_expr()
.run_expr()
- .chain_err(|| ErrorKind::FailedToAddRoute)?;
+ .map_err(Error::FailedToAddRoute)?;
self.set_routes.insert(route);
Ok(())
}
@@ -96,7 +105,7 @@ impl super::RoutingT for RouteManager {
route.prefix.to_string()
)
.run_expr()
- .chain_err(|| ErrorKind::FailedToRemoveRoute);
+ .map_err(Error::FailedToRemoveRoute);
if let Err(e) = result {
log::error!("failed to reset remove route: {}", e);
end_result = Err(e);
@@ -110,15 +119,15 @@ impl super::RoutingT for RouteManager {
fn get_default_route_node(&mut self) -> Result<IpAddr> {
let output = duct::cmd!("route", "-n", "get", "default")
.stdout()
- .chain_err(|| ErrorKind::FailedToGetDefaultRoute)?;
+ .map_err(Error::FailedToRunIp)?;
let ip_str: &str = output
.lines()
.find(|line| line.trim().starts_with("gateway: "))
.and_then(|line| line.trim().split_whitespace().skip(1).next())
- .ok_or(Error::from(ErrorKind::FailedToGetDefaultRoute))?;
+ .ok_or(Error::NoDefaultRoute)?;
ip_str
.parse()
- .map_err(|_| Error::from(ErrorKind::FailedToGetDefaultRoute))
+ .map_err(|e| Error::ParseDefaultRoute(ip_str.to_owned(), e))
}
}