aboutsummaryrefslogtreecommitdiff
path: root/src/util/windows.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/windows.rs')
-rw-r--r--src/util/windows.rs115
1 files changed, 64 insertions, 51 deletions
diff --git a/src/util/windows.rs b/src/util/windows.rs
index 7003490..4764201 100644
--- a/src/util/windows.rs
+++ b/src/util/windows.rs
@@ -1,25 +1,27 @@
use grate::tracing;
use windows::{
- core::{
- HSTRING,
- PWSTR,
- },
Win32::{
Foundation,
System::Services,
},
+ core::{
+ HSTRING,
+ PWSTR,
+ },
};
lazy_static::lazy_static! {
static ref PSQL_REGEX: regex::Regex = regex::Regex::new(r#"^(?:postgresql|psql|postgres)-.*([\d\.]*)"#).unwrap();
}
-pub unsafe fn ensure_postgres_started() -> windows::core::Result<bool> {
- let sc_manager = Services::OpenSCManagerW(
- None,
- None,
- (Foundation::GENERIC_READ | Foundation::GENERIC_WRITE).0,
- )?;
+pub fn ensure_postgres_started() -> windows::core::Result<bool> {
+ let sc_manager = unsafe {
+ Services::OpenSCManagerW(
+ None,
+ None,
+ (Foundation::GENERIC_READ | Foundation::GENERIC_WRITE).0,
+ )?
+ };
let Some(svc) = get_psql_service(sc_manager)? else {
return Ok(false);
@@ -41,25 +43,29 @@ pub unsafe fn ensure_postgres_started() -> windows::core::Result<bool> {
},
}
- let service =
- Services::OpenServiceW(sc_manager, &HSTRING::from(&svc.name), Services::SERVICE_START)?;
+ unsafe {
+ let service =
+ Services::OpenServiceW(sc_manager, &HSTRING::from(&svc.name), Services::SERVICE_START)?;
- Services::StartServiceW(service, None)?;
+ Services::StartServiceW(service, None)?;
- tracing::info!("started postgres service");
+ tracing::info!("started postgres service");
- Services::CloseServiceHandle(service)?;
- Services::CloseServiceHandle(sc_manager)?;
+ Services::CloseServiceHandle(service)?;
+ Services::CloseServiceHandle(sc_manager)?;
+ }
Ok(true)
}
-pub unsafe fn shutdown_postgres() -> windows::core::Result<()> {
- let sc_manager = Services::OpenSCManagerW(
- None,
- None,
- (Foundation::GENERIC_READ | Foundation::GENERIC_WRITE).0,
- )?;
+pub fn shutdown_postgres() -> windows::core::Result<()> {
+ let sc_manager = unsafe {
+ Services::OpenSCManagerW(
+ None,
+ None,
+ (Foundation::GENERIC_READ | Foundation::GENERIC_WRITE).0,
+ )
+ }?;
let Some(svc) = get_psql_service(sc_manager)? else {
tracing::warn!("wasn't able to find postgres service");
@@ -71,8 +77,9 @@ pub unsafe fn shutdown_postgres() -> windows::core::Result<()> {
return Ok(());
}
- let service =
- Services::OpenServiceW(sc_manager, &HSTRING::from(&svc.name), Services::SERVICE_STOP)?;
+ let service = unsafe {
+ Services::OpenServiceW(sc_manager, &HSTRING::from(&svc.name), Services::SERVICE_STOP)
+ }?;
let mut params = Services::SERVICE_CONTROL_STATUS_REASON_PARAMSW {
dwReason: Services::SERVICE_STOP_REASON_FLAG_PLANNED
@@ -82,22 +89,26 @@ pub unsafe fn shutdown_postgres() -> windows::core::Result<()> {
ServiceStatus: Services::SERVICE_STATUS_PROCESS::default(),
};
- Services::ControlServiceExW(
- service,
- Services::SERVICE_CONTROL_STOP,
- Services::SERVICE_CONTROL_STATUS_REASON_INFO,
- &mut params as *mut _ as _,
- )?;
+ unsafe {
+ Services::ControlServiceExW(
+ service,
+ Services::SERVICE_CONTROL_STOP,
+ Services::SERVICE_CONTROL_STATUS_REASON_INFO,
+ &mut params as *mut _ as _,
+ )?;
+ }
tracing::info!("stopped postgres service");
- Services::CloseServiceHandle(service)?;
- Services::CloseServiceHandle(sc_manager)?;
+ unsafe {
+ Services::CloseServiceHandle(service)?;
+ Services::CloseServiceHandle(sc_manager)?;
+ }
Ok(())
}
-pub unsafe fn get_psql_service(
+pub fn get_psql_service(
sc_manager: Services::SC_HANDLE,
) -> windows::core::Result<Option<ServiceStatus>> {
let services = list_services(sc_manager)?;
@@ -133,9 +144,7 @@ pub struct ServiceStatus {
pub status: Services::SERVICE_STATUS_PROCESS,
}
-pub unsafe fn list_services(
- sc_manager: Services::SC_HANDLE,
-) -> windows::core::Result<Vec<ServiceStatus>> {
+pub fn list_services(sc_manager: Services::SC_HANDLE) -> windows::core::Result<Vec<ServiceStatus>> {
let mut bytes_needed: u32 = 0;
let mut services_returned: u32 = 0;
let mut resume = 0;
@@ -145,17 +154,19 @@ pub unsafe fn list_services(
loop {
let mut data = [0u8; 256 * 1024];
- let result = Services::EnumServicesStatusExW(
- sc_manager,
- Services::SC_ENUM_PROCESS_INFO,
- Services::SERVICE_WIN32,
- Services::SERVICE_STATE_ALL,
- Some(&mut data),
- &mut bytes_needed as *mut _,
- &mut services_returned as *mut _,
- Some(&mut resume),
- None,
- );
+ let result = unsafe {
+ Services::EnumServicesStatusExW(
+ sc_manager,
+ Services::SC_ENUM_PROCESS_INFO,
+ Services::SERVICE_WIN32,
+ Services::SERVICE_STATE_ALL,
+ Some(&mut data),
+ &mut bytes_needed as *mut _,
+ &mut services_returned as *mut _,
+ Some(&mut resume),
+ None,
+ )
+ };
if let Err(ref e) = result
&& e.code() != Foundation::ERROR_MORE_DATA.to_hresult()
@@ -168,11 +179,13 @@ pub unsafe fn list_services(
);
let elems = data
- .into_iter()
- .map(|x| core::mem::transmute::<_, Services::ENUM_SERVICE_STATUS_PROCESSW>(*x))
+ .iter()
+ .map(|x| unsafe {
+ core::mem::transmute::<_, Services::ENUM_SERVICE_STATUS_PROCESSW>(*x)
+ })
.map(|x| ServiceStatus {
- display_name: x.lpDisplayName.to_string().unwrap(),
- name: x.lpServiceName.to_string().unwrap(),
+ display_name: unsafe { x.lpDisplayName.to_string() }.unwrap(),
+ name: unsafe { x.lpServiceName.to_string() }.unwrap(),
status: x.ServiceStatusProcess,
});