Enhanced the patch to remove the memory penalty when no atimes
authorWayne Davison <wayned@samba.org>
Tue, 24 Jan 2006 19:40:51 +0000 (19:40 +0000)
committerWayne Davison <wayned@samba.org>
Tue, 24 Jan 2006 19:40:51 +0000 (19:40 +0000)
are being preserved.  Also fixed a build problem that had crept
into the source and a test problem.

atimes.diff

index 30037f2..a87e2b0 100644 (file)
@@ -5,9 +5,21 @@ command before "make":
 
 
 --- orig/batch.c       2006-01-14 08:14:29
-+++ batch.c    2004-07-03 20:15:41
-@@ -225,6 +225,8 @@ void show_flist(int index, struct file_s
-               rprintf(FINFO, "flist->flags=%#x\n", fptr[i]->flags);
++++ batch.c    2006-01-24 19:18:36
+@@ -23,6 +23,7 @@ extern int do_compression;
+ extern int def_compress_level;
+ extern int protocol_version;
+ extern char *batch_name;
++extern unsigned int file_struct_len;
+ extern struct filter_list_struct filter_list;
+@@ -222,9 +223,11 @@ void show_flist(int index, struct file_s
+       int i;
+       for (i = 0; i < index; i++) {
+-              rprintf(FINFO, "flist->flags=%#x\n", fptr[i]->flags);
++              rprintf(FINFO, "flist->flags=%#x\n", FFLAGS(fptr[i]));
                rprintf(FINFO, "flist->modtime=%#lx\n",
                        (long unsigned) fptr[i]->modtime);
 +              rprintf(FINFO, "flist->atime=%#lx\n",
@@ -15,8 +27,8 @@ command before "make":
                rprintf(FINFO, "flist->length=%.0f\n",
                        (double) fptr[i]->length);
                rprintf(FINFO, "flist->mode=%#o\n", (int) fptr[i]->mode);
---- orig/flist.c       2006-01-17 02:15:59
-+++ flist.c    2006-01-17 02:42:04
+--- orig/flist.c       2006-01-24 19:03:06
++++ flist.c    2006-01-24 19:32:19
 @@ -50,6 +50,7 @@ extern int preserve_perms;
  extern int preserve_devices;
  extern int preserve_uid;
@@ -25,7 +37,20 @@ command before "make":
  extern int relative_paths;
  extern int implied_dirs;
  extern int copy_links;
-@@ -139,16 +140,18 @@ static void list_file_entry(struct file_
+@@ -83,7 +84,11 @@ void init_flist(void)
+       struct file_struct f;
+       /* Figure out how big the file_struct is without trailing padding */
+-      file_struct_len = offsetof(struct file_struct, flags) + sizeof f.flags;
++      if (preserve_atimes)
++              file_struct_len = offsetof(struct file_struct, flags);
++      else
++              file_struct_len = offsetof(struct file_struct, atime);
++      file_struct_len += sizeof f.flags;
+       checksum_len = protocol_version < 21 ? 2 : MD4_SUM_LENGTH;
+ }
+@@ -139,16 +144,18 @@ static void list_file_entry(struct file_
  
  #ifdef SUPPORT_LINKS
        if (preserve_links && S_ISLNK(f->mode)) {
@@ -33,7 +58,7 @@ command before "make":
 +              rprintf(FINFO, "%s %11.0f %s %s %s -> %s\n",
                        perms,
                        (double)f->length, timestring(f->modtime),
-+                      timestring(f->atime),
++                      preserve_atimes ? timestring(f->atime) : "",
                        f_name(f, NULL), f->u.link);
        } else
  #endif
@@ -42,11 +67,11 @@ command before "make":
 +              rprintf(FINFO, "%s %11.0f %s %s %s\n",
                        perms,
                        (double)f->length, timestring(f->modtime),
-+                      timestring(f->atime),
++                      preserve_atimes ? timestring(f->atime) : "",
                        f_name(f, NULL));
        }
  }
-@@ -310,6 +313,7 @@ void send_file_entry(struct file_struct 
+@@ -310,6 +317,7 @@ static void send_file_entry(struct file_
  {
        unsigned short flags;
        static time_t modtime;
@@ -54,7 +79,7 @@ command before "make":
        static mode_t mode;
        static int64 dev;
        static dev_t rdev;
-@@ -325,7 +329,7 @@ void send_file_entry(struct file_struct 
+@@ -325,7 +333,7 @@ static void send_file_entry(struct file_
  
        if (!file) {
                write_byte(f, 0);
@@ -63,7 +88,16 @@ command before "make":
                dev = 0, rdev = makedev(0, 0);
                rdev_major = 0;
                uid = 0, gid = 0;
-@@ -374,6 +378,12 @@ void send_file_entry(struct file_struct 
+@@ -337,7 +345,7 @@ static void send_file_entry(struct file_
+       f_name(file, fname);
+-      flags = file->flags & XMIT_TOP_DIR;
++      flags = FFLAGS(file) & XMIT_TOP_DIR;
+       if (file->mode == mode)
+               flags |= XMIT_SAME_MODE;
+@@ -374,6 +382,12 @@ static void send_file_entry(struct file_
                flags |= XMIT_SAME_TIME;
        else
                modtime = file->modtime;
@@ -76,7 +110,7 @@ command before "make":
  
  #ifdef SUPPORT_HARD_LINKS
        if (file->link_u.idev) {
-@@ -427,6 +437,8 @@ void send_file_entry(struct file_struct 
+@@ -427,6 +441,8 @@ static void send_file_entry(struct file_
                write_int(f, modtime);
        if (!(flags & XMIT_SAME_MODE))
                write_int(f, to_wire_mode(mode));
@@ -85,7 +119,7 @@ command before "make":
        if (preserve_uid && !(flags & XMIT_SAME_UID)) {
                if (!numeric_ids)
                        add_uid(uid);
-@@ -494,6 +506,7 @@ static struct file_struct *receive_file_
+@@ -494,6 +510,7 @@ static struct file_struct *receive_file_
                                              unsigned short flags, int f)
  {
        static time_t modtime;
@@ -93,7 +127,7 @@ command before "make":
        static mode_t mode;
        static int64 dev;
        static dev_t rdev;
-@@ -512,7 +525,7 @@ static struct file_struct *receive_file_
+@@ -512,7 +529,7 @@ static struct file_struct *receive_file_
        struct file_struct *file;
  
        if (!flist) {
@@ -102,33 +136,86 @@ command before "make":
                dev = 0, rdev = makedev(0, 0);
                rdev_major = 0;
                uid = 0, gid = 0;
-@@ -568,6 +581,8 @@ static struct file_struct *receive_file_
+@@ -568,6 +585,8 @@ static struct file_struct *receive_file_
                modtime = (time_t)read_int(f);
        if (!(flags & XMIT_SAME_MODE))
                mode = from_wire_mode(read_int(f));
 +      if (preserve_atimes && !S_ISDIR(mode) && !(flags & XMIT_SAME_ATIME))
 +              atime = (time_t)read_int(f);
  
-       if (preserve_uid && !(flags & XMIT_SAME_UID))
-               uid = (uid_t)read_int(f);
-@@ -618,6 +633,7 @@ static struct file_struct *receive_file_
-       file->flags = 0;
-       file->modtime = modtime;
-+      file->atime = atime;
+       if (chmod_modes && !S_ISLNK(mode))
+               mode = tweak_mode(mode, chmod_modes);
+@@ -623,6 +642,8 @@ static struct file_struct *receive_file_
        file->length = file_length;
        file->mode = mode;
-       file->uid = uid;
-@@ -864,6 +880,7 @@ struct file_struct *make_file(char *fnam
+       file->ids = id_pair(uid, gid);
++      if (preserve_atimes)
++              file->atime = atime;
+       if (dirname_len) {
+               file->dirname = lastdir = bp;
+@@ -648,12 +669,12 @@ static struct file_struct *receive_file_
+                           && lastname[del_hier_name_len-1] == '.'
+                           && lastname[del_hier_name_len-2] == '/')
+                               del_hier_name_len -= 2;
+-                      file->flags |= FLAG_TOP_DIR | FLAG_DEL_HERE;
++                      FFLAGS(file) |= FLAG_TOP_DIR | FLAG_DEL_HERE;
+               } else if (in_del_hier) {
+                       if (!relative_paths || !del_hier_name_len
+                        || (l1 >= del_hier_name_len
+                         && lastname[del_hier_name_len] == '/'))
+-                              file->flags |= FLAG_DEL_HERE;
++                              FFLAGS(file) |= FLAG_DEL_HERE;
+                       else
+                               in_del_hier = 0;
+               }
+@@ -874,11 +895,13 @@ struct file_struct *make_file(char *fnam
+       memset(bp, 0, file_struct_len);
+       bp += file_struct_len;
  
-       file->flags = flags;
+-      file->flags = flags;
++      FFLAGS(file) = flags;
        file->modtime = st.st_mtime;
-+      file->atime = st.st_atime;
        file->length = st.st_size;
-       if (chmod_modes && am_sender && (S_ISREG(st.st_mode) || S_ISDIR(st.st_mode)))
-               file->mode = tweak_mode(st.st_mode, chmod_modes);
---- orig/generator.c   2006-01-14 20:27:09
-+++ generator.c        2005-12-15 23:05:32
+       file->mode = st.st_mode;
+       file->ids = id_pair(st.st_uid, st.st_gid);
++      if (preserve_atimes)
++              file->atime = st.st_atime;
+ #ifdef SUPPORT_HARD_LINKS
+       if (flist && flist->hlink_pool) {
+@@ -989,7 +1012,7 @@ static void send_if_directory(int f, str
+       char is_dot_dir = fbuf[ol-1] == '.' && (ol == 1 || fbuf[ol-2] == '/');
+       if (S_ISDIR(file->mode)
+-          && !(file->flags & FLAG_MOUNT_POINT) && f_name(file, fbuf)) {
++          && !(FFLAGS(file) & FLAG_MOUNT_POINT) && f_name(file, fbuf)) {
+               void *save_filters;
+               unsigned int len = strlen(fbuf);
+               if (len > 1 && fbuf[len-1] == '/')
+@@ -1567,8 +1590,9 @@ static void clean_flist(struct file_list
+                       }
+                       /* Make sure that if we unduplicate '.', that we don't
+                        * lose track of a user-specified top directory. */
+-                      flist->files[keep]->flags |= flist->files[drop]->flags
+-                                                 & (FLAG_TOP_DIR|FLAG_DEL_HERE);
++                      FFLAGS(flist->files[keep])
++                          |= FFLAGS(flist->files[drop])
++                           & (FLAG_TOP_DIR|FLAG_DEL_HERE);
+                       clear_file(drop, flist);
+@@ -1630,7 +1654,7 @@ static void output_flist(struct file_lis
+                       file->dirname ? file->dirname : "",
+                       file->dirname ? "/" : "", NS(file->basename),
+                       S_ISDIR(file->mode) ? "/" : "", (int)file->mode,
+-                      (double)file->length, uidbuf, gidbuf, file->flags);
++                      (double)file->length, uidbuf, gidbuf, FFLAGS(file));
+       }
+ }
+--- orig/generator.c   2006-01-24 19:03:07
++++ generator.c        2006-01-24 19:19:42
 @@ -44,6 +44,7 @@ extern int preserve_uid;
  extern int preserve_gid;
  extern int preserve_times;
@@ -137,7 +224,56 @@ command before "make":
  extern int delete_before;
  extern int delete_during;
  extern int delete_after;
-@@ -343,10 +344,18 @@ void itemize(struct file_struct *file, i
+@@ -89,6 +90,7 @@ extern dev_t filesystem_dev;
+ extern char *backup_dir;
+ extern char *backup_suffix;
+ extern int backup_suffix_len;
++extern unsigned int file_struct_len;
+ extern struct file_list *the_file_list;
+ extern struct filter_list_struct server_filter_list;
+@@ -183,7 +185,7 @@ static int delete_item(char *fname, int 
+       for (j = dirlist->count; j--; ) {
+               struct file_struct *fp = dirlist->files[j];
+-              if (fp->flags & FLAG_MOUNT_POINT)
++              if (FFLAGS(fp) & FLAG_MOUNT_POINT)
+                       continue;
+               strlcpy(p, fp->basename, remainder);
+@@ -261,7 +263,7 @@ static void delete_in_dir(struct file_li
+       filt_array[cur_depth] = push_local_filters(fbuf, dlen);
+       if (one_file_system) {
+-              if (file->flags & FLAG_TOP_DIR)
++              if (FFLAGS(file) & FLAG_TOP_DIR)
+                       filesystem_dev = stp->st_dev;
+               else if (filesystem_dev != stp->st_dev)
+                       return;
+@@ -273,7 +275,7 @@ static void delete_in_dir(struct file_li
+        * from the filesystem. */
+       for (i = dirlist->count; i--; ) {
+               struct file_struct *fp = dirlist->files[i];
+-              if (!fp->basename || fp->flags & FLAG_MOUNT_POINT)
++              if (!fp->basename || FFLAGS(fp) & FLAG_MOUNT_POINT)
+                       continue;
+               if (flist_find(flist, fp) < 0) {
+                       int mode = fp->mode;
+@@ -300,11 +302,11 @@ static void do_delete_pass(struct file_l
+       for (j = 0; j < flist->count; j++) {
+               struct file_struct *file = flist->files[j];
+-              if (!(file->flags & FLAG_DEL_HERE))
++              if (!(FFLAGS(file) & FLAG_DEL_HERE))
+                       continue;
+               f_name(file, fbuf);
+-              if (verbose > 1 && file->flags & FLAG_TOP_DIR)
++              if (verbose > 1 && FFLAGS(file) & FLAG_TOP_DIR)
+                       rprintf(FINFO, "deleting in %s\n", fbuf);
+               if (link_stat(fbuf, &st, keep_dirlinks) < 0
+@@ -344,10 +346,18 @@ void itemize(struct file_struct *file, i
  
                if (S_ISREG(file->mode) && file->length != st->st_size)
                        iflags |= ITEM_REPORT_SIZE;
@@ -159,7 +295,7 @@ command before "make":
                if (preserve_perms
                 && (file->mode & CHMOD_BITS) != (st->st_mode & CHMOD_BITS))
                        iflags |= ITEM_REPORT_PERMS;
-@@ -395,7 +404,7 @@ int unchanged_file(char *fn, struct file
+@@ -396,7 +406,7 @@ int unchanged_file(char *fn, struct file
        if (ignore_times)
                return 0;
  
@@ -168,7 +304,14 @@ command before "make":
  }
  
  
-@@ -555,7 +564,7 @@ static int find_fuzzy(struct file_struct
+@@ -550,13 +560,13 @@ static int find_fuzzy(struct file_struct
+               uint32 dist;
+               if (!S_ISREG(fp->mode) || !fp->length
+-                  || fp->flags & FLAG_NO_FUZZY)
++                  || FFLAGS(fp) & FLAG_NO_FUZZY)
+                       continue;
                name = fp->basename;
  
                if (fp->length == file->length
@@ -177,7 +320,25 @@ command before "make":
                        if (verbose > 4) {
                                rprintf(FINFO,
                                        "fuzzy size/modtime match for %s\n",
-@@ -1068,7 +1077,7 @@ static void recv_generator(char *fname, 
+@@ -632,7 +642,7 @@ static int try_dests_reg(struct file_str
+                       if (!unchanged_attrs(file, stp))
+                               continue;
+                       if ((always_checksum || ignore_times)
+-                       && cmp_modtime(stp->st_mtime, file->modtime))
++                       && cmp_time(stp->st_mtime, file->modtime))
+                               continue;
+                       best_match = j;
+                       match_level = 3;
+@@ -894,7 +904,7 @@ static void recv_generator(char *fname, 
+                   && verbose && code && f_out != -1)
+                       rprintf(code, "%s/\n", fname);
+               if (delete_during && f_out != -1 && !phase && dry_run < 2
+-                  && (file->flags & FLAG_DEL_HERE))
++                  && (FFLAGS(file) & FLAG_DEL_HERE))
+                       delete_in_dir(the_file_list, fname, file, &st);
+               return;
+       }
+@@ -1071,7 +1081,7 @@ static void recv_generator(char *fname, 
        }
  
        if (update_only && statret == 0
@@ -186,7 +347,67 @@ command before "make":
                if (verbose > 1)
                        rprintf(FINFO, "%s is newer\n", fname);
                return;
---- orig/log.c 2006-01-17 02:16:40
+@@ -1174,7 +1184,7 @@ static void recv_generator(char *fname, 
+       if (fuzzy_basis) {
+               int j = flist_find(fuzzy_dirlist, file);
+               if (j >= 0) /* don't use changing file as future fuzzy basis */
+-                      fuzzy_dirlist->files[j]->flags |= FLAG_NO_FUZZY;
++                      FFLAGS(fuzzy_dirlist->files[j]) |= FLAG_NO_FUZZY;
+       }
+       /* open the file */
+--- orig/hlink.c       2006-01-14 20:27:09
++++ hlink.c    2006-01-24 19:17:58
+@@ -26,6 +26,7 @@ extern int link_dest;
+ extern int make_backups;
+ extern int log_format_has_i;
+ extern char *basis_dir[];
++extern unsigned int file_struct_len;
+ extern struct file_list *the_file_list;
+ #ifdef SUPPORT_HARD_LINKS
+@@ -86,10 +87,10 @@ static void link_idev_data(void)
+                       FPTR(cur)->link_u.links = pool_talloc(hlink_pool,
+                           struct hlink, 1, "hlink_list");
+-                      FPTR(head)->flags |= FLAG_HLINK_TOL;
++                      FFLAGS(FPTR(head)) |= FLAG_HLINK_TOL;
+                       FPTR(cur)->F_HLINDEX = to;
+                       FPTR(cur)->F_NEXT = head;
+-                      FPTR(cur)->flags |= FLAG_HLINK_EOL;
++                      FFLAGS(FPTR(cur)) |= FLAG_HLINK_EOL;
+                       hlink_list[to++] = head;
+               } else
+                       FPTR(cur)->link_u.links = NULL;
+@@ -175,7 +176,7 @@ int hard_link_check(struct file_struct *
+ {
+ #ifdef SUPPORT_HARD_LINKS
+       int head;
+-      if (skip && !(file->flags & FLAG_HLINK_EOL))
++      if (skip && !(FFLAGS(file) & FLAG_HLINK_EOL))
+               head = hlink_list[file->F_HLINDEX] = file->F_NEXT;
+       else
+               head = hlink_list[file->F_HLINDEX];
+@@ -270,8 +271,8 @@ void hard_link_cluster(struct file_struc
+       file->F_HLINDEX = FINISHED_LINK;
+       if (link_stat(f_name(file, hlink1), &st1, 0) < 0)
+               return;
+-      if (!(file->flags & FLAG_HLINK_TOL)) {
+-              while (!(file->flags & FLAG_HLINK_EOL)) {
++      if (!(FFLAGS(file) & FLAG_HLINK_TOL)) {
++              while (!(FFLAGS(file) & FLAG_HLINK_EOL)) {
+                       ndx = file->F_NEXT;
+                       file = FPTR(ndx);
+               }
+@@ -286,6 +287,6 @@ void hard_link_cluster(struct file_struc
+               maybe_hard_link(file, ndx, hlink2, statret, &st2,
+                               hlink1, &st1, itemizing, code);
+               file->F_HLINDEX = FINISHED_LINK;
+-      } while (!(file->flags & FLAG_HLINK_EOL));
++      } while (!(FFLAGS(file) & FLAG_HLINK_EOL));
+ #endif
+ }
+--- orig/log.c 2006-01-24 17:00:34
 +++ log.c      2005-12-15 23:05:44
 @@ -38,6 +38,7 @@ extern int module_id;
  extern int msg_fd_out;
@@ -196,7 +417,7 @@ command before "make":
  extern int log_format_has_i;
  extern int log_format_has_o_or_i;
  extern int daemon_log_format_has_o_or_i;
-@@ -542,11 +543,14 @@ static void log_formatted(enum logcode c
+@@ -543,11 +544,14 @@ static void log_formatted(enum logcode c
                        n[4] = !(iflags & ITEM_REPORT_TIME) ? '.'
                             : !preserve_times || IS_DEVICE(file->mode)
                                               || S_ISLNK(file->mode) ? 'T' : 't';
@@ -216,7 +437,7 @@ command before "make":
  
                        if (iflags & (ITEM_IS_NEW|ITEM_MISSING_DATA)) {
                                char ch = iflags & ITEM_IS_NEW ? '+' : '?';
---- orig/options.c     2006-01-14 08:14:30
+--- orig/options.c     2006-01-23 18:48:23
 +++ options.c  2005-11-07 04:32:19
 @@ -50,6 +50,7 @@ int preserve_uid = 0;
  int preserve_gid = 0;
@@ -226,7 +447,7 @@ command before "make":
  int update_only = 0;
  int cvs_exclude = 0;
  int dry_run = 0;
-@@ -293,8 +294,9 @@ void usage(enum logcode F)
+@@ -291,8 +292,9 @@ void usage(enum logcode F)
    rprintf(F," -o, --owner                 preserve owner (root only)\n");
    rprintf(F," -g, --group                 preserve group\n");
    rprintf(F," -D, --devices               preserve devices (root only)\n");
@@ -238,7 +459,7 @@ command before "make":
    rprintf(F,"     --chmod=CHMOD           change destination permissions\n");
    rprintf(F," -S, --sparse                handle sparse files efficiently\n");
    rprintf(F," -n, --dry-run               show what would have been transferred\n");
-@@ -402,6 +404,9 @@ static struct poptOption long_options[] 
+@@ -400,6 +402,9 @@ static struct poptOption long_options[] 
    {"times",           't', POPT_ARG_VAL,    &preserve_times, 1, 0, 0 },
    {"no-times",         0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
    {"no-t",             0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
@@ -248,7 +469,7 @@ command before "make":
    {"omit-dir-times",  'O', POPT_ARG_VAL,    &omit_dir_times, 2, 0, 0 },
    {"modify-window",    0,  POPT_ARG_INT,    &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
    {"owner",           'o', POPT_ARG_VAL,    &preserve_uid, 1, 0, 0 },
-@@ -1442,6 +1447,8 @@ void server_options(char **args,int *arg
+@@ -1468,6 +1473,8 @@ void server_options(char **args,int *arg
                argstr[x++] = 'D';
        if (preserve_times)
                argstr[x++] = 't';
@@ -257,7 +478,7 @@ command before "make":
        if (omit_dir_times == 2 && am_sender)
                argstr[x++] = 'O';
        if (preserve_perms)
---- orig/rsync.c       2006-01-14 08:14:31
+--- orig/rsync.c       2006-01-24 19:03:07
 +++ rsync.c    2005-07-28 00:17:37
 @@ -27,6 +27,7 @@ extern int dry_run;
  extern int daemon_log_format_has_i;
@@ -308,9 +529,9 @@ command before "make":
 +                      updated = 0;
        }
  
-       change_uid = am_root && preserve_uid && st->st_uid != file->uid;
---- orig/rsync.h       2006-01-14 20:27:10
-+++ rsync.h    2005-07-28 00:04:51
+       change_uid = am_root && preserve_uid && st->st_uid != file->ids->uid;
+--- orig/rsync.h       2006-01-24 19:03:07
++++ rsync.h    2006-01-24 19:32:22
 @@ -54,6 +54,7 @@
  #define XMIT_HAS_IDEV_DATA (1<<9)
  #define XMIT_SAME_DEV (1<<10)
@@ -335,15 +556,20 @@ command before "make":
  #define ITEM_REPORT_CHECKSUM (1<<1)
  #define ITEM_REPORT_SIZE (1<<2)
  #define ITEM_REPORT_TIME (1<<3)
-@@ -517,6 +520,7 @@ struct file_struct {
-               struct hlink *links;
-       } link_u;
+@@ -524,9 +527,12 @@ struct file_struct {
+       struct id_pair *ids;
        time_t modtime;
-+      time_t atime;
-       uid_t uid;
-       gid_t gid;
        mode_t mode;
---- orig/rsync.yo      2006-01-14 08:14:31
++      time_t atime;   /* this MUST be second to last */
+       uchar flags;    /* this item MUST remain last */
+ };
++#define FFLAGS(f) ((uchar*)(f))[file_struct_len-1]
++
+ /*
+  * Start the flist array at FLIST_START entries and grow it
+  * by doubling until FLIST_LINEAR then grow by FLIST_LINEAR
+--- orig/rsync.yo      2006-01-24 19:03:08
 +++ rsync.yo   2005-11-07 04:34:55
 @@ -319,8 +319,9 @@ to the detailed description below for a 
   -o, --owner                 preserve owner (root only)
@@ -370,8 +596,8 @@ command before "make":
  dit(bf(--chmod)) This options tells rsync to apply the listed "chmod" pattern
  to the permission of the files on the destination.  In addition to the normal
  parsing rules specified in the chmod manpage, you can specify an item that
-@@ -1160,7 +1167,7 @@ changes that are being made to each file
This is exactly the same as specifying bf(--log-format='%i %n%L').
+@@ -1180,7 +1187,7 @@ with older versions of rsync, but that a
verbose messages).
  
  The "%i" escape has a cryptic output that is 9 letters long.  The general
 -format is like the string bf(UXcstpoga)), where bf(U) is replaced by the
@@ -379,7 +605,7 @@ command before "make":
  kind of update being done, bf(X) is replaced by the file-type, and the
  other letters represent attributes that may be output if they are being
  modified.
-@@ -1199,17 +1206,22 @@ quote(itemize(
+@@ -1219,17 +1226,22 @@ quote(itemize(
    by the file transfer.
    it() A bf(t) means the modification time is different and is being updated
    to the sender's value (requires bf(--times)).  An alternate value of bf(T)
@@ -405,8 +631,36 @@ command before "make":
  ))
  
  One other output is possible:  when deleting files, the "%i" will output
---- orig/testsuite/atimes.test 2004-06-30 00:06:23
-+++ testsuite/atimes.test      2004-06-30 00:06:23
+--- orig/sender.c      2006-01-14 20:27:10
++++ sender.c   2006-01-24 18:10:23
+@@ -38,6 +38,7 @@ extern int do_progress;
+ extern int inplace;
+ extern int batch_fd;
+ extern int write_batch;
++extern unsigned int file_struct_len;
+ extern struct stats stats;
+ extern struct file_list *the_file_list;
+ extern char *log_format;
+@@ -126,7 +127,7 @@ void successful_send(int ndx)
+       file = the_file_list->files[ndx];
+       /* The generator might tell us about symlinks we didn't send. */
+-      if (!(file->flags & FLAG_SENT) && !S_ISLNK(file->mode))
++      if (!(FFLAGS(file) & FLAG_SENT) && !S_ISLNK(file->mode))
+               return;
+       if (file->dir.root) {
+               offset = stringjoin(fname, sizeof fname,
+@@ -370,7 +371,7 @@ void send_files(struct file_list *flist,
+                       rprintf(FINFO, "sender finished %s\n", fname);
+               /* Flag that we actually sent this entry. */
+-              file->flags |= FLAG_SENT;
++              FFLAGS(file) |= FLAG_SENT;
+       }
+       make_backups = save_make_backups;
+--- orig/testsuite/atimes.test 2006-01-24 19:30:25
++++ testsuite/atimes.test      2006-01-24 19:30:25
 @@ -0,0 +1,19 @@
 +#! /bin/sh
 +
@@ -423,12 +677,12 @@ command before "make":
 +
 +TLS_ARGS=--atime
 +
-+checkit "$RSYNC -rtAgvvv \"$fromdir/\" \"$todir/\"" "$fromdir" "$todir"
++checkit "$RSYNC -rtkgvvv \"$fromdir/\" \"$todir/\"" "$fromdir" "$todir"
 +
 +# The script would have aborted on error, so getting here means we've won.
 +exit 0
 --- orig/testsuite/itemize.test        2005-12-15 23:00:49
-+++ testsuite/itemize.test     2005-12-15 23:11:34
++++ testsuite/itemize.test     2006-01-24 19:29:18
 @@ -44,14 +44,14 @@ ln "$fromdir/foo/config1" "$fromdir/foo/
  $RSYNC -iplr "$fromdir/" "$todir/" \
      | tee "$outfile"
@@ -541,7 +795,7 @@ command before "make":
 +cf         foo/config1
 +cf         foo/config2
 +hf         foo/extra => foo/config1
-+cL..T..... foo/sym -> ../bar/baz/rsync
++cL..TA.... foo/sym -> ../bar/baz/rsync
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 8 failed"
  
@@ -814,7 +1068,7 @@ command before "make":
  
        return 0;
  }
---- orig/util.c        2006-01-14 08:14:31
+--- orig/util.c        2006-01-20 00:12:48
 +++ util.c     2006-01-14 08:20:29
 @@ -130,7 +130,7 @@ void overflow_exit(char *str)
  
@@ -865,7 +1119,7 @@ command before "make":
                t[1] = modtime;
                return utime(fname,t);
  #else
-@@ -1191,8 +1195,8 @@ int msleep(int t)
+@@ -1175,8 +1179,8 @@ int msleep(int t)
  
  
  /**
@@ -876,7 +1130,7 @@ command before "make":
   * --modify-window).
   *
   * @retval 0 if the times should be treated as the same
-@@ -1201,7 +1205,7 @@ int msleep(int t)
+@@ -1185,7 +1189,7 @@ int msleep(int t)
   *
   * @retval -1 if the 2nd is later
   **/