Improved a couple sentences.
[rsync/rsync.git] / rsync.c
diff --git a/rsync.c b/rsync.c
index 9062a16..6d2812c 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -31,10 +31,10 @@ extern int am_root;
 extern int am_server;
 extern int am_sender;
 extern int am_generator;
+extern int am_starting_up;
 extern int preserve_uid;
 extern int preserve_gid;
 extern int inplace;
-extern int recurse;
 extern int keep_dirlinks;
 extern int make_backups;
 extern struct stats stats;
@@ -68,17 +68,18 @@ int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st,
                st = &st2;
        }
 
-       if (!preserve_times || S_ISLNK(st->st_mode)
-        || (S_ISDIR(st->st_mode) && omit_dir_times))
+       if (!preserve_times || (S_ISDIR(st->st_mode) && omit_dir_times))
                flags |= PERMS_SKIP_MTIME;
        if (!(flags & PERMS_SKIP_MTIME)
            && cmp_modtime(st->st_mtime, file->modtime) != 0) {
-               if (set_modtime(fname,file->modtime) != 0) {
+               int ret = set_modtime(fname, file->modtime, st->st_mode);
+               if (ret < 0) {
                        rsyserr(FERROR, errno, "failed to set times on %s",
                                full_fname(fname));
                        return 0;
                }
-               updated = 1;
+               if (ret == 0) /* ret == 1 if symlink could not be set */
+                       updated = 1;
        }
 
        change_uid = am_root && preserve_uid && st->st_uid != file->uid;
@@ -125,15 +126,16 @@ int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st,
        }
 
 #ifdef HAVE_CHMOD
-       if (!S_ISLNK(st->st_mode)) {
-               if ((st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS)) {
-                       updated = 1;
-                       if (do_chmod(fname,(file->mode & CHMOD_BITS)) != 0) {
-                               rsyserr(FERROR, errno, "failed to set permissions on %s",
-                                       full_fname(fname));
-                               return 0;
-                       }
+       if ((st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS)) {
+               int ret = do_chmod(fname, file->mode);
+               if (ret < 0) {
+                       rsyserr(FERROR, errno,
+                               "failed to set permissions on %s",
+                               full_fname(fname));
+                       return 0;
                }
+               if (ret == 0) /* ret == 1 if symlink could not be set */
+                       updated = 1;
        }
 #endif
 
@@ -206,7 +208,7 @@ void finish_transfer(char *fname, char *fnametmp, struct file_struct *file,
 
 const char *who_am_i(void)
 {
-       if (am_sender < 0)
+       if (am_starting_up)
                return am_server ? "server" : "client";
        return am_sender ? "sender" : am_generator ? "generator" : "receiver";
 }