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;
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",
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);
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
}
}
-/* 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. */
} 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) {
ret++;
}
- umask(0);
-
if (flags & MKP_DROP_NAME)
*end = '/';
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));