diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/blogc-git-receiver/post-receive.c | 75 | ||||
| -rw-r--r-- | src/blogc-git-receiver/post-receive.h | 4 | ||||
| -rw-r--r-- | src/blogc-git-receiver/pre-receive.c | 12 | ||||
| -rw-r--r-- | src/blogc-git-receiver/settings.c | 99 | ||||
| -rw-r--r-- | src/blogc-git-receiver/settings.h | 18 | ||||
| -rw-r--r-- | src/blogc-git-receiver/shell.c | 19 | 
6 files changed, 138 insertions, 89 deletions
diff --git a/src/blogc-git-receiver/post-receive.c b/src/blogc-git-receiver/post-receive.c index 93cae25..23d4dae 100644 --- a/src/blogc-git-receiver/post-receive.c +++ b/src/blogc-git-receiver/post-receive.c @@ -16,32 +16,8 @@  #include "../common/config-parser.h"  #include "../common/error.h"  #include "../common/file.h" - - -char* -bgr_post_receive_get_config_section(bc_config_t *config, const char *repo_path, -    const char *home) -{ -    char *rv = NULL; -    char** sections = bc_config_list_sections(config); -    for (size_t i = 0; sections[i] != NULL; i++) { -        if (bc_str_starts_with(sections[i], "repo:")) { -            char *tmp_repo = bc_strdup_printf("%s/repos/%s", home, sections[i] + 5); -            char *real_tmp_repo = realpath(tmp_repo, NULL);  // maybe not needed -            free(tmp_repo); -            if (real_tmp_repo == NULL) -                continue; -            if (0 == strcmp(real_tmp_repo, repo_path)) { -                rv = bc_strdup(sections[i]); -                free(real_tmp_repo); -                break; -            } -            free(real_tmp_repo); -        } -    } -    bc_strv_free(sections); -    return rv; -} +#include "settings.h" +#include "post-receive.h"  int @@ -76,56 +52,21 @@ bgr_post_receive_hook(int argc, char *argv[])          goto push;      } -    char *home = getenv("BLOGC_GIT_RECEIVER_BASEDIR"); -    if (home == NULL) { -        home = getenv("HOME"); -    } -    if (home == NULL) { -        fprintf(stderr, "warning: failed to find user home path, " -            "mirroring disabled\n"); -        goto cleanup; -    } - -    char *config_file = bc_strdup_printf("%s/blogc-git-receiver.ini", home); -    if ((0 != access(config_file, F_OK))) { +    bc_config_t *config = bgr_settings_parse(); +    if (config == NULL) {          fprintf(stderr, "warning: repository mirroring disabled\n"); -        free(config_file); -        goto cleanup; -    } - -    size_t len; -    bc_error_t *err = NULL; -    char* config_content = bc_file_get_contents(config_file, true, &len, &err); -    if (err != NULL) { -        fprintf(stderr, "warning: failed to read configuration file (%s), " -            "mirroring disabled: %s\n", config_file, err->msg); -        bc_error_free(err); -        free(config_file); -        free(config_content); -        goto cleanup; -    } - -    bc_config_t *config = bc_config_parse(config_content, len, NULL, &err); -    free(config_content); -    if (err != NULL) { -        fprintf(stderr, "warning: failed to parse configuration file (%s), " -            "mirroring disabled: %s\n", config_file, err->msg); -        bc_error_free(err); -        free(config_file);          goto cleanup;      } -    free(config_file); -    char *config_section = bgr_post_receive_get_config_section(config, repo_path, -        home); -    if (config_section == NULL) { +    char *section = bgr_settings_get_section(config, repo_path); +    if (section == NULL) {          fprintf(stderr, "warning: repository mirroring disabled\n");          bc_config_free(config);          goto cleanup;      } -    mirror = bc_strdup(bc_config_get(config, config_section, "mirror")); -    free(config_section); +    mirror = bc_strdup(bc_config_get(config, section, "mirror")); +    free(section);      bc_config_free(config);      if (mirror == NULL) { diff --git a/src/blogc-git-receiver/post-receive.h b/src/blogc-git-receiver/post-receive.h index 97f7c82..3676541 100644 --- a/src/blogc-git-receiver/post-receive.h +++ b/src/blogc-git-receiver/post-receive.h @@ -9,10 +9,6 @@  #ifndef _POST_RECEIVE_H  #define _POST_RECEIVE_H -#include "../common/config-parser.h" - -char* bgr_post_receive_get_config_section(bc_config_t *config, -    const char *repo_path, const char *home);  int bgr_post_receive_hook(int argc, char *argv[]);  #endif /* _POST_RECEIVE_H */ diff --git a/src/blogc-git-receiver/pre-receive.c b/src/blogc-git-receiver/pre-receive.c index 20c6738..3668f8b 100644 --- a/src/blogc-git-receiver/pre-receive.c +++ b/src/blogc-git-receiver/pre-receive.c @@ -18,6 +18,7 @@  #include "../common/compat.h"  #include "../common/utils.h"  #include "../common/stdin.h" +#include "settings.h"  #include "pre-receive-parser.h"  #include "pre-receive.h" @@ -177,18 +178,15 @@ bgr_pre_receive_hook(int argc, char *argv[])          goto cleanup;      } -    char *home = getenv("BLOGC_GIT_RECEIVER_BASEDIR"); -    if (home == NULL) { -        home = getenv("HOME"); -    } -    if (home == NULL) { -        fprintf(stderr, "error: failed to find user home path\n"); +    const char *bd = bgr_settings_get_basedir(); +    if (bd == NULL) { +        fprintf(stderr, "error: failed to find user base directory path\n");          rv = 3;          goto cleanup;      }      unsigned long epoch = time(NULL); -    output_dir = bc_strdup_printf("%s/builds/%s-%lu", home, master, epoch); +    output_dir = bc_strdup_printf("%s/builds/%s-%lu", bd, master, epoch);      if (0 == access(output_dir, F_OK)) {          char *tmp = output_dir; diff --git a/src/blogc-git-receiver/settings.c b/src/blogc-git-receiver/settings.c new file mode 100644 index 0000000..514fcdf --- /dev/null +++ b/src/blogc-git-receiver/settings.c @@ -0,0 +1,99 @@ +/* + * blogc: A blog compiler. + * Copyright (C) 2014-2017 Rafael G. Martins <rafael@rafaelmartins.eng.br> + * + * This program can be distributed under the terms of the BSD License. + * See the file LICENSE. + */ + +#include <stdio.h> +#include <libgen.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> +#include "../common/utils.h" +#include "../common/config-parser.h" +#include "../common/error.h" +#include "../common/file.h" +#include "settings.h" + + +const char* +bgr_settings_get_basedir(void) +{ +    char *rv = getenv("BLOGC_GIT_RECEIVER_BASEDIR"); +    if (rv != NULL) { +        return rv; +    } +    return getenv("HOME"); +} + + +char* +bgr_settings_get_section(bc_config_t *config, const char *repo_path) +{ +    const char *bd = bgr_settings_get_basedir(); +    if (bd == NULL) { +        return NULL; +    } +    char *rv = NULL; +    char** sections = bc_config_list_sections(config); +    for (size_t i = 0; sections[i] != NULL; i++) { +        if (bc_str_starts_with(sections[i], "repo:")) { +            char *tmp_repo = bc_strdup_printf("%s/repos/%s", bd, sections[i] + 5); +            char *real_tmp_repo = realpath(tmp_repo, NULL);  // maybe not needed +            free(tmp_repo); +            if (real_tmp_repo == NULL) +                continue; +            if (0 == strcmp(real_tmp_repo, repo_path)) { +                rv = bc_strdup(sections[i]); +                free(real_tmp_repo); +                break; +            } +            free(real_tmp_repo); +        } +    } +    bc_strv_free(sections); +    return rv; +} + + +bc_config_t* +bgr_settings_parse(void) +{ +    const char *bd = bgr_settings_get_basedir(); +    if (bd == NULL) { +        return NULL; +    } +    char *config_file = bc_strdup_printf("%s/blogc-git-receiver.ini", bd); +    if ((0 != access(config_file, F_OK))) { +        free(config_file); +        return NULL; +    } + +    size_t len; +    bc_error_t *err = NULL; +    char* config_content = bc_file_get_contents(config_file, true, &len, &err); +    if (err != NULL) { +        fprintf(stderr, "warning: failed to read configuration file (%s): %s\n", +            config_file, err->msg); +        bc_error_free(err); +        free(config_file); +        free(config_content); +        return NULL; +    } + +    bc_config_t *config = bc_config_parse(config_content, len, NULL, &err); +    free(config_content); +    if (err != NULL) { +        fprintf(stderr, "warning: failed to parse configuration file (%s): %s\n", +            config_file, err->msg); +        bc_error_free(err); +        free(config_file); +        return NULL; +    } +    free(config_file); + +    return config; +} diff --git a/src/blogc-git-receiver/settings.h b/src/blogc-git-receiver/settings.h new file mode 100644 index 0000000..1b89d0f --- /dev/null +++ b/src/blogc-git-receiver/settings.h @@ -0,0 +1,18 @@ +/* + * blogc: A blog compiler. + * Copyright (C) 2014-2017 Rafael G. Martins <rafael@rafaelmartins.eng.br> + * + * This program can be distributed under the terms of the BSD License. + * See the file LICENSE. + */ + +#ifndef _SETTINGS_H +#define _SETTINGS_H + +#include "../common/config-parser.h" + +const char* bgr_settings_get_basedir(void); +char* bgr_settings_get_section(bc_config_t *config, const char *repo_path); +bc_config_t* bgr_settings_parse(void); + +#endif /* _SETTINGS_H */ diff --git a/src/blogc-git-receiver/shell.c b/src/blogc-git-receiver/shell.c index eb859e8..f2eaf32 100644 --- a/src/blogc-git-receiver/shell.c +++ b/src/blogc-git-receiver/shell.c @@ -14,6 +14,7 @@  #include <errno.h>  #include <sys/stat.h>  #include "../common/utils.h" +#include "settings.h"  #include "shell-command-parser.h"  #include "shell.h" @@ -34,13 +35,10 @@ bgr_shell(int argc, char *argv[])          goto cleanup;      } -    // get home path -    char *home = getenv("BLOGC_GIT_RECEIVER_BASEDIR"); -    if (home == NULL) { -        home = getenv("HOME"); -    } -    if (home == NULL) { -        fprintf(stderr, "error: failed to find user home path\n"); +    // get base dir path +    const char *bd = bgr_settings_get_basedir(); +    if (bd == NULL) { +        fprintf(stderr, "error: failed to find base directory path\n");          rv = 3;          goto cleanup;      } @@ -53,7 +51,7 @@ bgr_shell(int argc, char *argv[])          goto cleanup;      } -    repo = bc_strdup_printf("%s/repos/%s", home, tmp_repo); +    repo = bc_strdup_printf("%s/repos/%s", bd, tmp_repo);      quoted_repo = bc_shell_quote(repo);      free(tmp_repo); @@ -132,9 +130,8 @@ bgr_shell(int argc, char *argv[])  git_exec: -    if (0 != chdir(home)) { -        fprintf(stderr, "error: failed to chdir (%s): %s\n", home, -            strerror(errno)); +    if (0 != chdir(bd)) { +        fprintf(stderr, "error: failed to chdir (%s): %s\n", bd, strerror(errno));          rv = 3;          goto cleanup;      }  | 
