diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-02-12 02:01:14 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-02-12 02:01:14 +0100 |
commit | a9f5d45466c923442ceb31ab2a4206736133d9d4 (patch) | |
tree | de8e908484df9cc8e858f7dbd151d437bc23d747 | |
parent | 82919e3d3172c85acb80b0e206ae1731863eee6d (diff) |
util: introduce mkdir_parents() that creates parent paths of sockets and suchlike
-rw-r--r-- | util.c | 36 | ||||
-rw-r--r-- | util.h | 1 |
2 files changed, 37 insertions, 0 deletions
@@ -30,11 +30,14 @@ #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"; @@ -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); |