diff options
Diffstat (limited to 'src/blogc-make')
| -rw-r--r-- | src/blogc-make/exec.c | 63 | ||||
| -rw-r--r-- | src/blogc-make/exec.h | 1 | 
2 files changed, 44 insertions, 20 deletions
| diff --git a/src/blogc-make/exec.c b/src/blogc-make/exec.c index 7614151..de37536 100644 --- a/src/blogc-make/exec.c +++ b/src/blogc-make/exec.c @@ -13,6 +13,7 @@  #include <unistd.h>  #include <sys/wait.h>  #include <errno.h> +#include <libgen.h>  #include "../common/error.h"  #include "../common/file.h"  #include "../common/utils.h" @@ -21,6 +22,41 @@  #include "settings.h" +char* +bm_exec_find_binary(const char *bin, const char *env) +{ +    // first try: env var +    const char *env_bin = getenv(env); +    if (env_bin != NULL) { +        return bc_shell_quote(env_bin); +    } + +    // second try: same dir as current exec +    char *path = realpath("/proc/self/exe", NULL);  // Linux +    if (path == NULL) { +        path = realpath("/proc/curproc/file", NULL);  // FreeBSD +        if (path == NULL) { +            path = realpath("/proc/self/path/a.out", NULL);  // Solaris +        } +    } +    if (path != NULL) { +        char *dir = bc_strdup(dirname(path)); +        free(path); +        char *tmp = bc_strdup_printf("%s/%s", dir, bin); +        free(dir); +        if (0 == access(tmp, X_OK)) { +            char *rv = bc_shell_quote(tmp); +            free(tmp); +            return rv; +        } +        free(tmp); +    } + +    // last try: $PATH +    return bc_strdup(bin); +} + +  int  bm_exec_command(const char *cmd, const char *input, char **output,      char **error, bc_error_t **err) @@ -181,16 +217,9 @@ bm_exec_build_blogc_cmd(bm_settings_t *settings, bc_trie_t *variables,          free(tmp);      } -    // use blogc binary from environment, if provided -    const char *blogc_bin = getenv("BLOGC"); -    if (blogc_bin != NULL) { -        char *tmp = bc_shell_quote(blogc_bin); -        bc_string_append(rv, tmp); -        free(tmp); -    } -    else { -        bc_string_append(rv, "blogc"); -    } +    char *blogc_bin = bm_exec_find_binary("blogc", "BLOGC"); +    bc_string_append(rv, blogc_bin); +    free(blogc_bin);      if (settings != NULL) {          bc_trie_foreach(settings->env, @@ -310,16 +339,10 @@ bm_exec_blogc_runserver(const char *output_dir, const char *host,  {      bc_string_t *cmd = bc_string_new(); -    // use blogc-runserver binary from environment, if provided -    const char *blogc_runserver = getenv("BLOGC_RUNSERVER"); -    if (blogc_runserver != NULL) { -        char *tmp = bc_shell_quote(blogc_runserver); -        bc_string_append(cmd, tmp); -        free(tmp); -    } -    else { -        bc_string_append(cmd, "blogc-runserver"); -    } +    char *blogc_runserver = bm_exec_find_binary("blogc-runserver", +        "BLOGC_RUNSERVER"); +    bc_string_append(cmd, blogc_runserver); +    free(blogc_runserver);      if (host != NULL) {          char *tmp = bc_shell_quote(host); diff --git a/src/blogc-make/exec.h b/src/blogc-make/exec.h index 5bb37d0..901e53d 100644 --- a/src/blogc-make/exec.h +++ b/src/blogc-make/exec.h @@ -15,6 +15,7 @@  #include "ctx.h"  #include "settings.h" +char* bm_exec_find_binary(const char *bin, const char *env);  int bm_exec_command(const char *cmd, const char *input, char **output,      char **error, bc_error_t **err);  char* bm_exec_build_blogc_cmd(bm_settings_t *settings, bc_trie_t *variables, | 
