From 6164860c73613cd20ed179e6d92f9fe45c97c0b2 Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Mon, 20 Apr 2015 03:52:36 -0300 Subject: create output directories recursively --- src/main.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 9d3eb5c..7a7197a 100644 --- a/src/main.c +++ b/src/main.c @@ -10,6 +10,14 @@ #include #endif /* HAVE_CONFIG_H */ +#ifdef HAVE_SYS_STAT_H +#include +#endif /* HAVE_SYS_STAT_H */ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif /* HAVE_SYS_TYPES_H */ + #include #include #include @@ -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", -- cgit v1.2.3-18-g5258