diff options
Diffstat (limited to 'src/util')
| -rw-r--r-- | src/util/mod.rs | 4 | ||||
| -rw-r--r-- | src/util/windows.rs | 115 |
2 files changed, 66 insertions, 53 deletions
diff --git a/src/util/mod.rs b/src/util/mod.rs index db85a9b..2035054 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -212,7 +212,7 @@ pub fn voice_states_by_channel(ctx: PoiseContext<'_>) -> HashMap<ChannelId, Vec< Some((id, x)) }) .fold(HashMap::new(), |mut acc, (id, state)| { - acc.entry(id).or_insert_with(|| vec![]).push(state); + acc.entry(id).or_insert_with(Vec::new).push(state); acc }) @@ -228,7 +228,7 @@ pub fn best_voice_channel(ctx: PoiseContext<'_>) -> Option<ChannelId> { } let voice_states = voice_states_by_channel(ctx); - let max_pop = voice_states.iter().map(|(_, states)| states.len()).max(); + let max_pop = voice_states.values().map(|states| states.len()).max(); let matching_channels = voice_states .iter() 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, }); |
