summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2019-12-06 09:30:00 +0100
committerOdd Stranne <odd@mullvad.net>2019-12-06 18:38:15 +0100
commit172aae063b53183b5b3f3e46e42e8daa5c5e72b7 (patch)
treec74d657c7ac04ac755019c1d0b9788bbec28da82
parent29308f9b0232768331c232da73bc17d202122a60 (diff)
downloadmullvadvpn-172aae063b53183b5b3f3e46e42e8daa5c5e72b7.tar.xz
mullvadvpn-172aae063b53183b5b3f3e46e42e8daa5c5e72b7.zip
Update configuration on existing service during installation
-rw-r--r--mullvad-daemon/src/system_service.rs23
1 files changed, 16 insertions, 7 deletions
diff --git a/mullvad-daemon/src/system_service.rs b/mullvad-daemon/src/system_service.rs
index 9dcb56efb3..765f4e66b4 100644
--- a/mullvad-daemon/src/system_service.rs
+++ b/mullvad-daemon/src/system_service.rs
@@ -13,7 +13,7 @@ use std::{
use talpid_types::ErrorExt;
use windows_service::{
service::{
- ServiceAccess, ServiceAction, ServiceActionType, ServiceControl, ServiceControlAccept,
+ Service, ServiceAccess, ServiceAction, ServiceActionType, ServiceControl, ServiceControlAccept,
ServiceDependency, ServiceErrorControl, ServiceExitCode, ServiceFailureActions,
ServiceFailureResetPeriod, ServiceInfo, ServiceStartType, ServiceState, ServiceStatus,
ServiceType,
@@ -30,6 +30,13 @@ static SERVICE_TYPE: ServiceType = ServiceType::OWN_PROCESS;
const SERVICE_RECOVERY_LAST_RESTART_DELAY: Duration = Duration::from_secs(60 * 10);
const SERVICE_FAILURE_RESET_PERIOD: Duration = Duration::from_secs(60 * 15);
+lazy_static::lazy_static! {
+ static ref SERVICE_ACCESS: ServiceAccess = ServiceAccess::QUERY_CONFIG
+ | ServiceAccess::CHANGE_CONFIG
+ | ServiceAccess::START
+ | ServiceAccess::DELETE;
+}
+
pub fn run() -> Result<(), String> {
// Start the service dispatcher.
// This will block current thread until the service stopped and spawn `service_main` on a
@@ -250,14 +257,10 @@ pub fn install_service() -> Result<(), InstallError> {
let manager_access = ServiceManagerAccess::CONNECT | ServiceManagerAccess::CREATE_SERVICE;
let service_manager = ServiceManager::local_computer(None::<&str>, manager_access)
.map_err(InstallError::ConnectServiceManager)?;
- let service_access = ServiceAccess::QUERY_CONFIG
- | ServiceAccess::CHANGE_CONFIG
- | ServiceAccess::START
- | ServiceAccess::DELETE;
let service = service_manager
- .create_service(get_service_info(), service_access)
- .or(service_manager.open_service(SERVICE_NAME, service_access))
+ .create_service(&get_service_info(), *SERVICE_ACCESS)
+ .or(open_update_service(&service_manager))
.map_err(InstallError::CreateService)?;
let recovery_actions = vec![
@@ -290,6 +293,12 @@ pub fn install_service() -> Result<(), InstallError> {
.map_err(InstallError::CreateService)
}
+fn open_update_service(service_manager: &ServiceManager) -> Result<Service, windows_service::Error> {
+ let service = service_manager.open_service(SERVICE_NAME, *SERVICE_ACCESS)?;
+ service.change_config(&get_service_info())?;
+ Ok(service)
+}
+
fn get_service_info() -> ServiceInfo {
ServiceInfo {
name: OsString::from(SERVICE_NAME),