X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/accc091fe9ebbb602bcf692c577486e62011d5c1..9270e88d76d3ea9e94d48977fbea57b997545577:/util.c diff --git a/util.c b/util.c index d7efd239..b01e64d8 100644 --- a/util.c +++ b/util.c @@ -123,7 +123,7 @@ 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) { #ifndef CAN_SET_SYMLINK_TIMES if (S_ISLNK(mode)) @@ -140,12 +140,21 @@ int set_modtime(const char *fname, time_t modtime, mode_t mode) return 0; { -#if defined HAVE_UTIMES || defined HAVE_LUTIMES +#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 (lutimes(fname, t) < 0) return S_ISLNK(mode) && errno == ENOSYS ? 1 : -1; @@ -533,38 +542,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) {