# include <config.h>
#endif
+#define UTIL_VSERVER_UNIFY_MTIME_OPTIONAL
+
#include "vhashify.h"
#include "util.h"
#define CMD_SLEDGE 0x1002
#define CMD_MANUALLY 0x1003
#define CMD_REFRESH 0x1004
+#define CMD_NOMTIME 0x1005
struct option const
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 }
SET_ATTR(gid),
SET_ATTR(rdev),
SET_ATTR(size),
- SET_ATTR(mtime)
+ .mtime = (global_args->ignore_mtime ? 0 : st->st_mtime),
};
#undef SET_ATTR
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)
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;
}
.insecure = 0,
.dry_run = false,
.do_refresh = false,
+ .ignore_mtime = false,
};
Vector_init(&global_info.hash_dirs, sizeof(struct HashDirInfo));
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 :