summaryrefslogtreecommitdiff
path: root/vendor/winapi-util/src/sysinfo.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/winapi-util/src/sysinfo.rs')
-rw-r--r--vendor/winapi-util/src/sysinfo.rs161
1 files changed, 0 insertions, 161 deletions
diff --git a/vendor/winapi-util/src/sysinfo.rs b/vendor/winapi-util/src/sysinfo.rs
deleted file mode 100644
index 53e7eae9..00000000
--- a/vendor/winapi-util/src/sysinfo.rs
+++ /dev/null
@@ -1,161 +0,0 @@
-use std::{ffi::OsString, io};
-
-use windows_sys::Win32::System::SystemInformation::{
- GetComputerNameExW, COMPUTER_NAME_FORMAT,
-};
-
-/// The type of name to be retrieved by [`get_computer_name`].
-#[derive(Clone, Copy, Debug)]
-#[non_exhaustive]
-pub enum ComputerNameKind {
- /// The name of the DNS domain assigned to the local computer. If the local
- /// computer is a node in a cluster, lpBuffer receives the DNS domain name
- /// of the cluster virtual server.
- DnsDomain,
- /// The fully qualified DNS name that uniquely identifies the local
- /// computer. This name is a combination of the DNS host name and the DNS
- /// domain name, using the form HostName.DomainName. If the local computer
- /// is a node in a cluster, lpBuffer receives the fully qualified DNS name
- /// of the cluster virtual server.
- DnsFullyQualified,
- /// The DNS host name of the local computer. If the local computer is a
- /// node in a cluster, lpBuffer receives the DNS host name of the cluster
- /// virtual server.
- DnsHostname,
- /// The NetBIOS name of the local computer. If the local computer is a node
- /// in a cluster, lpBuffer receives the NetBIOS name of the cluster virtual
- /// server.
- NetBios,
- /// The name of the DNS domain assigned to the local computer. If the local
- /// computer is a node in a cluster, lpBuffer receives the DNS domain name
- /// of the local computer, not the name of the cluster virtual server.
- PhysicalDnsDomain,
- /// The fully qualified DNS name that uniquely identifies the computer. If
- /// the local computer is a node in a cluster, lpBuffer receives the fully
- /// qualified DNS name of the local computer, not the name of the cluster
- /// virtual server.
- ///
- /// The fully qualified DNS name is a combination of the DNS host name and
- /// the DNS domain name, using the form HostName.DomainName.
- PhysicalDnsFullyQualified,
- /// The DNS host name of the local computer. If the local computer is a
- /// node in a cluster, lpBuffer receives the DNS host name of the local
- /// computer, not the name of the cluster virtual server.
- PhysicalDnsHostname,
- /// The NetBIOS name of the local computer. If the local computer is a node
- /// in a cluster, lpBuffer receives the NetBIOS name of the local computer,
- /// not the name of the cluster virtual server.
- PhysicalNetBios,
-}
-
-impl ComputerNameKind {
- fn to_format(&self) -> COMPUTER_NAME_FORMAT {
- use self::ComputerNameKind::*;
- use windows_sys::Win32::System::SystemInformation;
-
- match *self {
- DnsDomain => SystemInformation::ComputerNameDnsDomain,
- DnsFullyQualified => {
- SystemInformation::ComputerNameDnsFullyQualified
- }
- DnsHostname => SystemInformation::ComputerNameDnsHostname,
- NetBios => SystemInformation::ComputerNameNetBIOS,
- PhysicalDnsDomain => {
- SystemInformation::ComputerNamePhysicalDnsDomain
- }
- PhysicalDnsFullyQualified => {
- SystemInformation::ComputerNamePhysicalDnsFullyQualified
- }
- PhysicalDnsHostname => {
- SystemInformation::ComputerNamePhysicalDnsHostname
- }
- PhysicalNetBios => SystemInformation::ComputerNamePhysicalNetBIOS,
- }
- }
-}
-/// Retrieves a NetBIOS or DNS name associated with the local computer.
-///
-/// The names are established at system startup, when the system reads them
-/// from the registry.
-///
-/// This corresponds to calling [`GetComputerNameExW`].
-///
-/// [`GetComputerNameExW`]: https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getcomputernameexw
-pub fn get_computer_name(kind: ComputerNameKind) -> io::Result<OsString> {
- use std::os::windows::ffi::OsStringExt;
-
- let format = kind.to_format();
- let mut len1 = 0;
- // SAFETY: As documented, we call this with a null pointer which will in
- // turn cause this routine to write the required buffer size fo `len1`.
- // Also, we explicitly ignore the return value since we expect this call to
- // fail given that the destination buffer is too small by design.
- let _ =
- unsafe { GetComputerNameExW(format, std::ptr::null_mut(), &mut len1) };
-
- let len = match usize::try_from(len1) {
- Ok(len) => len,
- Err(_) => {
- return Err(io::Error::new(
- io::ErrorKind::Other,
- "GetComputerNameExW buffer length overflowed usize",
- ))
- }
- };
- let mut buf = vec![0; len];
- let mut len2 = len1;
- // SAFETY: We pass a valid pointer to an appropriately sized Vec<u16>.
- let rc =
- unsafe { GetComputerNameExW(format, buf.as_mut_ptr(), &mut len2) };
- if rc == 0 {
- return Err(io::Error::last_os_error());
- }
- // Apparently, the subsequent call writes the number of characters written
- // to the buffer to `len2` but not including the NUL terminator. Notice
- // that in the first call above, the length written to `len1` *does*
- // include the NUL terminator. Therefore, we expect `len1` to be at least
- // one greater than `len2`. If not, then something weird has happened and
- // we report an error.
- if len1 <= len2 {
- let msg = format!(
- "GetComputerNameExW buffer length mismatch, \
- expected length strictly less than {} \
- but got {}",
- len1, len2,
- );
- return Err(io::Error::new(io::ErrorKind::Other, msg));
- }
- let len = usize::try_from(len2).expect("len1 fits implies len2 fits");
- Ok(OsString::from_wide(&buf[..len]))
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- // This test doesn't really check anything other than that we can
- // successfully query all kinds of computer names. We just print them out
- // since there aren't really any properties about the names that we can
- // assert.
- //
- // We specifically run this test in CI with --nocapture so that we can see
- // the output.
- #[test]
- fn itworks() {
- let kinds = [
- ComputerNameKind::DnsDomain,
- ComputerNameKind::DnsFullyQualified,
- ComputerNameKind::DnsHostname,
- ComputerNameKind::NetBios,
- ComputerNameKind::PhysicalDnsDomain,
- ComputerNameKind::PhysicalDnsFullyQualified,
- ComputerNameKind::PhysicalDnsHostname,
- ComputerNameKind::PhysicalNetBios,
- ];
- for kind in kinds {
- let result = get_computer_name(kind);
- let name = result.unwrap();
- println!("{kind:?}: {name:?}");
- }
- }
-}