From: Lennart Poettering Date: Fri, 12 Feb 2010 01:01:14 +0000 (+0100) Subject: util: introduce mkdir_parents() that creates parent paths of sockets and suchlike X-Git-Tag: v1~711 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=a9f5d45466c923442ceb31ab2a4206736133d9d4 util: introduce mkdir_parents() that creates parent paths of sockets and suchlike --- diff --git a/util.c b/util.c index c5c8bd4ed..517c99c45 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"; diff --git a/util.h b/util.h index f5cb16555..ba7e542ba 100644 --- 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);