make home_dir work on macOS
This commit is contained in:
parent
437d241412
commit
79d147edb7
@ -553,6 +553,42 @@ fn emulate_foreign_item_by_name(
|
|||||||
this.write_int(super::UID, dest)?;
|
this.write_int(super::UID, dest)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"getpwuid_r" if this.frame_in_std() => {
|
||||||
|
let [uid, pwd, buf, buflen, result] =
|
||||||
|
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
this.check_no_isolation("`getpwuid_r`")?;
|
||||||
|
|
||||||
|
let uid = this.read_scalar(uid)?.to_u32()?;
|
||||||
|
let pwd = this.deref_operand(pwd)?;
|
||||||
|
let buf = this.read_pointer(buf)?;
|
||||||
|
let buflen = this.read_scalar(buflen)?.to_machine_usize(this)?;
|
||||||
|
let result = this.deref_operand(result)?;
|
||||||
|
|
||||||
|
// Must be for "us".
|
||||||
|
if uid != crate::shims::unix::UID {
|
||||||
|
throw_unsup_format!("`getpwuid_r` on other users is not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset all fields to `uninit` to make sure nobody reads them.
|
||||||
|
// (This is a std-only shim so we are okay with such hacks.)
|
||||||
|
this.write_uninit(&pwd.into())?;
|
||||||
|
|
||||||
|
// We only set the home_dir field.
|
||||||
|
#[allow(deprecated)]
|
||||||
|
let home_dir = std::env::home_dir().unwrap();
|
||||||
|
let (written, _) = this.write_path_to_c_str(&home_dir, buf, buflen)?;
|
||||||
|
let pw_dir = this.mplace_field_named(&pwd, "pw_dir")?;
|
||||||
|
this.write_pointer(buf, &pw_dir.into())?;
|
||||||
|
|
||||||
|
if written {
|
||||||
|
this.write_pointer(pwd.ptr, &result.into())?;
|
||||||
|
this.write_null(dest)?;
|
||||||
|
} else {
|
||||||
|
this.write_null(&result.into())?;
|
||||||
|
this.write_scalar(this.eval_libc("ERANGE")?, dest)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Platform-specific shims
|
// Platform-specific shims
|
||||||
_ => {
|
_ => {
|
||||||
match this.tcx.sess.target.os.as_ref() {
|
match this.tcx.sess.target.os.as_ref() {
|
||||||
|
@ -155,41 +155,6 @@ fn emulate_foreign_item_by_name(
|
|||||||
this.write_null(dest)?;
|
this.write_null(dest)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
"getpwuid_r" if this.frame_in_std() => {
|
|
||||||
let [uid, pwd, buf, buflen, result] =
|
|
||||||
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
|
||||||
this.check_no_isolation("`getpwuid_r`")?;
|
|
||||||
|
|
||||||
let uid = this.read_scalar(uid)?.to_u32()?;
|
|
||||||
let pwd = this.deref_operand(pwd)?;
|
|
||||||
let buf = this.read_pointer(buf)?;
|
|
||||||
let buflen = this.read_scalar(buflen)?.to_machine_usize(this)?;
|
|
||||||
let result = this.deref_operand(result)?;
|
|
||||||
|
|
||||||
// Must be for "us".
|
|
||||||
if uid != crate::shims::unix::UID {
|
|
||||||
throw_unsup_format!("`getpwuid_r` on other users is not supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset all fields to `uninit` to make sure nobody reads them.
|
|
||||||
this.write_uninit(&pwd.into())?;
|
|
||||||
|
|
||||||
// We only set the home_dir field.
|
|
||||||
#[allow(deprecated)]
|
|
||||||
let home_dir = std::env::home_dir().unwrap();
|
|
||||||
let (written, _) = this.write_path_to_c_str(&home_dir, buf, buflen)?;
|
|
||||||
let pw_dir = this.mplace_field_named(&pwd, "pw_dir")?;
|
|
||||||
this.write_pointer(buf, &pw_dir.into())?;
|
|
||||||
|
|
||||||
if written {
|
|
||||||
this.write_pointer(pwd.ptr, &result.into())?;
|
|
||||||
this.write_null(dest)?;
|
|
||||||
} else {
|
|
||||||
this.write_null(&result.into())?;
|
|
||||||
this.write_scalar(this.eval_libc("ERANGE")?, dest)?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_ => return Ok(EmulateByNameResult::NotSupported),
|
_ => return Ok(EmulateByNameResult::NotSupported),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
2
tests/pass/env/home.rs
vendored
2
tests/pass/env/home.rs
vendored
@ -1,4 +1,4 @@
|
|||||||
//@only-target-linux: home_dir is only supported on Linux
|
//@ignore-target-windows: home_dir is not supported on Windows
|
||||||
//@compile-flags: -Zmiri-disable-isolation
|
//@compile-flags: -Zmiri-disable-isolation
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user