X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/870cf55287e68a344fe3c1ea7eccf887ad5b1bbc..2624e005e2c2407c8e108230e6615d2aaba42617:/util.c diff --git a/util.c b/util.c index c0580508..ee65f549 100644 --- a/util.c +++ b/util.c @@ -29,10 +29,10 @@ extern int dry_run; extern int module_id; extern int modify_window; extern int relative_paths; +extern int preserve_times; extern int preserve_xattrs; extern char *module_dir; extern unsigned int module_dirlen; -extern mode_t orig_umask; extern char *partial_dir; extern filter_rule_list daemon_filter_list; @@ -125,10 +125,8 @@ NORETURN void overflow_exit(const char *str) int set_modtime(const char *fname, time_t modtime, uint32 mod_nsec, mode_t mode) { -#ifndef CAN_SET_SYMLINK_TIMES - if (S_ISLNK(mode)) + if (!(preserve_times & PRESERVE_LINK_TIMES) && S_ISLNK(mode)) return 1; -#endif if (DEBUG_GTE(TIME, 1)) { rprintf(FINFO, "set modtime of %s to (%ld) %s", @@ -146,9 +144,7 @@ int set_modtime(const char *fname, time_t modtime, uint32 mod_nsec, mode_t mode) t[0].tv_nsec = UTIME_NOW; t[1].tv_sec = modtime; t[1].tv_nsec = mod_nsec; - if (utimensat(AT_FDCWD, fname, t, AT_SYMLINK_NOFOLLOW) < 0) - return S_ISLNK(mode) && errno == ENOSYS ? 1 : -1; - return 0; + return utimensat(AT_FDCWD, fname, t, AT_SYMLINK_NOFOLLOW); #elif defined HAVE_UTIMES || defined HAVE_LUTIMES struct timeval t[2]; t[0].tv_sec = time(NULL); @@ -156,9 +152,7 @@ int set_modtime(const char *fname, time_t modtime, uint32 mod_nsec, mode_t mode) t[1].tv_sec = modtime; t[1].tv_usec = mod_nsec / 1000; # ifdef HAVE_LUTIMES - if (lutimes(fname, t) < 0) - return S_ISLNK(mode) && errno == ENOSYS ? 1 : -1; - return 0; + return lutimes(fname, t); # else return utimes(fname, t); # endif @@ -178,20 +172,6 @@ int set_modtime(const char *fname, time_t modtime, uint32 mod_nsec, mode_t mode) } } -/* This creates a new directory with default permissions. Since there - * might be some directory-default permissions affecting this, we can't - * force the permissions directly using the original umask and mkdir(). */ -int mkdir_defmode(char *fname) -{ - int ret; - - umask(orig_umask); - ret = do_mkdir(fname, ACCESSPERMS); - umask(0); - - return ret; -} - /* Create any necessary directories in fname. Any missing directories are * created with default permissions. Returns < 0 on error, or the number * of directories created. */ @@ -216,8 +196,6 @@ int make_path(char *fname, int flags) } else end = fname + strlen(fname); - umask(orig_umask); /* NOTE: don't return before setting this back to 0! */ - /* Try to find an existing dir, starting from the deepest dir. */ for (p = end; ; ) { if (do_mkdir(fname, ACCESSPERMS) == 0) { @@ -258,8 +236,6 @@ int make_path(char *fname, int flags) ret++; } - umask(0); - if (flags & MKP_DROP_NAME) *end = '/'; @@ -348,6 +324,11 @@ int copy_file(const char *source, const char *dest, int ofd, mode_t mode) return -1; } +#ifdef SUPPORT_XATTRS + if (preserve_xattrs) + mode |= S_IWUSR; +#endif + mode &= INITACCESSPERMS; if ((ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode)) < 0) { int save_errno = errno; rsyserr(FERROR_XFER, save_errno, "open %s", full_fname(dest));