X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=src%2Fvhashify.c;fp=src%2Fvhashify.c;h=005efd829fe3e80e77936bf881ead3780cb0b389;hb=4415d2a7377be61789eb5a6e35222962cbe7a146;hp=f7b83bde9dcfce834de1f430f52845b6717606a7;hpb=b0a62d195efca12c5cb9e7c0b3bea3be2cd57fc9;p=util-vserver.git diff --git a/src/vhashify.c b/src/vhashify.c index f7b83bd..005efd8 100644 --- a/src/vhashify.c +++ b/src/vhashify.c @@ -1,4 +1,4 @@ -// $Id: vhashify.c 2475 2007-01-27 09:38:56Z dhozac $ --*- c -*-- +// $Id: vhashify.c 2569 2007-07-22 17:24:29Z dhozac $ --*- c -*-- // Copyright (C) 2005 Enrico Scholz // @@ -393,69 +393,6 @@ calculateHash(PathInfo const *filename, HashPath d_path, struct stat const * con return res; } -static enum { mkdirFAIL, mkdirSUCCESS, mkdirSKIP } -mkdirSingle(char const *path, char *end_ptr, int good_err) -{ - *end_ptr = '\0'; - if (mkdir(path, 0700)!=-1 || errno==EEXIST) { - *end_ptr = '/'; - return mkdirSUCCESS; - } - else if (errno==good_err) { - *end_ptr = '/'; - return mkdirSKIP; - } - else { - int old_errno = errno; - WRITE_MSG(2, "mkdir('"); - WRITE_STR(2, path); - errno = old_errno; - perror("')"); - return mkdirFAIL; - } -} - -static char * -rstrchr(char *str, char c) -{ - while (*str!=c) --str; - return str; -} - -static bool -mkdirRecursive(char const *path) -{ - if (path[0]!='/') return false; // only absolute paths - - char buf[strlen(path)+1]; - char * ptr = buf + sizeof(buf) - 2; - - strcpy(buf, path); - - while (ptr>buf && (ptr = rstrchr(ptr, '/'))!=0) { - switch (mkdirSingle(buf, ptr, ENOENT)) { - case mkdirSUCCESS : break; - case mkdirSKIP : --ptr; continue; - case mkdirFAIL : return false; - } - - break; // implied by mkdirSUCCESS - } - - assert(ptr!=0); - ++ptr; - - while ((ptr=strchr(ptr, '/'))!=0) { - switch (mkdirSingle(buf, ptr, 0)) { - case mkdirSKIP : - case mkdirFAIL : return false; - case mkdirSUCCESS : ++ptr; continue; - } - } - - return true; -} - static bool resolveCollisions(char *result, PathInfo const *root, HashPath d_path, struct stat *st, struct stat *hash_st) @@ -497,18 +434,16 @@ resolveCollisions(char *result, PathInfo const *root, HashPath d_path, if (!global_args->dry_run) { *ptr = '\0'; - if (!mkdirRecursive(result)) + if (!mkdirRecursive(result)) { + PERROR_Q("mkdir", result); return false; + } *ptr = '-'; int fd = open(result, O_NOFOLLOW|O_EXCL|O_CREAT|O_WRONLY, 0200); if (fd==-1) { - int old_errno = errno; - WRITE_MSG(2, "open('"); - WRITE_STR(2, buf); - errno = old_errno; - perror("')"); + PERROR_Q("open", buf); return false; }