about summary refs log tree commit diff
path: root/src/libstd/sys/unix
diff options
context:
space:
mode:
authorJohn Colanduoni <john@colanduoni.com>2017-08-09 22:09:59 -0700
committerkennytm <kennytm@gmail.com>2017-09-02 03:24:17 +0800
commit09f572b7dccb65ba148d42070f65663c947f93a3 (patch)
tree83b92a998b4a01117eb0ff02f90784b5f4466014 /src/libstd/sys/unix
parente3de40e72f0f6b2dba54388d05e94e2c145cec6d (diff)
downloadrust-09f572b7dccb65ba148d42070f65663c947f93a3.tar.gz
rust-09f572b7dccb65ba148d42070f65663c947f93a3.zip
Use env::current_exe for libbacktrace on macOS
Diffstat (limited to 'src/libstd/sys/unix')
-rw-r--r--src/libstd/sys/unix/backtrace/mod.rs27
1 files changed, 7 insertions, 20 deletions
diff --git a/src/libstd/sys/unix/backtrace/mod.rs b/src/libstd/sys/unix/backtrace/mod.rs
index 5bb34fe60cc..b5bf20c747b 100644
--- a/src/libstd/sys/unix/backtrace/mod.rs
+++ b/src/libstd/sys/unix/backtrace/mod.rs
@@ -104,28 +104,15 @@ pub mod gnu {
 
     #[cfg(any(target_os = "macos", target_os = "ios"))]
     pub fn get_executable_filename() -> io::Result<(Vec<c_char>, fs::File)> {
-        use ptr;
-        use slice;
-        use ffi::OsStr;
+        use env;
         use os::unix::ffi::OsStrExt;
-        use libc::c_int;
 
-        extern {
-            fn _NSGetExecutablePath(buf: *mut c_char,
-                                    bufsize: *mut u32) -> c_int;
-        }
-        unsafe {
-            let mut bufsize: u32 = 0;
-            _NSGetExecutablePath(ptr::null_mut(), &mut bufsize);
-            if bufsize == 0 { return Err(io::Error::last_os_error()); }
-            let mut buffer: Vec<c_char> = Vec::with_capacity(bufsize as usize);
-            let ret = _NSGetExecutablePath(buffer.as_mut_ptr(), &mut bufsize);
-            if ret != 0 { return Err(io::Error::last_os_error()); }
-            buffer.set_len(bufsize as usize);
-            let file = fs::File::open(OsStr::from_bytes(
-                    slice::from_raw_parts(buffer.as_ptr() as *const u8, buffer.len()-1)))?;
-            Ok((buffer, file))
-        }
+        let filename = env::current_exe()?;
+        let file = fs::File::open(&filename)?;
+        let mut filename_cstr: Vec<_> = filename.as_os_str().as_bytes().iter()
+            .map(|&x| x as c_char).collect();
+        filename_cstr.push(0); // Null terminate
+        Ok((filename_cstr, file))
     }
 }