Skip to content

Commit

Permalink
os current_exe using same approach as linux to get always the full ab…
Browse files Browse the repository at this point in the history
…solute path

but in case of failure (e.g. prcfs not mounted) still using
getexecname.
  • Loading branch information
devnexen committed Aug 2, 2021
1 parent b289bb7 commit cb4519e
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions library/std/src/sys/unix/os.rs
Expand Up @@ -368,20 +368,24 @@ pub fn current_exe() -> io::Result<PathBuf> {

#[cfg(any(target_os = "solaris", target_os = "illumos"))]
pub fn current_exe() -> io::Result<PathBuf> {
extern "C" {
fn getexecname() -> *const c_char;
}
unsafe {
let path = getexecname();
if path.is_null() {
Err(io::Error::last_os_error())
} else {
let filename = CStr::from_ptr(path).to_bytes();
let path = PathBuf::from(<OsStr as OsStrExt>::from_bytes(filename));
if let Ok(path) = crate::fs::read_link("/proc/self/path/a.out") {
Ok(path)
} else {
extern "C" {
fn getexecname() -> *const c_char;
}
unsafe {
let path = getexecname();
if path.is_null() {
Err(io::Error::last_os_error())
} else {
let filename = CStr::from_ptr(path).to_bytes();
let path = PathBuf::from(<OsStr as OsStrExt>::from_bytes(filename));

// Prepend a current working directory to the path if
// it doesn't contain an absolute pathname.
if filename[0] == b'/' { Ok(path) } else { getcwd().map(|cwd| cwd.join(path)) }
// Prepend a current working directory to the path if
// it doesn't contain an absolute pathname.
if filename[0] == b'/' { Ok(path) } else { getcwd().map(|cwd| cwd.join(path)) }
}
}
}
}
Expand Down

0 comments on commit cb4519e

Please sign in to comment.