Always use lutimes() if it is available.
authorWayne Davison <wayned@samba.org>
Mon, 7 Sep 2009 20:45:33 +0000 (13:45 -0700)
committerWayne Davison <wayned@samba.org>
Mon, 7 Sep 2009 20:45:33 +0000 (13:45 -0700)
compat.c
generator.c
options.c
rsync.h
util.c

index 10add12..6655acd 100644 (file)
--- a/compat.c
+++ b/compat.c
@@ -248,7 +248,7 @@ void setup_protocol(int f_out,int f_in)
                int compat_flags;
                if (am_server) {
                        compat_flags = allow_inc_recurse ? CF_INC_RECURSE : 0;
-#if defined HAVE_LUTIMES && defined HAVE_UTIMES
+#ifdef CAN_SET_SYMLINK_TIMES
                        compat_flags |= CF_SYMLINK_TIMES;
 #endif
 #ifdef ICONV_OPTION
@@ -264,7 +264,7 @@ void setup_protocol(int f_out,int f_in)
                            ? strchr(client_info, 'L') != NULL
                            : !!(compat_flags & CF_SYMLINK_TIMES);
                }
-#if defined HAVE_LUTIMES && defined HAVE_UTIMES
+#ifdef CAN_SET_SYMLINK_TIMES
                else
                        receiver_symlink_times = 1;
 #endif
@@ -281,7 +281,7 @@ void setup_protocol(int f_out,int f_in)
                        exit_cleanup(RERR_SYNTAX);
                }
                need_messages_from_generator = 1;
-#if defined HAVE_LUTIMES && defined HAVE_UTIMES
+#ifdef CAN_SET_SYMLINK_TIMES
        } else if (!am_sender) {
                receiver_symlink_times = 1;
 #endif
index 5f6afd6..11a7cb9 100644 (file)
@@ -392,7 +392,7 @@ static void do_delete_pass(void)
 
 int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
 {
-#if !defined HAVE_LUTIMES || !defined HAVE_UTIMES
+#ifndef CAN_SET_SYMLINK_TIMES
        if (S_ISLNK(file->mode)) {
                ;
        } else
@@ -440,7 +440,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
        if (statret >= 0) { /* A from-dest-dir statret can == 1! */
                int keep_time = !preserve_times ? 0
                    : S_ISDIR(file->mode) ? preserve_times > 1 :
-#if defined HAVE_LUTIMES && defined HAVE_UTIMES
+#ifdef CAN_SET_SYMLINK_TIMES
                    1;
 #else
                    !S_ISLNK(file->mode);
index 53640ad..ee981e3 100644 (file)
--- a/options.c
+++ b/options.c
@@ -596,7 +596,7 @@ static void print_rsync_version(enum logcode f)
 #ifdef ICONV_OPTION
        iconv = "";
 #endif
-#if defined HAVE_LUTIMES && defined HAVE_UTIMES
+#ifdef CAN_SET_SYMLINK_TIMES
        symtimes = "";
 #endif
 
@@ -2358,7 +2358,7 @@ void server_options(char **args, int *argc_p)
                        argstr[x++] = '.';
                if (allow_inc_recurse)
                        argstr[x++] = 'i';
-#if defined HAVE_LUTIMES && defined HAVE_UTIMES
+#ifdef CAN_SET_SYMLINK_TIMES
                argstr[x++] = 'L';
 #endif
 #ifdef ICONV_OPTION
diff --git a/rsync.h b/rsync.h
index 4d4a764..cf2a2dd 100644 (file)
--- a/rsync.h
+++ b/rsync.h
@@ -359,6 +359,10 @@ enum delret {
 #include <utime.h>
 #endif
 
+#ifdef HAVE_LUTIMES
+#define CAN_SET_SYMLINK_TIMES 1
+#endif
+
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
diff --git a/util.c b/util.c
index 4d58dc4..d7efd23 100644 (file)
--- a/util.c
+++ b/util.c
@@ -125,7 +125,7 @@ NORETURN void overflow_exit(const char *str)
 
 int set_modtime(const char *fname, time_t modtime, 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,19 @@ int set_modtime(const char *fname, time_t modtime, mode_t mode)
                return 0;
 
        {
-#ifdef HAVE_UTIMES
+#if 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;
 # 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);