From a9f5d45466c923442ceb31ab2a4206736133d9d4 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 12 Feb 2010 02:01:14 +0100 Subject: util: introduce mkdir_parents() that creates parent paths of sockets and suchlike --- util.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'util.c') diff --git a/util.c b/util.c index c5c8bd4edd..517c99c45e 100644 --- a/util.c +++ b/util.c @@ -30,11 +30,14 @@ #include #include #include +#include +#include #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"; -- cgit v1.2.3-54-g00ecf