From: Volker Schlecht Subject: Re: devel/libuv: use getexecpath(3) To: ports Date: Tue, 8 Sep 2026 20:47:12 +0200 ... alternatively, here's a simple wrapper around getexecpath(3), with adjusted test cases to document where we deviate from upstream's default behavior - might be harder to upstream once 8.0 is released, but it's worth a shot. On 9/8/26 7:46 PM, Volker Schlecht wrote: > Here's an attempt to switch libuv to getexecpath(3). > > It builds, tests pass, afaict it behaves the same as the other > implementations (i.e. it copies a truncated path and no error > when the path doesn't fit into the buffer). > > In lang/node it allows me to drop the current workaround to make > process.execPath work. > > It could probably use some adult supervision, though ... Index: Makefile =================================================================== RCS file: /cvs/ports/devel/libuv/Makefile,v retrieving revision 1.34 diff -u -p -r1.34 Makefile --- Makefile 8 Mar 2026 15:14:43 -0000 1.34 +++ Makefile 8 Sep 2026 18:41:50 -0000 @@ -4,6 +4,7 @@ VER = 1.52.1 DISTNAME = libuv-v${VER} PKGNAME = libuv-${VER} CATEGORIES = devel +REVISION = 0 SHARED_LIBS += uv 5.3 # 1.0 Index: patches/patch-src_unix_openbsd_c =================================================================== RCS file: patches/patch-src_unix_openbsd_c diff -N patches/patch-src_unix_openbsd_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_unix_openbsd_c 8 Sep 2026 18:41:50 -0000 @@ -0,0 +1,25 @@ +Index: src/unix/openbsd.c +--- src/unix/openbsd.c.orig ++++ src/unix/openbsd.c +@@ -59,15 +59,17 @@ void uv_loadavg(double avg[3]) { + + + int uv_exepath(char* buffer, size_t* size) { ++ + if (buffer == NULL || size == NULL || *size == 0) + return UV_EINVAL; + +- if (uv_saved_argv0 == NULL) +- return UV_EINVAL; ++ if (getexecpath(buffer, *size) == -1) ++ return UV__ERR(errno); + +- return uv__search_path(uv_saved_argv0, buffer, size); +-} ++ *size = strlen(buffer); + ++ return 0; ++} + + uint64_t uv_get_free_memory(void) { + struct uvmexp info; Index: patches/patch-test_test-get-currentexe_c =================================================================== RCS file: patches/patch-test_test-get-currentexe_c diff -N patches/patch-test_test-get-currentexe_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-test_test-get-currentexe_c 8 Sep 2026 18:41:50 -0000 @@ -0,0 +1,33 @@ +On OpenBSD we expect an error instead of a silently truncated result in +all cases in which the buffer size is too small to hold the path. + +Index: test/test-get-currentexe.c +--- test/test-get-currentexe.c.orig ++++ test/test-get-currentexe.c +@@ -75,18 +75,26 @@ TEST_IMPL(get_currentexe) { + + size = 1; + r = uv_exepath(buffer, &size); ++#ifndef __OpenBSD__ + ASSERT_OK(r); + ASSERT_OK(size); + ASSERT_EQ(buffer[0], '\0'); ++#else ++ ASSERT(r); ++#endif + + memset(buffer, -1, sizeof(buffer)); + + size = 2; + r = uv_exepath(buffer, &size); ++#ifndef __OpenBSD__ + ASSERT_OK(r); + ASSERT_EQ(1, size); + ASSERT_NE(buffer[0], '\0'); + ASSERT_EQ(buffer[1], '\0'); ++#else ++ ASSERT(r); ++#endif + + /* Verify uv_exepath is not affected by uv_set_process_title(). */ + r = uv_set_process_title("foobar");