extern crate is_docker;
extern crate once_cell;
use once_cell::sync::OnceCell;
use std::{fs::File, io::Read};
pub fn is_wsl() -> bool {
static CACHED_RESULT: OnceCell<bool> = OnceCell::new();
*CACHED_RESULT.get_or_init(|| {
if std::env::consts::OS != "linux" {
return false;
}
if let Ok(os_release) = get_os_release() {
if os_release.to_lowercase().contains("microsoft") {
return !is_docker::is_docker();
}
}
if proc_version_includes_microsoft() {
!is_docker::is_docker()
} else {
false
}
})
}
fn proc_version_includes_microsoft() -> bool {
match std::fs::read_to_string("/proc/version") {
Ok(file_contents) => file_contents.to_lowercase().contains("microsoft"),
Err(_) => false,
}
}
fn get_os_release() -> Result<String, std::io::Error> {
let mut s = String::new();
File::open("/proc/sys/kernel/osrelease")?.read_to_string(&mut s)?;
s.pop(); Ok(s)
}