diff options
| -rw-r--r-- | Makefile.am | 1 | ||||
| -rw-r--r-- | src/blogc-make/ctx.c | 11 | ||||
| -rw-r--r-- | src/blogc-make/ctx.h | 5 | ||||
| -rw-r--r-- | src/blogc-make/exec.c | 20 | ||||
| -rw-r--r-- | src/blogc-make/exec.h | 7 | ||||
| -rw-r--r-- | src/blogc-make/main.c | 12 | ||||
| -rw-r--r-- | tests/blogc-make/check_atom.c | 2 | ||||
| -rw-r--r-- | tests/blogc-make/check_exec.c | 110 | ||||
| -rw-r--r-- | tests/blogc-make/check_rules.c | 2 | ||||
| -rw-r--r-- | tests/blogc-make/check_settings.c | 2 | 
10 files changed, 83 insertions, 89 deletions
diff --git a/Makefile.am b/Makefile.am index 70b7b92..8191dd9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -790,6 +790,7 @@ tests_blogc_make_check_exec_CFLAGS = \  tests_blogc_make_check_exec_LDFLAGS = \  	-no-install \ +	-Wl,--wrap=access \  	$(NULL)  tests_blogc_make_check_exec_LDADD = \ diff --git a/src/blogc-make/ctx.c b/src/blogc-make/ctx.c index 7d3489b..62b40b8 100644 --- a/src/blogc-make/ctx.c +++ b/src/blogc-make/ctx.c @@ -16,6 +16,7 @@  #include "../common/utils.h"  #include "atom.h"  #include "settings.h" +#include "exec.h"  #include "ctx.h" @@ -105,7 +106,8 @@ bm_filectx_free(bm_filectx_t *fctx)  bm_ctx_t* -bm_ctx_new(bm_ctx_t *base, const char *settings_file, bc_error_t **err) +bm_ctx_new(bm_ctx_t *base, const char *settings_file, const char *argv0, +    bc_error_t **err)  {      if (settings_file == NULL || err == NULL || *err != NULL)          return NULL; @@ -138,6 +140,9 @@ bm_ctx_new(bm_ctx_t *base, const char *settings_file, bc_error_t **err)      bm_ctx_t *rv = NULL;      if (base == NULL) {          rv = bc_malloc(sizeof(bm_ctx_t)); +        rv->blogc = bm_exec_find_binary(argv0, "blogc", "BLOGC"); +        rv->blogc_runserver = bm_exec_find_binary(argv0, "blogc-runserver", +            "BLOGC_RUNSERVER");          rv->verbose = false;      }      else { @@ -224,7 +229,7 @@ bm_ctx_reload(bm_ctx_t *ctx)          // needs to dup path, because it may be freed when reloading.          char *tmp = bc_strdup(ctx->settings_fctx->path);          bc_error_t *err = NULL; -        ctx = bm_ctx_new(ctx, tmp, &err); +        ctx = bm_ctx_new(ctx, tmp, NULL, &err);          free(tmp);          if (err != NULL) {  // failed to reload, keep old ctx              bc_error_print(err, "blogc-make"); @@ -283,5 +288,7 @@ void  bm_ctx_free(bm_ctx_t *ctx)  {      bm_ctx_free_internal(ctx); +    free(ctx->blogc); +    free(ctx->blogc_runserver);      free(ctx);  } diff --git a/src/blogc-make/ctx.h b/src/blogc-make/ctx.h index eb25145..77e8088 100644 --- a/src/blogc-make/ctx.h +++ b/src/blogc-make/ctx.h @@ -29,6 +29,8 @@ typedef struct {  } bm_filectx_t;  typedef struct { +    char *blogc; +    char *blogc_runserver;      bool verbose;      bm_settings_t *settings; @@ -49,7 +51,8 @@ bm_filectx_t* bm_filectx_new(bm_ctx_t *ctx, const char *filename);  bool bm_filectx_changed(bm_filectx_t *ctx, struct timespec *ts);  void bm_filectx_reload(bm_filectx_t *ctx);  void bm_filectx_free(bm_filectx_t *fctx); -bm_ctx_t* bm_ctx_new(bm_ctx_t *base, const char *settings_file, bc_error_t **err); +bm_ctx_t* bm_ctx_new(bm_ctx_t *base, const char *settings_file, +    const char *argv0, bc_error_t **err);  void bm_ctx_reload(bm_ctx_t *ctx);  void bm_ctx_free_internal(bm_ctx_t *ctx);  void bm_ctx_free(bm_ctx_t *ctx); diff --git a/src/blogc-make/exec.c b/src/blogc-make/exec.c index 157254b..de5dd5c 100644 --- a/src/blogc-make/exec.c +++ b/src/blogc-make/exec.c @@ -21,11 +21,9 @@  #include "exec.h"  #include "settings.h" -extern const char *argv0; -  char* -bm_exec_find_binary(const char *bin, const char *env) +bm_exec_find_binary(const char *argv0, const char *bin, const char *env)  {      // first try: env var      const char *env_bin = getenv(env); @@ -205,8 +203,9 @@ list_variables(const char *key, const char *value, bc_string_t *str)  char* -bm_exec_build_blogc_cmd(bm_settings_t *settings, bc_trie_t *variables, -    bool listing, const char *template, const char *output, bool sources_stdin) +bm_exec_build_blogc_cmd(const char *blogc_bin, bm_settings_t *settings, +    bc_trie_t *variables, bool listing, const char *template, +    const char *output, bool sources_stdin)  {      bc_string_t *rv = bc_string_new(); @@ -220,9 +219,7 @@ bm_exec_build_blogc_cmd(bm_settings_t *settings, bc_trie_t *variables,          free(tmp);      } -    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, @@ -270,8 +267,8 @@ bm_exec_blogc(bm_ctx_t *ctx, bc_trie_t *variables, bool listing,              break;      } -    char *cmd = bm_exec_build_blogc_cmd(ctx->settings, variables, listing, -        template->path, output->path, input->len > 0); +    char *cmd = bm_exec_build_blogc_cmd(ctx->blogc, ctx->settings, variables, +        listing, template->path, output->path, input->len > 0);      if (ctx->verbose)          printf("%s\n", cmd); @@ -348,10 +345,7 @@ bm_exec_blogc_runserver(bm_ctx_t *ctx, const char *host, const char *port,      bc_string_t *cmd = bc_string_new(); -    char *blogc_runserver = bm_exec_find_binary("blogc-runserver", -        "BLOGC_RUNSERVER"); -    bc_string_append(cmd, blogc_runserver); -    free(blogc_runserver); +    bc_string_append(cmd, ctx->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 ec52eec..08cc608 100644 --- a/src/blogc-make/exec.h +++ b/src/blogc-make/exec.h @@ -15,11 +15,12 @@  #include "ctx.h"  #include "settings.h" -char* bm_exec_find_binary(const char *bin, const char *env); +char* bm_exec_find_binary(const char *argv0, 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, -    bool listing, const char *template, const char *output, bool sources_stdin); +char* bm_exec_build_blogc_cmd(const char *blogc_bin, bm_settings_t *settings, +    bc_trie_t *variables, bool listing, const char *template, +    const char *output, bool sources_stdin);  int bm_exec_blogc(bm_ctx_t *ctx, bc_trie_t *variables, bool listing,      bm_filectx_t *template, bm_filectx_t *output, bc_slist_t *sources,      bool only_first_source); diff --git a/src/blogc-make/main.c b/src/blogc-make/main.c index c27c302..96f55b9 100644 --- a/src/blogc-make/main.c +++ b/src/blogc-make/main.c @@ -19,10 +19,6 @@  #include "ctx.h"  #include "rules.h" -// is this beautiful? no. but there's no point in passing something that is -// essentially global to every function in exec.c -const char *argv0 = NULL; -  static void  print_help(void) @@ -61,11 +57,6 @@ main(int argc, char **argv)  {      setlocale(LC_ALL, ""); -    // i really hope that no operating system omits argv[0], but ... -    if (argc > 0) { -        argv0 = argv[0]; -    } -      int rv = 0;      bc_error_t *err = NULL; @@ -114,7 +105,8 @@ main(int argc, char **argv)          rules = bc_slist_append(rules, bc_strdup("all"));      } -    ctx = bm_ctx_new(NULL, blogcfile ? blogcfile : "blogcfile", &err); +    ctx = bm_ctx_new(NULL, blogcfile ? blogcfile : "blogcfile", +        argc > 0 ? argv[0] : NULL, &err);      if (err != NULL) {          bc_error_print(err, "blogc-make");          rv = 3; diff --git a/tests/blogc-make/check_atom.c b/tests/blogc-make/check_atom.c index e487d30..6faa53e 100644 --- a/tests/blogc-make/check_atom.c +++ b/tests/blogc-make/check_atom.c @@ -20,8 +20,6 @@  #include "../../src/common/error.h"  #include "../../src/common/utils.h" -const char *argv0 = NULL; -  static void  test_atom_file(void **state) diff --git a/tests/blogc-make/check_exec.c b/tests/blogc-make/check_exec.c index 43ef161..febcfae 100644 --- a/tests/blogc-make/check_exec.c +++ b/tests/blogc-make/check_exec.c @@ -13,19 +13,60 @@  #include <stdlib.h>  #include <string.h> +#include <unistd.h>  #include "../../src/blogc-make/exec.h"  #include "../../src/blogc-make/settings.h"  #include "../../src/common/utils.h" -const char *argv0 = NULL; + +int +__wrap_access(const char *pathname, int mode) +{ +    assert_int_equal(mode, X_OK); +    assert_string_equal(pathname, mock_type(const char*)); +    return mock_type(int); +}  static void -test_build_blogc_cmd_with_settings(void **state) +test_find_binary(void **state)  {      unsetenv("BLOGC"); +    char *bin = bm_exec_find_binary(NULL, "blogc", "BLOGC"); +    assert_string_equal(bin, "blogc"); +    free(bin); + +    will_return(__wrap_access, "../blogc"); +    will_return(__wrap_access, 0); +    bin = bm_exec_find_binary("../blogc", "blogc", "BLOGC"); +    assert_string_equal(bin, "'../blogc'"); +    free(bin); + +    will_return(__wrap_access, "/usr/bin/blogc"); +    will_return(__wrap_access, 0); +    bin = bm_exec_find_binary("/usr/bin/blogc", "blogc", "BLOGC"); +    assert_string_equal(bin, "'/usr/bin/blogc'"); +    free(bin); + +    will_return(__wrap_access, "../blogc"); +    will_return(__wrap_access, 1); +    bin = bm_exec_find_binary("../blogc", "blogc", "BLOGC"); +    assert_string_equal(bin, "blogc"); +    free(bin); + +    setenv("BLOGC", "/path/to/blogc", 1); +    bin = bm_exec_find_binary(NULL, "blogc", "BLOGC"); +    assert_string_equal(bin, "'/path/to/blogc'"); +    free(bin); +    unsetenv("BLOGC"); +} + + +static void +test_build_blogc_cmd_with_settings(void **state) +{      bm_settings_t *settings = bc_malloc(sizeof(bm_settings_t));      settings->settings = bc_trie_new(free);      bc_trie_insert(settings->settings, "locale", bc_strdup("en_US.utf8")); @@ -35,45 +76,25 @@ test_build_blogc_cmd_with_settings(void **state)      bc_trie_t *variables = bc_trie_new(free);      bc_trie_insert(variables, "LOL", bc_strdup("HEHE")); -    char *rv = bm_exec_build_blogc_cmd(settings, variables, true, "main.tmpl", -        "foo.html", true); +    char *rv = bm_exec_build_blogc_cmd("blogc", settings, variables, true, +        "main.tmpl", "foo.html", true);      assert_string_equal(rv,          "LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ' -D LOL='HEHE' -l "          "-t 'main.tmpl' -o 'foo.html' -i");      free(rv); -    rv = bm_exec_build_blogc_cmd(settings, variables, false, NULL, NULL, false); +    rv = bm_exec_build_blogc_cmd("blogc", settings, variables, false, NULL, NULL, +        false);      assert_string_equal(rv,          "LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ' -D LOL='HEHE'");      free(rv); -    rv = bm_exec_build_blogc_cmd(settings, NULL, false, NULL, NULL, false); +    rv = bm_exec_build_blogc_cmd("blogc", settings, NULL, false, NULL, NULL, +        false);      assert_string_equal(rv,          "LC_ALL='en_US.utf8' blogc -D FOO='BAR' -D BAR='BAZ'");      free(rv); -    setenv("BLOGC", "/path/to/blogc", 1); - -    rv = bm_exec_build_blogc_cmd(settings, variables, true, "main.tmpl", -        "foo.html", true); -    assert_string_equal(rv, -        "LC_ALL='en_US.utf8' '/path/to/blogc' -D FOO='BAR' -D BAR='BAZ' " -        "-D LOL='HEHE' -l -t 'main.tmpl' -o 'foo.html' -i"); -    free(rv); - -    rv = bm_exec_build_blogc_cmd(settings, variables, false, NULL, NULL, false); -    assert_string_equal(rv, -        "LC_ALL='en_US.utf8' '/path/to/blogc' -D FOO='BAR' -D BAR='BAZ' " -        "-D LOL='HEHE'"); -    free(rv); - -    rv = bm_exec_build_blogc_cmd(settings, NULL, false, NULL, NULL, false); -    assert_string_equal(rv, -        "LC_ALL='en_US.utf8' '/path/to/blogc' -D FOO='BAR' -D BAR='BAZ'"); -    free(rv); - -    unsetenv("BLOGC"); -      bc_trie_free(variables);      bc_trie_free(settings->settings);      bc_trie_free(settings->env); @@ -81,50 +102,30 @@ test_build_blogc_cmd_with_settings(void **state)  } +  static void  test_build_blogc_cmd_without_settings(void **state)  { -    unsetenv("BLOGC"); -      bc_trie_t *variables = bc_trie_new(free);      bc_trie_insert(variables, "LOL", bc_strdup("HEHE")); -    char *rv = bm_exec_build_blogc_cmd(NULL, variables, true, "main.tmpl", -        "foo.html", true); +    char *rv = bm_exec_build_blogc_cmd("blogc", NULL, variables, true, +        "main.tmpl", "foo.html", true);      assert_string_equal(rv,          "blogc -D LOL='HEHE' -l -t 'main.tmpl' -o 'foo.html' -i");      free(rv); -    rv = bm_exec_build_blogc_cmd(NULL, variables, false, NULL, NULL, false); +    rv = bm_exec_build_blogc_cmd("blogc", NULL, variables, false, NULL, NULL, +        false);      assert_string_equal(rv,          "blogc -D LOL='HEHE'");      free(rv); -    rv = bm_exec_build_blogc_cmd(NULL, NULL, false, NULL, NULL, false); +    rv = bm_exec_build_blogc_cmd("blogc", NULL, NULL, false, NULL, NULL, false);      assert_string_equal(rv,          "blogc");      free(rv); -    setenv("BLOGC", "/path/to/blogc", 1); - -    rv = bm_exec_build_blogc_cmd(NULL, variables, true, "main.tmpl", "foo.html", -        true); -    assert_string_equal(rv, -        "'/path/to/blogc' -D LOL='HEHE' -l -t 'main.tmpl' -o 'foo.html' -i"); -    free(rv); - -    rv = bm_exec_build_blogc_cmd(NULL, variables, false, NULL, NULL, false); -    assert_string_equal(rv, -        "'/path/to/blogc' -D LOL='HEHE'"); -    free(rv); - -    rv = bm_exec_build_blogc_cmd(NULL, NULL, false, NULL, NULL, false); -    assert_string_equal(rv, -        "'/path/to/blogc'"); -    free(rv); - -    unsetenv("BLOGC"); -      bc_trie_free(variables);  } @@ -133,6 +134,7 @@ int  main(void)  {      const UnitTest tests[] = { +        unit_test(test_find_binary),          unit_test(test_build_blogc_cmd_with_settings),          unit_test(test_build_blogc_cmd_without_settings),      }; diff --git a/tests/blogc-make/check_rules.c b/tests/blogc-make/check_rules.c index 773ff06..c8bd9a8 100644 --- a/tests/blogc-make/check_rules.c +++ b/tests/blogc-make/check_rules.c @@ -17,8 +17,6 @@  #include "../../src/blogc-make/rules.h"  #include "../../src/common/utils.h" -const char *argv0 = NULL; -  static void  test_rule_parse_args(void **state) diff --git a/tests/blogc-make/check_settings.c b/tests/blogc-make/check_settings.c index 3bdc9c5..93aed59 100644 --- a/tests/blogc-make/check_settings.c +++ b/tests/blogc-make/check_settings.c @@ -18,8 +18,6 @@  #include "../../src/common/error.h"  #include "../../src/common/utils.h" -const char *argv0 = NULL; -  static void  test_settings_empty(void **state)  | 
