Sebastien,

I'd like to migrate our rust to use of getexecpath(), it should allow to
drop a lot of patches to remove usage of current_exe()

I plan to upstream it as soon as 8.0 is released.

Briefly tested on -current/amd64

Ok?

Index: Makefile
===================================================================
RCS file: /home/cvs/ports/lang/rust/Makefile,v
diff -u -p -r1.252 Makefile
--- Makefile    26 Aug 2026 17:25:14 -0000      1.252
+++ Makefile    3 Sep 2026 20:49:45 -0000
@@ -13,6 +13,7 @@ COMMENT-bootstrap =   Rust binary bootstra
 COMMENT-src =          Rust source component
 
 V =                    1.98.0
+REVISION =             0
 DISTNAME =             rustc-${V}-src
 
 # always keep REVISION-bootstrap in sync with REVISION-main (if defined)
Index: patches/patch-library_std_src_sys_paths_unix_rs
===================================================================
RCS file: 
/home/cvs/ports/lang/rust/patches/patch-library_std_src_sys_paths_unix_rs,v
diff -u -p -r1.1 patch-library_std_src_sys_paths_unix_rs
--- patches/patch-library_std_src_sys_paths_unix_rs     3 Jun 2026 11:15:20 
-0000       1.1
+++ patches/patch-library_std_src_sys_paths_unix_rs     3 Sep 2026 20:48:28 
-0000
@@ -1,21 +1,37 @@
-argv0 isn't suitable as current_exe() in all cases.
+Implement support of getexecpath()
 
 Index: library/std/src/sys/paths/unix.rs
 --- library/std/src/sys/paths/unix.rs.orig
 +++ library/std/src/sys/paths/unix.rs
-@@ -240,13 +240,13 @@ pub fn current_exe() -> io::Result<PathBuf> {
-         cvt(libc::sysctl(mib, 4, argv.as_mut_ptr() as *mut _, &mut argv_len, 
ptr::null_mut(), 0))?;
-         argv.set_len(argv_len as usize);
-         if argv[0].is_null() {
+@@ -231,23 +231,15 @@ pub fn current_exe() -> io::Result<PathBuf> {
+ 
+ #[cfg(target_os = "openbsd")]
+ pub fn current_exe() -> io::Result<PathBuf> {
++    unsafe extern "C" {
++        fn getexecpath(buf: *mut c_char, bufsize: libc::size_t) -> c_int;
++    }
++
++    let mut path = vec![0; libc::PATH_MAX as usize];
+     unsafe {
+-        let mut mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, libc::getpid(), 
libc::KERN_PROC_ARGV];
+-        let mib = mib.as_mut_ptr();
+-        let mut argv_len = 0;
+-        cvt(libc::sysctl(mib, 4, ptr::null_mut(), &mut argv_len, 
ptr::null_mut(), 0))?;
+-        let mut argv = Vec::<*const libc::c_char>::with_capacity(argv_len as 
usize);
+-        cvt(libc::sysctl(mib, 4, argv.as_mut_ptr() as *mut _, &mut argv_len, 
ptr::null_mut(), 0))?;
+-        argv.set_len(argv_len as usize);
+-        if argv[0].is_null() {
 -            return Err(io::const_error!(io::ErrorKind::Uncategorized, "no 
current exe available"));
-+            return Err(io::const_error!(io::ErrorKind::Uncategorized, "no 
current exe available (null)"));
-         }
-         let argv0 = CStr::from_ptr(argv[0]).to_bytes();
-         if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') {
-             crate::fs::canonicalize(OsStr::from_bytes(argv0))
-         } else {
+-        }
+-        let argv0 = CStr::from_ptr(argv[0]).to_bytes();
+-        if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') {
+-            crate::fs::canonicalize(OsStr::from_bytes(argv0))
+-        } else {
 -            Ok(PathBuf::from(OsStr::from_bytes(argv0)))
-+            Err(io::const_error!(io::ErrorKind::Uncategorized, "no current 
exe available (short)"))
-         }
+-        }
++        cvt(getexecpath(path.as_mut_ptr(), path.len()))?;
++        let path = CStr::from_ptr(path.as_ptr()).to_bytes();
++        Ok(PathBuf::from(OsStr::from_bytes(path)))
      }
  }
+ 


-- 
wbr, Kirill

Reply via email to