From d71787ab69f57072dbc9f555d0f4897e11360bfd Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sat, 30 Apr 2016 01:18:42 -0500 Subject: [PATCH] librb: rb_path_to_self(): use sysctl(2) interface on freebsd/dragonfly --- librb/src/unix.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/librb/src/unix.c b/librb/src/unix.c index a929abfb..9cb84512 100644 --- a/librb/src/unix.c +++ b/librb/src/unix.c @@ -40,6 +40,11 @@ #include #endif +#if defined(__FreeBSD__) || defined(__DragonFly__) +#include +#include +#endif + #if defined(HAVE_SPAWN_H) && defined(HAVE_POSIX_SPAWN) #include @@ -159,6 +164,7 @@ const char * rb_path_to_self(void) { static char path_buf[4096]; + size_t path_len = sizeof(path_buf); #if defined(HAVE_GETEXECNAME) char *s = getexecname(); if (s == NULL) @@ -166,7 +172,12 @@ rb_path_to_self(void) realpath(s, path_buf); return path_buf; #elif defined(__linux__) - if (readlink("/proc/self/exe", path_buf, sizeof path_buf) != -1) + if (readlink("/proc/self/exe", path_buf, path_len) != -1) + return path_buf; + return NULL; +#elif defined(__FreeBSD__) || defined(__DragonFly__) + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; + if (sysctl(mib, 4, path_buf, &path_len, NULL, 0) == 0) return path_buf; return NULL; #elif defined(HAVE_DLINFO)