diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 45 |
1 files changed, 45 insertions, 0 deletions
@@ -10,6 +10,14 @@ #include <config.h> #endif /* HAVE_CONFIG_H */ +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif /* HAVE_SYS_STAT_H */ + +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif /* HAVE_SYS_TYPES_H */ + #include <errno.h> #include <stdbool.h> #include <stdio.h> @@ -47,6 +55,42 @@ blogc_print_usage(void) } +static void +blogc_mkdir_recursive(const char *filename) +{ +#if defined(HAVE_SYS_STAT_H) && defined(HAVE_SYS_TYPES_H) + // honor umask if possible + mode_t m = umask(0); + umask(m); + mode_t mode = (S_IRWXU | S_IRWXG | S_IRWXO) & ~m; +#endif + char *fname = b_strdup(filename); + + for (char *tmp = fname; *tmp != '\0'; tmp++) { + if (*tmp == '/' || *tmp == '\\') { +#if defined(HAVE_SYS_STAT_H) && defined(HAVE_SYS_TYPES_H) + char bkp = *tmp; + *tmp = '\0'; + if ((strlen(fname) > 0) && (-1 == mkdir(fname, mode)) && (errno != EEXIST)) { + fprintf(stderr, "blogc: error: failed to create output " + "directory (%s): %s\n", fname, strerror(errno)); + free(fname); + exit(2); + } + *tmp = bkp; +#else + // FIXME: show this warning only if actually trying to create a directory. + fprintf(stderr, "blogc: warning: can't create output directories " + "for your platform. please create the directories yourself.\n"); + goto cleanup; +#endif + } + } +cleanup: + free(fname); +} + + int main(int argc, char **argv) { @@ -110,6 +154,7 @@ main(int argc, char **argv) FILE *fp = stdout; if (!write_to_stdout) { + blogc_mkdir_recursive(output); fp = fopen(output, "w"); if (fp == NULL) { fprintf(stderr, "blogc: error: failed to open output file (%s): %s\n", |