Write out the right compat_flags value into the batch file.
[rsync/rsync.git] / util.c
diff --git a/util.c b/util.c
index 4d58dc4..c058050 100644 (file)
--- a/util.c
+++ b/util.c
@@ -123,9 +123,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 +140,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);
@@ -534,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)
 {
@@ -1459,11 +1435,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) {