static int active_filecnt = 0;
static OFF_T active_bytecnt = 0;
-static char int_byte_cnt[256] = {
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 00 - 0F */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 10 - 1F */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 20 - 2F */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 30 - 3F */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 40 - 4F */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 50 - 5F */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 60 - 6F */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 70 - 7F */
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* 80 - 8F */
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* 90 - 9F */
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* A0 - AF */
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* B0 - BF */
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, /* C0 - CF */
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, /* D0 - DF */
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, /* E0 - EF */
- 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, /* F0 - FF */
+static char int_byte_cnt[64] = {
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* (00 - 3F)/4 */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* (40 - 7F)/4 */
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* (80 - BF)/4 */
+ 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 8, 9, /* (C0 - FF)/4 */
};
static void read_loop(int fd, char *buf, size_t len);
flist_ndx_push(&hlink_list, IVAL(buf,0));
break;
case MSG_SOCKERR:
+ case MSG_CLIENT:
if (!am_generator) {
rprintf(FERROR, "invalid message %d:%d\n", tag, len);
exit_cleanup(RERR_STREAMIO);
}
- close_multiplexing_out();
+ if (tag == MSG_SOCKERR)
+ close_multiplexing_out();
/* FALL THROUGH */
case MSG_INFO:
case MSG_ERROR:
{
/* TODO: tune these limits? */
while (active_filecnt >= (active_bytecnt >= 128*1024 ? 10 : 50)) {
+#ifdef SUPPORT_HARD_LINKS
if (hlink_list.head)
check_for_finished_hlinks(itemizing, code);
+#endif
read_msg_fd();
}
active_filecnt++;
- active_bytecnt += the_file_list->files[ndx]->length;
+ active_bytecnt += F_LENGTH(the_file_list->files[ndx]);
}
void decrement_active_files(int ndx)
{
active_filecnt--;
- active_bytecnt -= the_file_list->files[ndx]->length;
+ active_bytecnt -= F_LENGTH(the_file_list->files[ndx]);
}
/* Try to push messages off the list onto the wire. If we leave with more
return 1;
}
+void send_msg_int(enum msgcode code, int num)
+{
+ char numbuf[4];
+ SIVAL(numbuf, 0, num);
+ send_msg(code, numbuf, 4);
+}
+
int get_redo_num(int itemizing, enum logcode code)
{
while (1) {
+#ifdef SUPPORT_HARD_LINKS
if (hlink_list.head)
check_for_finished_hlinks(itemizing, code);
+#endif
if (redo_list.head)
break;
read_msg_fd();
} else {
int cnt;
readfd(f, b, 3);
- cnt = int_byte_cnt[CVAL(b, 0)];
+ cnt = int_byte_cnt[CVAL(b, 0) / 4];
+#if SIZEOF_INT64 < 8
+ if (cnt > 5 || (cnt == 5 && (CVAL(b,0)&0x3F || CVAL(b,1)&0x80))) {
+ rprintf(FERROR, "Integer overflow: attempted 64-bit offset\n");
+ exit_cleanup(RERR_UNSUPPORTED);
+ }
+#endif
if (cnt > 3)
readfd(f, b + 3, cnt - 3);
switch (cnt) {
case 5:
num = NVAL5(b, 0xC0);
break;
+#if SIZEOF_INT64 >= 8
case 6:
num = NVAL6(b, 0xE0);
break;
case 9:
num = NVAL8(b+1, 0);
break;
+#endif
default:
- exit_cleanup(RERR_PROTOCOL); // XXX impossible
+ exit_cleanup(RERR_PROTOCOL); /* impossible... */
}
}
b[2] = (char)(x >> 8);
b[3] = (char)x;
writefd(f, b, 4);
+#if SIZEOF_INT64 < 8
+ } else {
+ b[0] = 0xC0;
+ b[1] = (char)(x >> 24);
+ b[2] = (char)(x >> 16);
+ b[3] = (char)(x >> 8);
+ b[4] = (char)x;
+ writefd(f, b, 5);
+ }
+#else
} else if (x < ((int64)1<<(5*8-3))) {
b[0] = (char)((x >> 32) | 0xC0);
b[1] = (char)(x >> 24);
b[3] = (char)(x >> 8);
b[4] = (char)x;
writefd(f, b, 5);
-#if SIZEOF_INT64 >= 8
} else if (x < ((int64)1<<(6*8-4))) {
b[0] = (char)((x >> 40) | 0xE0);
b[1] = (char)(x >> 32);
b[7] = (char)(x >> 8);
b[8] = (char)x;
writefd(f, b, 9);
-#endif
}
+#endif
}
void write_buf(int f, const char *buf, size_t len)
void start_write_batch(int fd)
{
- write_stream_flags(batch_fd);
-
/* Some communication has already taken place, but we don't
* enable batch writing until here so that we can write a
* canonical record of the communication even though the