summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2000-08-12 15:50:50 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2000-08-12 15:50:50 +0000
commit6675cec4599216f3b5942cbd83b48dd41b8c7f01 (patch)
tree2bab778ad5cec5ff3b46ebc237c3e31baf05d2b8
parent308e84bbc44db92fbb1fe0c2e177ae981865b788 (diff)
downloadirssi-6675cec4599216f3b5942cbd83b48dd41b8c7f01.zip
mkpath() - behaves like mkdir -p. Autologging now uses it to create
log directories. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@591 dbcabf3a-b0e7-0310-adc4-f8d773084564
-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);