/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ #[cfg(windows)] pub fn os_release() -> Result { // The windows API *had* nice GetVersionEx/A APIs, but these were deprecated // in Winodws 8 and there's no newer win API to get version numbers. So // instead read the registry. use winreg::{enums::HKEY_LOCAL_MACHINE, RegKey}; let key = RegKey::predef(HKEY_LOCAL_MACHINE) .open_subkey(r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")?; let major: u32 = key.get_value("CurrentMajorVersionNumber")?; let minor: u32 = key.get_value("CurrentMinorVersionNumber")?; let build: String = key.get_value("CurrentBuild")?; Ok(format!("{}.{}.{}", major, minor, build)) } #[cfg(unix)] pub fn os_release() -> Result { use std::{ffi::CStr, mem}; unsafe { let mut ret = mem::MaybeUninit::zeroed(); if libc::uname(ret.as_mut_ptr()) != 0 { return Err(std::io::Error::last_os_error()); } let ret = ret.assume_init(); let c_str: &CStr = CStr::from_ptr(ret.release.as_ptr()); Ok(c_str.to_string_lossy().into_owned()) } }