diff --git a/src/server/slavefuncs.c b/src/server/slavefuncs.c --- a/src/server/slavefuncs.c +++ b/src/server/slavefuncs.c @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -306,22 +307,42 @@ void xmlcleanup() /** Creates directories recursively */ -int distren_mkdir_recurse(char *dirname) +int distren_mkdir_recurse(const char *dirname) { size_t counter; char *nextdir; + int ret; nextdir = strdup(dirname); - for(counter = 0; nextdir[counter]; counter ++) + /* skip preficing slashes */ + for(counter = 0; nextdir[counter] == '/'; counter ++) + ; + for(; nextdir[counter]; counter ++) { /** @TODO OS-portabalize the path-separators */ if(nextdir[counter] == '/') { nextdir[counter] = '\0'; - mkdir(nextdir, S_IRWXU | S_IRGRP | S_IROTH); + ret = mkdir(nextdir, S_IRWXU | S_IRGRP | S_IROTH); + if(ret == -1 + && errno != EEXIST) + { + perror("mkdir"); + free(nextdir); + return 1; + } nextdir[counter] = '/'; } } + ret = mkdir(nextdir, S_IRWXU | S_IRGRP | S_IROTH); + if(ret == -1 + && errno != EEXIST) + { + perror("mkdir"); + free(nextdir); + return 1; + } + free(nextdir); return 0; }