diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2018-07-16 15:48:37 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2018-07-17 13:36:54 +0200 |
| commit | a35697c9c858494b5789253aaaa132c6242efab5 (patch) | |
| tree | 0f7de024884a84aac930ed46624c3e97d59b46d6 | |
| parent | 0d5827f2d9be38e7c48deed7427feb189f13fcd6 (diff) | |
| download | mullvadvpn-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.rs | 25 |
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 } |
