# HG changeset patch # User Nathan Phillip Brink # Date 2010-07-30 22:27:39 # Node ID c5f38b0ee75127e176acb95740b9e3b10d49d727 # Parent 713403c81c85f83c193c94d976b49e368fb8d206 Fix distren_mkdir_recurse() to actually call mkdir() on the most deeply nested directory. 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; } diff --git a/src/server/slavefuncs.h b/src/server/slavefuncs.h --- a/src/server/slavefuncs.h +++ b/src/server/slavefuncs.h @@ -45,7 +45,7 @@ int conf_replace(char *conffile, char *w int exec_blender(char *input, char *output, int frame); void xmlinit(); void xmlcleanup(); -int distren_mkdir_recurse(char *dirname); +int distren_mkdir_recurse(const char *dirname); int job_build_path(char *filename, unsigned int jobnum); int downloadTar(char *url, char *destinationPath); int uploadOutput(char *pathtoOutput, char *urltoOutput, int jobnum, int framenum, int slavekey);