#ifdef ICONV_OPTION
static xbuf iconv_buf = EMPTY_XBUF;
#endif
-static int defer_forwarding_messages = 0;
+static int defer_forwarding_messages = 0, defer_forwarding_keep = 0;
static int select_timeout = SELECT_TIMEOUT;
static int active_filecnt = 0;
static OFF_T active_bytecnt = 0;
struct file_list *flist = flist_for_ndx(ndx);
assert(flist != NULL);
- assert(ndx >= flist->ndx_start);
if (remove_source_files) {
active_filecnt--;
send_msg(MSG_SUCCESS, buf, 4, 0);
if (preserve_hard_links) {
struct file_struct *file = flist->files[ndx - flist->ndx_start];
- if (F_IS_HLINKED(file))
+ if (F_IS_HLINKED(file)) {
flist_ndx_push(&hlink_list, ndx);
+ flist->in_progress++;
+ }
}
break;
case FES_REDO:
no_flush--;
msg_fd_in = fd;
- if (!--defer_forwarding_messages)
+ if (!--defer_forwarding_messages && !no_flush)
msg_flush();
}
else
memcpy(buffer + 4, buf, n);
+ defer_forwarding_keep = 1; /* defer_forwarding_messages++ on return */
writefd_unbuffered(fd, buffer, n+4);
+ defer_forwarding_keep = 0;
len -= n;
buf += n;
INIT_CONST_XBUF(outbuf, buffer);
INIT_XBUF(inbuf, (char*)buf, len, -1);
- defer_forwarding_messages++;
do {
iconvbufs(ic_send, &inbuf, &outbuf,
ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE);
writefd_unbuffered(fd, outbuf.buf, outbuf.len);
} while (inbuf.len);
- if (!--defer_forwarding_messages)
- msg_flush();
} else
#endif
- if (len) {
- defer_forwarding_messages++;
+ if (len)
writefd_unbuffered(fd, buf, len);
- if (!--defer_forwarding_messages)
- msg_flush();
- }
+
+ if (!--defer_forwarding_messages && !no_flush)
+ msg_flush();
}
int send_msg(enum msgcode code, const char *buf, int len, int convert)
}
no_flush--;
- if (!(defer_forwarding_messages -= defer_inc))
+ defer_inc -= defer_forwarding_keep;
+ if (!(defer_forwarding_messages -= defer_inc) && !no_flush)
msg_flush();
}
* actual communication so far depends on whether a daemon
* is involved. */
write_int(batch_fd, protocol_version);
+ if (protocol_version >= 30)
+ write_byte(batch_fd, inc_recurse);
write_int(batch_fd, checksum_seed);
if (am_sender)