]> jfr.im git - solanum.git/blobdiff - librb/src/unix.c
Merge pull request #278 from edk0/override
[solanum.git] / librb / src / unix.c
index 521f5329858b9cd81b7621dcdbc7ede7a36307d6..0fab90a9c26eb2dba138ad3d80c1abb682886748 100644 (file)
 #include <crt_externs.h>
 #endif
 
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#endif
+
 #if defined(HAVE_SPAWN_H) && defined(HAVE_POSIX_SPAWN)
 #include <spawn.h>
 
@@ -159,14 +164,20 @@ 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)
                return NULL;
        realpath(s, path_buf);
        return path_buf;
-#elif defined(__linux__)
-       if (readlink("/proc/self/exe", path_buf, sizeof path_buf) != -1)
+#elif defined(__linux__) || (defined(__FreeBSD__) && !defined(KERN_PROC_PATHNAME))
+       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)
@@ -175,6 +186,7 @@ rb_path_to_self(void)
        if (map == NULL)
                return NULL;
        realpath(map->l_name, path_buf);
+       return path_buf;
 #elif defined(__APPLE__)
        char tmp_path[4096];
        uint32_t pathlen = 4096;
@@ -184,6 +196,8 @@ rb_path_to_self(void)
 
        realpath(tmp_path, path_buf);
        return path_buf;
+#else
+       return NULL;
 #endif
 }