X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/3a993aa4bfb2b968012dc40eb1b4fd3fa4a81c6c..112d728f4858fef5c75e0b25bf6f02af8aa5b83c:/io.c diff --git a/io.c b/io.c index dd51c99e..05a755fb 100644 --- a/io.c +++ b/io.c @@ -342,13 +342,13 @@ void increment_active_files(int ndx, int itemizing, enum logcode code) } 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 @@ -405,6 +405,13 @@ int send_msg(enum msgcode code, const char *buf, int len) 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) { @@ -917,6 +924,12 @@ int64 read_longint(int f) int cnt; readfd(f, b, 3); cnt = int_byte_cnt[CVAL(b, 0)]; +#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) { @@ -929,6 +942,7 @@ int64 read_longint(int f) case 5: num = NVAL5(b, 0xC0); break; +#if SIZEOF_INT64 >= 8 case 6: num = NVAL6(b, 0xE0); break; @@ -941,8 +955,9 @@ int64 read_longint(int f) case 9: num = NVAL8(b+1, 0); break; +#endif default: - exit_cleanup(RERR_PROTOCOL); // XXX impossible + exit_cleanup(RERR_PROTOCOL); /* impossible... */ } } @@ -1344,6 +1359,16 @@ void write_longint(int f, int64 x) 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); @@ -1351,7 +1376,6 @@ void write_longint(int f, int64 x) 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); @@ -1391,8 +1415,8 @@ void write_longint(int f, int64 x) 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)