Merge 0.30.214.
[util-vserver.git] / src / vhashify.c
index 34e32a9..005efd8 100644 (file)
@@ -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 <enrico.scholz@informatik.tu-chemnitz.de>
 //  
@@ -20,6 +20,8 @@
 #  include <config.h>
 #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          :