summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/misc.c33
-rw-r--r--src/core/misc.h3
-rw-r--r--src/fe-common/core/fe-log.c2
3 files changed, 37 insertions, 1 deletions
diff --git a/src/core/misc.c b/src/core/misc.c
index b1e2521a..e3762e2f 100644
--- a/src/core/misc.c
+++ b/src/core/misc.c
@@ -337,6 +337,39 @@ int regexp_match(const char *str, const char *regexp)
return ret == 0;
}
+/* Create the directory and all it's parent directories */
+int mkpath(const char *path, int mode)
+{
+ struct stat statbuf;
+ const char *p;
+ char *dir;
+
+ g_return_val_if_fail(path != NULL, -1);
+
+ p = g_path_skip_root((char *) path);
+ for (;;) {
+ if (*p != G_DIR_SEPARATOR && *p != '\0') {
+ p++;
+ continue;
+ }
+
+ dir = g_strndup(path, (int) (p-path));
+ if (stat(dir, &statbuf) != 0) {
+ if (mkdir(dir, mode) == -1) {
+ g_free(dir);
+ return -1;
+ }
+ }
+ g_free(dir);
+
+ if (*p++ == '\0')
+ break;
+ }
+
+ return 0;
+}
+
+/* convert ~/ to $HOME */
char *convert_home(const char *path)
{
return *path == '~' && (*(path+1) == '/' || *(path+1) == '\0') ?
diff --git a/src/core/misc.h b/src/core/misc.h
index 08917208..3dc50dc1 100644
--- a/src/core/misc.h
+++ b/src/core/misc.h
@@ -41,6 +41,9 @@ char *stristr_full(const char *data, const char *key);
/* easy way to check if regexp matches */
int regexp_match(const char *str, const char *regexp);
+/* Create the directory and all it's parent directories */
+int mkpath(const char *path, int mode);
+/* convert ~/ to $HOME */
char *convert_home(const char *path);
/* Case-insensitive string hash functions */
diff --git a/src/fe-common/core/fe-log.c b/src/fe-common/core/fe-log.c
index 4a563709..eef4dade 100644
--- a/src/fe-common/core/fe-log.c
+++ b/src/fe-common/core/fe-log.c
@@ -306,7 +306,7 @@ static void autolog_log(void *server, const char *target)
dir = g_dirname(str);
g_free(str);
- mkdir(dir, LOG_DIR_CREATE_MODE);
+ mkpath(dir, LOG_DIR_CREATE_MODE);
g_free(dir);
log = log_create_rec(fname, autolog_level, target);