X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fvhashify.c;h=005efd829fe3e80e77936bf881ead3780cb0b389;hb=a741f6faf2baae1e823d334012f6a09e6a1bda51;hp=34e32a9012c1719f156d6592eba64b085d4f604a;hpb=3b34449070c0846fdc49436d1edd5916512f1644;p=util-vserver.git diff --git a/src/vhashify.c b/src/vhashify.c index 34e32a9..005efd8 100644 --- a/src/vhashify.c +++ b/src/vhashify.c @@ -1,4 +1,4 @@ -// $Id: vhashify.c 2403 2006-11-24 23:06:08Z dhozac $ --*- c -*-- +// $Id: vhashify.c 2569 2007-07-22 17:24:29Z dhozac $ --*- c -*-- // Copyright (C) 2005 Enrico Scholz // @@ -20,6 +20,8 @@ # include #endif +#define UTIL_VSERVER_UNIFY_MTIME_OPTIONAL + #include "vhashify.h" #include "util.h" @@ -70,6 +72,7 @@ #define CMD_SLEDGE 0x1002 #define CMD_MANUALLY 0x1003 #define CMD_REFRESH 0x1004 +#define CMD_NOMTIME 0x1005 struct option const CMDLINE_OPTIONS[] = { @@ -80,6 +83,7 @@ CMDLINE_OPTIONS[] = { { "sledgehammer", no_argument, 0, CMD_SLEDGE }, { "manually", no_argument, 0, CMD_MANUALLY }, { "refresh", no_argument, 0, CMD_REFRESH }, + { "ignore-mtime", no_argument, 0, CMD_NOMTIME }, { "dry-run", no_argument, 0, 'n' }, { "verbose", no_argument, 0, 'v' }, { 0,0,0,0 } @@ -289,7 +293,7 @@ addStatHash(hashFunctionContext *h_ctx, struct stat const * const st) SET_ATTR(gid), SET_ATTR(rdev), SET_ATTR(size), - SET_ATTR(mtime) + .mtime = (global_args->ignore_mtime ? 0 : st->st_mtime), }; #undef SET_ATTR @@ -389,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) @@ -493,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; } @@ -688,6 +627,7 @@ int main(int argc, char *argv[]) .insecure = 0, .dry_run = false, .do_refresh = false, + .ignore_mtime = false, }; Vector_init(&global_info.hash_dirs, sizeof(struct HashDirInfo)); @@ -706,6 +646,7 @@ int main(int argc, char *argv[]) case CMD_INSECURE : args.insecure = 1; break; case CMD_SLEDGE : args.insecure = 2; break; case CMD_REFRESH : args.do_refresh = true; break; + case CMD_NOMTIME : args.ignore_mtime = true; break; case 'n' : args.dry_run = true; break; case 'v' : ++args.verbosity; break; default :