-/* This is also used by receive.c with f_out = -1. */
-int read_item_attrs(int f_in, int f_out, int ndx, uchar *type_ptr,
- char *buf, int *len_ptr)
-{
- int len;
- uchar fnamecmp_type = FNAMECMP_FNAME;
- int iflags = protocol_version >= 29 ? read_shortint(f_in)
- : ITEM_TRANSFER | ITEM_MISSING_DATA;
-
- /* 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: %x [%s]\n",
- iflags, who_am_i());
- exit_cleanup(RERR_PROTOCOL);
- }
-
- if (iflags & ITEM_BASIS_TYPE_FOLLOWS)
- fnamecmp_type = read_byte(f_in);
- *type_ptr = fnamecmp_type;
-
- if (iflags & ITEM_XNAME_FOLLOWS) {
- if ((len = read_vstring(f_in, buf, MAXPATHLEN)) < 0)
- exit_cleanup(RERR_PROTOCOL);
- } else {
- *buf = '\0';
- len = -1;
- }
- *len_ptr = len;
-
- /* XXX Temporary rejection of 2.6.4pre1 & pre2 */
- if (iflags & ITEM_DUMMY_BIT) {
- extern int am_sender;
- if (!am_sender || !(iflags & (ITEM_LOCAL_CHANGE|ITEM_TRANSFER))) {
- rprintf(FERROR,
- "Incompatible 2.6.4 pre-release on %s -- upgrade it or use --protocol=28!\n",
- am_sender ? "receiver" : "sender");
- exit_cleanup(RERR_PROTOCOL);
- }
- iflags &= ~ITEM_DUMMY_BIT;
- } /* XXX */
-
- if (iflags & ITEM_TRANSFER) {
- if (!S_ISREG(the_file_list->files[ndx]->mode)) {
- rprintf(FERROR,
- "received request to transfer non-regular file: %d [%s]\n",
- ndx, who_am_i());
- exit_cleanup(RERR_PROTOCOL);
- }
- } else if (f_out >= 0) {
- write_ndx_and_attrs(f_out, ndx, iflags,
- fnamecmp_type, buf, len);
- }
-
- return iflags;
-}
-
-void send_files(struct file_list *flist, int f_out, int f_in)