Commit 860fc865 by Richard Weinberger Committed by Stéphane Graber

utils: reimplement/fix mkdir_p() (v2)

Reimplement mkdir_p() such that it: ...handles relativ paths correctly. (currently it crashes) ...does not rely on dirname(). ...is not recursive. ...is shorter. ;-) Signed-off-by: 's avatarRichard Weinberger <richard@nod.at> Acked-by: 's avatarSerge E. Hallyn <serge.hallyn@ubuntu.com>
parent 23154d57
...@@ -95,39 +95,23 @@ extern int get_u16(unsigned short *val, const char *arg, int base) ...@@ -95,39 +95,23 @@ extern int get_u16(unsigned short *val, const char *arg, int base)
return 0; return 0;
} }
static int is_all_slashes(char *path)
{
while (*path && *path == '/')
path++;
if (*path)
return 0;
return 1;
}
extern int mkdir_p(char *dir, mode_t mode) extern int mkdir_p(char *dir, mode_t mode)
{ {
int ret; char *tmp = dir;
char *d; char *orig = dir;
char *makeme;
if (is_all_slashes(dir))
return 0; do {
dir = tmp + strspn(tmp, "/");
d = strdup(dir); tmp = dir + strcspn(dir, "/");
if (!d) makeme = strndupa(orig, dir - orig);
return -1; if (*makeme) {
if (mkdir(makeme, mode) && errno != EEXIST) {
ret = mkdir_p(dirname(d), mode); SYSERROR("failed to create directory '%s'\n", makeme);
free(d); return -1;
if (ret) }
return -1; }
} while(tmp != dir);
if (!access(dir, F_OK))
return 0;
if (mkdir(dir, mode)) {
SYSERROR("failed to create directory '%s'\n", dir);
return -1;
}
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment