diff --git a/Makefile b/Makefile index ffa8678..27ce5ef 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,7 @@ LIBUTILSRC =\ libutil/getlines.c\ libutil/human.c\ libutil/md5.c\ + libutil/mkdirp.c\ libutil/mode.c\ libutil/putword.c\ libutil/reallocarray.c\ diff --git a/libutil/mkdirp.c b/libutil/mkdirp.c new file mode 100644 index 0000000..7796e24 --- /dev/null +++ b/libutil/mkdirp.c @@ -0,0 +1,30 @@ +/* See LICENSE file for copyright and license details. */ +#include + +#include +#include + +#include "../util.h" + +int +mkdirp(const char *path) +{ + char tmp[PATH_MAX], *p; + + estrlcpy(tmp, path, sizeof(tmp)); + for (p = tmp + (tmp[0] == '/'); *p; p++) { + if (*p != '/') + continue; + *p = '\0'; + if (mkdir(tmp, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST) { + weprintf("mkdir %s:", tmp); + return -1; + } + *p = '/'; + } + if (mkdir(tmp, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST) { + weprintf("mkdir %s:", tmp); + return -1; + } + return 0; +} diff --git a/mkdir.c b/mkdir.c index 9d4951a..6de0d1a 100644 --- a/mkdir.c +++ b/mkdir.c @@ -6,29 +6,6 @@ #include "util.h" -static int -mkdirp(char *path) -{ - char *p; - - for (p = path + (*path == '/'); *p; p++) { - if (*p != '/') - continue; - *p = '\0'; - if (mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST) { - weprintf("mkdir %s:", path); - *p = '/'; - return -1; - } - *p = '/'; - } - if (mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST) { - weprintf("mkdir %s:", path); - return -1; - } - return 0; -} - static void usage(void) { diff --git a/tar.c b/tar.c index a115325..06fb654 100644 --- a/tar.c +++ b/tar.c @@ -173,29 +173,6 @@ archive(const char *path) return 0; } -static int -mkdirp(char *path) -{ - char *p; - - for (p = path; *p; p++) { - if (*p != '/') - continue; - *p = '\0'; - if (mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST) { - weprintf("mkdir %s:", path); - *p = '/'; - return -1; - } - *p = '/'; - } - if (mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST) { - weprintf("mkdir %s:", path); - return -1; - } - return 0; -} - static int unarchive(char *fname, ssize_t l, char b[BLKSIZ]) { diff --git a/util.h b/util.h index a878d73..7dd5713 100644 --- a/util.h +++ b/util.h @@ -74,3 +74,4 @@ long long strtonum(const char *, long long, long long, const char **); long long enstrtonum(int, const char *, long long, long long); long long estrtonum(const char *, long long, long long); size_t unescape(char *); +int mkdirp(const char *);