+/* This is also used by receive.c with f_out = -1. */
+int read_iflags(int f_in, int f_out, int ndx, char *buf)
+{
+ 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);
+ if (protocol_version >= 29)
+ write_shortint(f_out, isave /*XXX iflags */);
+ if (len >= 0)
+ write_vstring(f_out, buf, len);
+ }
+
+ return iflags;
+}
+