Kirill A. Korinsky <[email protected]> writes:
> 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?
Several comments:
- the diff is almost fine for ports (it would also need
_SYSTEM_VERSION-rust bump too, as it modifies libstd which is
statically compiled in all rust ports)
- but the diff is *not* fine for upstream. getexecpath() should be
introduced via libc rust crate.
Please also note it would be fine if we synchronize as 1.98.1 has been
released and I would like to commit it soon. I would permit to avoid
bumping twice in a row the whole rust ecosystem in ports.
Regards.
> 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)))
> }
> }
> +
--
Sebastien Marie