summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2018-07-16 15:48:37 +0200
committerAndrej Mihajlov <and@mullvad.net>2018-07-17 13:36:54 +0200
commita35697c9c858494b5789253aaaa132c6242efab5 (patch)
tree0f7de024884a84aac930ed46624c3e97d59b46d6
parent0d5827f2d9be38e7c48deed7427feb189f13fcd6 (diff)
downloadmullvadvpn-a35697c9c858494b5789253aaaa132c6242efab5.tar.xz
mullvadvpn-a35697c9c858494b5789253aaaa132c6242efab5.zip
Properly stop the service, announcing errors to the system, in the event of initialization or runtime error.
-rw-r--r--mullvad-daemon/src/system_service.rs25
1 files changed, 14 insertions, 11 deletions
diff --git a/mullvad-daemon/src/system_service.rs b/mullvad-daemon/src/system_service.rs
index 6c2098b1ce..5f3b1299b4 100644
--- a/mullvad-daemon/src/system_service.rs
+++ b/mullvad-daemon/src/system_service.rs
@@ -43,7 +43,6 @@ pub fn handle_service_main(arguments: Vec<OsString>) {
}
fn run_service(_arguments: Vec<OsString>) -> Result<()> {
- let config = cli::get_config();
let (event_tx, event_rx) = mpsc::channel();
// Register service event handler
@@ -68,20 +67,24 @@ fn run_service(_arguments: Vec<OsString>) -> Result<()> {
.set_pending_start(Duration::from_secs(1))
.unwrap();
- let daemon = ::create_daemon(config)?;
- let shutdown_handle = daemon.shutdown_handle();
+ let config = cli::get_config();
+ let result = ::create_daemon(config).and_then(|daemon| {
+ let shutdown_handle = daemon.shutdown_handle();
- // Register monitor that translates `ServiceControl` to Daemon events
- start_event_monitor(persistent_service_status.clone(), shutdown_handle, event_rx);
+ // Register monitor that translates `ServiceControl` to Daemon events
+ start_event_monitor(persistent_service_status.clone(), shutdown_handle, event_rx);
- persistent_service_status.set_running().unwrap();
+ persistent_service_status.set_running().unwrap();
- let result = daemon.run();
+ daemon.run()
+ });
- // TODO: report correct exit code back after running a daemon.
- persistent_service_status
- .set_stopped(ServiceExitCode::default())
- .unwrap();
+ let exit_code = match result {
+ Ok(_) => ServiceExitCode::default(),
+ Err(_) => ServiceExitCode::ServiceSpecific(1),
+ };
+
+ persistent_service_status.set_stopped(exit_code).unwrap();
result
}