On Fri, 04 Sep 2026 08:17:19 +0200,
Sebastien Marie <[email protected]> wrote:
> 
> 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.
>

Sure, just include it into your update.

And yes, it is not right diff for upstream, but adding it to libc and all
friends in ports seems wrong.

> 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
> 

-- 
wbr, Kirill

Reply via email to