
Also, don't rely on /proc being mounted: many users don't mount proc.
Code: Select all
diff --git a/src/getself.c b/src/getself.c
index 88e3ab4d5..a6933b7e0 100644
--- a/src/getself.c
+++ b/src/getself.c
@@ -42,24 +42,25 @@ int get_number_cpus()
#elif defined(SELFEXE_BSD)
#include <limits.h>
#include <stdlib.h>
+#include <unistd.h>
+#include <sys/sysctl.h>
+
const char *get_self_executable(int argc, char **argv)
{
static char res[PATH_MAX];
- // Like linux, but /proc is not always mounted
- // return 0 if it's not
- if (realpath("/proc/curproc/file", res)) return NULL;
+ int mib[4];
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PATHNAME;
+ mib[3] = -1;
+ size_t cb = sizeof(res);
+ sysctl(mib,4,res,&cb,NULL,0);
return res;
}
-#import <sys/sysctl.h>
-
int get_number_cpus()
{
- int count;
- size_t size=sizeof(count);
-
- if (sysctlbyname("hw.ncpu",&count,&size,NULL,0)) return 1;
- return count;
+ return sysconf(_SC_NPROCESSORS_ONLN);
}
#elif defined(SELFEXE_WINDOWS)