diff options
| author | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2017-03-01 01:16:01 +0100 | 
|---|---|---|
| committer | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2017-03-01 01:16:01 +0100 | 
| commit | a2e4641865f5b1478c4243767abd208772a303b3 (patch) | |
| tree | eb0f2af4416bdda5e0a785785ab66301d3bd0a96 /src/blogc-make/exec.c | |
| parent | 7c24a0a338a4bfe57690d586f59c9dc40ecd01ed (diff) | |
| download | blogc-a2e4641865f5b1478c4243767abd208772a303b3.tar.gz blogc-a2e4641865f5b1478c4243767abd208772a303b3.tar.bz2 blogc-a2e4641865f5b1478c4243767abd208772a303b3.zip  | |
make: support freebsd properly. drop solaris
Diffstat (limited to 'src/blogc-make/exec.c')
| -rw-r--r-- | src/blogc-make/exec.c | 23 | 
1 files changed, 21 insertions, 2 deletions
diff --git a/src/blogc-make/exec.c b/src/blogc-make/exec.c index de37536..2fc46d8 100644 --- a/src/blogc-make/exec.c +++ b/src/blogc-make/exec.c @@ -14,6 +14,13 @@  #include <sys/wait.h>  #include <errno.h>  #include <libgen.h> + +#ifdef __FreeBSD__ +#include <limits.h> +#include <sys/types.h> +#include <sys/sysctl.h> +#endif +  #include "../common/error.h"  #include "../common/file.h"  #include "../common/utils.h" @@ -33,12 +40,24 @@ bm_exec_find_binary(const char *bin, const char *env)      // second try: same dir as current exec      char *path = realpath("/proc/self/exe", NULL);  // Linux +#ifdef __FreeBSD__      if (path == NULL) { -        path = realpath("/proc/curproc/file", NULL);  // FreeBSD +        path = realpath("/proc/curproc/file", NULL);  // FreeBSD with /proc          if (path == NULL) { -            path = realpath("/proc/self/path/a.out", NULL);  // Solaris +            // FreeBSD without /proc (default for 11.0) +            int name[4]; +            name[0] = CTL_KERN; +            name[1] = KERN_PROC; +            name[2] = KERN_PROC_PATHNAME; +            name[3] = -1; +            char buf[PATH_MAX]; +            size_t buf_len = sizeof(buf); +            if (-1 != sysctl(name, 4, buf, &buf_len, NULL, 0)) { +                path = bc_strdup_printf("%.*s", buf_len, buf); +            }          }      } +#endif      if (path != NULL) {          char *dir = bc_strdup(dirname(path));          free(path);  | 
