+
+#define SID_UPDATING ITEM_UPDATING
+#define SID_REPORT_CHECKSUM ITEM_REPORT_CHECKSUM
+#define SID_USING_ALT_BASIS ITEM_USING_ALT_BASIS
+/* This flag doesn't get sent, so it must be outside 0xffff. */
+#define SID_NO_DEST_AND_NO_UPDATE (1<<16)
+
+static void itemize(struct file_struct *file, int statret, STRUCT_STAT *st,
+ int32 sflags, int f_out, int ndx)
+{
+ int iflags = sflags & 0xffff;
+
+ if (statret >= 0) {
+ if (S_ISREG(file->mode) && file->length != st->st_size)
+ iflags |= ITEM_REPORT_SIZE;
+ if (!(sflags & SID_NO_DEST_AND_NO_UPDATE)) {
+ int keep_time = !preserve_times ? 0
+ : S_ISDIR(file->mode) ? !omit_dir_times
+ : !S_ISLNK(file->mode);
+
+ if ((iflags & ITEM_UPDATING && !keep_time)
+ || (keep_time && file->modtime != st->st_mtime))
+ iflags |= ITEM_REPORT_TIME;
+ if (preserve_perms && file->mode != st->st_mode)
+ iflags |= ITEM_REPORT_PERMS;
+ if (preserve_uid && am_root && file->uid != st->st_uid)
+ iflags |= ITEM_REPORT_OWNER;
+ if (preserve_gid && file->gid != GID_NONE
+ && st->st_gid != file->gid)
+ iflags |= ITEM_REPORT_GROUP;
+ }
+ } else
+ iflags |= ITEM_IS_NEW | ITEM_UPDATING;
+
+ if ((iflags || verbose > 1) && !read_batch) {
+ if (protocol_version >= 29) {
+ if (ndx >= 0)
+ write_int(f_out, ndx);
+ write_shortint(f_out, iflags);
+ } else if (ndx >= 0)
+ log_recv(file, &stats, iflags);