dns_over_https/
windows.rs1#![cfg(windows)]
2
3windows_service::define_windows_service!(ffi_service_main, my_service_main);
4
5pub fn start_service() -> Result<(), windows_service::Error> {
6 windows_service::service_dispatcher::start("dns-over-https", ffi_service_main)?;
9 Ok(())
10}
11
12fn my_service_main(arguments: Vec<std::ffi::OsString>) {
13 if let Err(_e) = run_service(arguments) {
17 }
19}
20
21fn run_service(_arguments: Vec<std::ffi::OsString>) -> Result<(), crate::BoxError> {
22 use windows_service::service::ServiceControl;
23 use windows_service::service_control_handler::{self, ServiceControlHandlerResult};
24
25 let event_handler = move |control_event| -> ServiceControlHandlerResult {
26 match control_event {
27 ServiceControl::Stop => {
28 unsafe { crate::dns_over_https_stop() };
30 ServiceControlHandlerResult::NoError
31 }
32 ServiceControl::Interrogate => ServiceControlHandlerResult::NoError,
34 _ => ServiceControlHandlerResult::NotImplemented,
35 }
36 };
37
38 let status_handle = service_control_handler::register("dns-over-https", event_handler)?;
40
41 let mut next_status = windows_service::service::ServiceStatus {
42 service_type: windows_service::service::ServiceType::OWN_PROCESS,
44 current_state: windows_service::service::ServiceState::Running,
46 controls_accepted: windows_service::service::ServiceControlAccept::STOP,
48 exit_code: windows_service::service::ServiceExitCode::Win32(0),
50 checkpoint: 0,
52 wait_hint: std::time::Duration::default(),
54 process_id: None,
56 };
57
58 status_handle.set_service_status(next_status.clone())?;
60
61 let args = crate::Args::parse();
62
63 let rt = tokio::runtime::Builder::new_multi_thread().enable_all().build()?;
64 rt.block_on(async {
65 crate::main_loop(&args).await?;
66 Ok::<(), crate::Error>(())
67 })?;
68
69 next_status.current_state = windows_service::service::ServiceState::Stopped;
71 status_handle.set_service_status(next_status)?;
72
73 Ok(())
74}