From: Kirill A. Korinsky Subject: lang/rust: migrate to getexecpath() To: Sebastien Marie , OpenBSD ports Date: Thu, 03 Sep 2026 23:22:19 +0200 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 { - 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 { + + #[cfg(target_os = "openbsd")] + pub fn current_exe() -> io::Result { ++ 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