util: introduce mkdir_parents() that creates parent paths of sockets and suchlike
authorLennart Poettering <lennart@poettering.net>
Fri, 12 Feb 2010 01:01:14 +0000 (02:01 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 12 Feb 2010 01:01:14 +0000 (02:01 +0100)
util.c
util.h

diff --git a/util.c b/util.c
index c5c8bd4..517c99c 100644 (file)
--- a/util.c
+++ b/util.c
 #include <sched.h>
 #include <sys/resource.h>
 #include <linux/sched.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 
 #include "macro.h"
 #include "util.h"
 #include "ioprio.h"
 #include "missing.h"
+#include "log.h"
 
 usec_t now(clockid_t clock_id) {
         struct timespec ts;
@@ -590,6 +593,39 @@ char *file_in_same_dir(const char *path, const char *filename) {
         return r;
 }
 
+int mkdir_parents(const char *path, mode_t mode) {
+        const char *p, *e;
+
+        assert(path);
+
+        /* Creates every parent directory in the path except the last
+         * component. */
+
+        p = path + strspn(path, "/");
+        for (;;) {
+                int r;
+                char *t;
+
+                e = p + strcspn(p, "/");
+                p = e + strspn(e, "/");
+
+                /* Is this the last component? If so, then we're
+                 * done */
+                if (*p == 0)
+                        return 0;
+
+                if (!(t = strndup(path, e - path)))
+                        return -ENOMEM;
+
+                r = mkdir(t, mode);
+
+                free(t);
+
+                if (r < 0 && errno != EEXIST)
+                        return -errno;
+        }
+}
+
 char hexchar(int x) {
         static const char table[16] = "0123456789abcdef";
 
diff --git a/util.h b/util.h
index f5cb165..ba7e542 100644 (file)
--- a/util.h
+++ b/util.h
@@ -127,6 +127,7 @@ int reset_all_signal_handlers(void);
 
 char *strstrip(char *s);
 char *file_in_same_dir(const char *path, const char *filename);
+int mkdir_parents(const char *path, mode_t mode);
 
 char hexchar(int x);
 int unhexchar(char c);