Make getenv return an Option instead of a Result

This commit is contained in:
Aris Merchant 2021-06-24 16:04:24 -07:00
parent d26e01e9df
commit a12107afaa
7 changed files with 20 additions and 36 deletions

View file

@ -244,7 +244,7 @@ pub fn var_os<K: AsRef<OsStr>>(key: K) -> Option<OsString> {
} }
fn _var_os(key: &OsStr) -> Option<OsString> { fn _var_os(key: &OsStr) -> Option<OsString> {
os_imp::getenv(key).ok()? os_imp::getenv(key)
} }
/// The error type for operations interacting with environment variables. /// The error type for operations interacting with environment variables.

View file

@ -140,13 +140,8 @@ pub fn env() -> Env {
} }
} }
pub fn getenv(k: &OsStr) -> io::Result<Option<OsString>> { pub fn getenv(k: &OsStr) -> Option<OsString> {
unsafe { unsafe { ENV.as_ref().unwrap().lock().unwrap().get_mut(k).cloned() }
match ENV.as_ref().unwrap().lock().unwrap().get_mut(k) {
Some(value) => Ok(Some(value.clone())),
None => Ok(None),
}
}
} }
pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> { pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> {

View file

@ -106,8 +106,8 @@ pub fn env() -> Env {
get_env_store().map(|env| clone_to_vec(&env.lock().unwrap())).unwrap_or_default().into_iter() get_env_store().map(|env| clone_to_vec(&env.lock().unwrap())).unwrap_or_default().into_iter()
} }
pub fn getenv(k: &OsStr) -> io::Result<Option<OsString>> { pub fn getenv(k: &OsStr) -> Option<OsString> {
Ok(get_env_store().and_then(|s| s.lock().unwrap().get(k).cloned())) get_env_store().and_then(|s| s.lock().unwrap().get(k).cloned())
} }
pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> { pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> {

View file

@ -532,19 +532,18 @@ pub fn env() -> Env {
} }
} }
pub fn getenv(k: &OsStr) -> io::Result<Option<OsString>> { pub fn getenv(k: &OsStr) -> Option<OsString> {
// environment variables with a nul byte can't be set, so their value is // environment variables with a nul byte can't be set, so their value is
// always None as well // always None as well
let k = CString::new(k.as_bytes())?; let k = CString::new(k.as_bytes()).ok()?;
unsafe { unsafe {
let _guard = env_read_lock(); let _guard = env_read_lock();
let s = libc::getenv(k.as_ptr()) as *const libc::c_char; let s = libc::getenv(k.as_ptr()) as *const libc::c_char;
let ret = if s.is_null() { if s.is_null() {
None None
} else { } else {
Some(OsStringExt::from_vec(CStr::from_ptr(s).to_bytes().to_vec())) Some(OsStringExt::from_vec(CStr::from_ptr(s).to_bytes().to_vec()))
}; }
Ok(ret)
} }
} }

View file

@ -76,8 +76,8 @@ pub fn env() -> Env {
panic!("not supported on this platform") panic!("not supported on this platform")
} }
pub fn getenv(_: &OsStr) -> io::Result<Option<OsString>> { pub fn getenv(_: &OsStr) -> Option<OsString> {
Ok(None) None
} }
pub fn setenv(_: &OsStr, _: &OsStr) -> io::Result<()> { pub fn setenv(_: &OsStr, _: &OsStr) -> io::Result<()> {

View file

@ -175,17 +175,16 @@ pub fn env() -> Env {
} }
} }
pub fn getenv(k: &OsStr) -> io::Result<Option<OsString>> { pub fn getenv(k: &OsStr) -> Option<OsString> {
let k = CString::new(k.as_bytes())?; let k = CString::new(k.as_bytes()).ok()?;
unsafe { unsafe {
let _guard = env_lock(); let _guard = env_lock();
let s = libc::getenv(k.as_ptr()) as *const libc::c_char; let s = libc::getenv(k.as_ptr()) as *const libc::c_char;
let ret = if s.is_null() { if s.is_null() {
None None
} else { } else {
Some(OsStringExt::from_vec(CStr::from_ptr(s).to_bytes().to_vec())) Some(OsStringExt::from_vec(CStr::from_ptr(s).to_bytes().to_vec()))
}; }
Ok(ret)
} }
} }

View file

@ -253,22 +253,13 @@ pub fn chdir(p: &path::Path) -> io::Result<()> {
cvt(unsafe { c::SetCurrentDirectoryW(p.as_ptr()) }).map(drop) cvt(unsafe { c::SetCurrentDirectoryW(p.as_ptr()) }).map(drop)
} }
pub fn getenv(k: &OsStr) -> io::Result<Option<OsString>> { pub fn getenv(k: &OsStr) -> Option<OsString> {
let k = to_u16s(k)?; let k = to_u16s(k).ok()?;
let res = super::fill_utf16_buf( super::fill_utf16_buf(
|buf, sz| unsafe { c::GetEnvironmentVariableW(k.as_ptr(), buf, sz) }, |buf, sz| unsafe { c::GetEnvironmentVariableW(k.as_ptr(), buf, sz) },
|buf| OsStringExt::from_wide(buf), |buf| OsStringExt::from_wide(buf),
); )
match res { .ok()
Ok(value) => Ok(Some(value)),
Err(e) => {
if e.raw_os_error() == Some(c::ERROR_ENVVAR_NOT_FOUND as i32) {
Ok(None)
} else {
Err(e)
}
}
}
} }
pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> { pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> {