From: Deiz Date: Sun, 29 Mar 2015 21:18:00 +0000 (-0400) Subject: Move mkdirp into libi3 X-Git-Tag: 4.11~163^2 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=e622c42ef087e50bbf9666b794b9601788029873;p=i3%2Fi3 Move mkdirp into libi3 --- diff --git a/include/ipc.h b/include/ipc.h index 96a60a1f..4eed319a 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -50,12 +50,6 @@ typedef void (*handler_t)(int, uint8_t *, int, uint32_t, uint32_t); int size, uint32_t message_size, \ uint32_t message_type) -/** - * Emulates mkdir -p (creates any missing folders) - * - */ -bool mkdirp(const char *path); - /** * Handler for activity on the listening socket, meaning that a new client * has just connected and we should accept() him. Sets up the event handler diff --git a/include/libi3.h b/include/libi3.h index 82c46fce..da8c8a42 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -452,3 +452,9 @@ char *resolve_tilde(const char *path); * */ char *get_config_path(const char *override_configpath, bool use_system_paths); + +/** + * Emulates mkdir -p (creates any missing folders) + * + */ +bool mkdirp(const char *path); diff --git a/libi3/mkdirp.c b/libi3/mkdirp.c new file mode 100644 index 00000000..a0d35f96 --- /dev/null +++ b/libi3/mkdirp.c @@ -0,0 +1,38 @@ +#include "libi3.h" +#include +#include +#include +#include + +/* + * Emulates mkdir -p (creates any missing folders) + * + */ +bool mkdirp(const char *path) { + if (mkdir(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0) + return true; + if (errno != ENOENT) { + ELOG("mkdir(%s) failed: %s\n", path, strerror(errno)); + return false; + } + char *copy = sstrdup(path); + /* strip trailing slashes, if any */ + while (copy[strlen(copy) - 1] == '/') + copy[strlen(copy) - 1] = '\0'; + + char *sep = strrchr(copy, '/'); + if (sep == NULL) { + if (copy != NULL) { + free(copy); + copy = NULL; + } + return false; + } + *sep = '\0'; + bool result = false; + if (mkdirp(copy)) + result = mkdirp(path); + free(copy); + + return result; +} diff --git a/src/ipc.c b/src/ipc.c index 52f7db2e..8fed75f1 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -37,36 +37,6 @@ static void set_nonblock(int sockfd) { err(-1, "Could not set O_NONBLOCK"); } -/* - * Emulates mkdir -p (creates any missing folders) - * - */ -bool mkdirp(const char *path) { - if (mkdir(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0) - return true; - if (errno != ENOENT) { - ELOG("mkdir(%s) failed: %s\n", path, strerror(errno)); - return false; - } - char *copy = sstrdup(path); - /* strip trailing slashes, if any */ - while (copy[strlen(copy) - 1] == '/') - copy[strlen(copy) - 1] = '\0'; - - char *sep = strrchr(copy, '/'); - if (sep == NULL) { - FREE(copy); - return false; - } - *sep = '\0'; - bool result = false; - if (mkdirp(copy)) - result = mkdirp(path); - free(copy); - - return result; -} - /* * Sends the specified event to all IPC clients which are currently connected * and subscribed to this kind of event.