X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/7b6c5c77942b8d11631c873b008e0b405d435bc0..0b8a9bd69d1e4003bdadb663581533681adba808:/util.c diff --git a/util.c b/util.c index 4d58dc41..2c4c571e 100644 --- a/util.c +++ b/util.c @@ -32,7 +32,6 @@ extern int relative_paths; 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; @@ -123,9 +122,9 @@ NORETURN void overflow_exit(const char *str) exit_cleanup(RERR_MALLOC); } -int set_modtime(const char *fname, time_t modtime, mode_t mode) +int set_modtime(const char *fname, time_t modtime, uint32 mod_nsec, mode_t mode) { -#if !defined HAVE_LUTIMES || !defined HAVE_UTIMES +#ifndef CAN_SET_SYMLINK_TIMES if (S_ISLNK(mode)) return 1; #endif @@ -140,20 +139,28 @@ int set_modtime(const char *fname, time_t modtime, mode_t mode) return 0; { -#ifdef HAVE_UTIMES +#ifdef HAVE_UTIMENSAT + struct timespec t[2]; + t[0].tv_sec = 0; + 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; +#elif defined HAVE_UTIMES || defined HAVE_LUTIMES struct timeval t[2]; t[0].tv_sec = time(NULL); t[0].tv_usec = 0; t[1].tv_sec = modtime; - t[1].tv_usec = 0; + t[1].tv_usec = mod_nsec / 1000; # ifdef HAVE_LUTIMES - if (S_ISLNK(mode)) { - if (lutimes(fname, t) < 0) - return errno == ENOSYS ? 1 : -1; - return 0; - } -# endif + if (lutimes(fname, t) < 0) + return S_ISLNK(mode) && errno == ENOSYS ? 1 : -1; + return 0; +# else return utimes(fname, t); +# endif #elif defined HAVE_STRUCT_UTIMBUF struct utimbuf tbuf; tbuf.actime = time(NULL); @@ -170,18 +177,11 @@ int set_modtime(const char *fname, time_t modtime, 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(). */ +/* This creates a new directory with default permissions. Now that we + * leave the original umask set, we can just mkdir with mode 777. */ int mkdir_defmode(char *fname) { - int ret; - - umask(orig_umask); - ret = do_mkdir(fname, ACCESSPERMS); - umask(0); - - return ret; + return do_mkdir(fname, ACCESSPERMS); } /* Create any necessary directories in fname. Any missing directories are @@ -208,8 +208,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) { @@ -250,8 +248,6 @@ int make_path(char *fname, int flags) ret++; } - umask(0); - if (flags & MKP_DROP_NAME) *end = '/'; @@ -534,38 +530,6 @@ void kill_all(int sig) } } -/* Parse a user name or (optionally) a number into a uid */ -int user_to_uid(const char *name, uid_t *uid_p, BOOL num_ok) -{ - struct passwd *pass; - if (!name || !*name) - return 0; - if (num_ok && name[strspn(name, "0123456789")] == '\0') { - *uid_p = atol(name); - return 1; - } - if (!(pass = getpwnam(name))) - return 0; - *uid_p = pass->pw_uid; - return 1; -} - -/* Parse a group name or (optionally) a number into a gid */ -int group_to_gid(const char *name, gid_t *gid_p, BOOL num_ok) -{ - struct group *grp; - if (!name || !*name) - return 0; - if (num_ok && name[strspn(name, "0123456789")] == '\0') { - *gid_p = atol(name); - return 1; - } - if (!(grp = getgrnam(name))) - return 0; - *gid_p = grp->gr_gid; - return 1; -} - /** Lock a byte range in a open file */ int lock_range(int fd, int offset, int len) { @@ -1459,11 +1423,11 @@ const char *find_filename_suffix(const char *fn, int fn_len, int *len_ptr) #define UNIT (1 << 16) -uint32 fuzzy_distance(const char *s1, int len1, const char *s2, int len2) +uint32 fuzzy_distance(const char *s1, unsigned len1, const char *s2, unsigned len2) { uint32 a[MAXPATHLEN], diag, above, left, diag_inc, above_inc, left_inc; int32 cost; - int i1, i2; + unsigned i1, i2; if (!len1 || !len2) { if (!len1) {