- int len;
- int iflags = protocol_version >= 29 ? read_shortint(f_in)
- : ITEM_TRANSFER | ITEM_MISSING_DATA;
- int isave = iflags; /* XXX remove soon */
-
- /* Handle the new keep-alive (no-op) packet. */
- if (ndx == the_file_list->count && iflags == ITEM_IS_NEW)
- ;
- else if (ndx < 0 || ndx >= the_file_list->count) {
- rprintf(FERROR, "Invalid file index %d (count=%d) [%s]\n",
- ndx, the_file_list->count, who_am_i());
- exit_cleanup(RERR_PROTOCOL);
- } else if (iflags == ITEM_IS_NEW) {
- rprintf(FERROR, "Invalid itemized flag word [%s]\n",
- who_am_i());
- exit_cleanup(RERR_PROTOCOL);
- }
-
- if (iflags & ITEM_HARD_LINKED)
- len = read_vstring(f_in, buf, MAXPATHLEN);
- else {
- *buf = '\0';
- len = -1;
- }
-
- /* XXX Temporary backward compatibility when talking to 2.6.4pre[12] */
- if (protocol_version >= 29 && iflags & ITEM_TRANSFER
- && !S_ISREG(the_file_list->files[ndx]->mode)) {
- iflags &= ~ITEM_TRANSFER;
- iflags |= ITEM_LOCAL_CHANGE;
- }
-
- if (iflags & ITEM_TRANSFER) {
- if (!S_ISREG(the_file_list->files[ndx]->mode)) {
- rprintf(FERROR,
- "received index of non-regular file: %d [%s]\n",
- ndx, who_am_i());
- exit_cleanup(RERR_PROTOCOL);
- }
- } else if (f_out >= 0) {
- write_int(f_out, ndx);
- write_shortint(f_out, isave /*XXX iflags */);
- if (len >= 0)
- write_vstring(f_out, buf, len);
- }
-
- return iflags;
+ write_ndx(f_out, ndx);
+ if (protocol_version < 29)
+ return;
+ write_shortint(f_out, iflags);
+ if (iflags & ITEM_BASIS_TYPE_FOLLOWS)
+ write_byte(f_out, fnamecmp_type);
+ if (iflags & ITEM_XNAME_FOLLOWS)
+ write_vstring(f_out, buf, len);
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers)
+ send_xattr_request(fname, file, f_out);
+#endif