1#![deny(warnings, clippy::all)]
2#![warn(missing_docs)]
3#[must_use]
26pub fn is_root() -> bool {
27 is_root_internal()
28}
29
30#[cfg(windows)]
31#[must_use]
32fn is_root_internal() -> bool {
33 use std::mem;
34 use winapi::{
35 ctypes::c_void,
36 shared::minwindef::{DWORD, TRUE},
37 um::{
38 handleapi::{CloseHandle, INVALID_HANDLE_VALUE},
39 processthreadsapi::{GetCurrentProcess, OpenProcessToken},
40 securitybaseapi::GetTokenInformation,
41 winnt::{TokenElevation, TOKEN_ELEVATION, TOKEN_QUERY},
42 },
43 };
44 let mut token = INVALID_HANDLE_VALUE;
45 let mut elevated = false;
46 unsafe {
47 if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &mut token) == TRUE {
48 let mut elevation: TOKEN_ELEVATION = mem::zeroed();
49 let mut size = mem::size_of::<TOKEN_ELEVATION>() as DWORD;
50 if GetTokenInformation(
51 token,
52 TokenElevation,
53 &mut elevation as *mut TOKEN_ELEVATION as *mut c_void,
54 size,
55 &mut size,
56 ) == TRUE
57 {
58 elevated = elevation.TokenIsElevated != 0;
59 }
60 }
61 if token != INVALID_HANDLE_VALUE {
62 CloseHandle(token);
63 }
64 }
65 elevated
66}
67#[cfg(unix)]
68#[must_use]
69fn is_root_internal() -> bool {
70 users::get_current_uid() == 0
71}