X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/98f8c9a5e54d90043248f8c64228e15a2baeec30..031fa9ad4d17da5759bade845985e24ef2d14c98:/io.c diff --git a/io.c b/io.c index 5d5b030c..9b951005 100644 --- a/io.c +++ b/io.c @@ -48,6 +48,7 @@ extern int am_daemon; extern int am_sender; extern int am_generator; extern int eol_nulls; +extern int csum_length; extern int checksum_seed; extern int protocol_version; extern char *remote_filesfrom_file; @@ -679,8 +680,9 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) case MSG_INFO: case MSG_ERROR: if (remaining >= sizeof line) { - rprintf(FERROR, "multiplexing overflow %d:%ld\n\n", - tag, (long)remaining); + rprintf(FERROR, + "[%s] multiplexing overflow %d:%ld\n\n", + who_am_i(), tag, (long)remaining); exit_cleanup(RERR_STREAMIO); } read_loop(fd, line, remaining); @@ -688,7 +690,8 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) remaining = 0; break; default: - rprintf(FERROR, "unexpected tag %d\n", tag); + rprintf(FERROR, "[%s] unexpected tag %d\n", + who_am_i(), tag); exit_cleanup(RERR_STREAMIO); } } @@ -747,14 +750,13 @@ int64 read_longint(int f) if ((int32)ret != (int32)0xffffffff) return ret; -#ifdef INT64_IS_OFF_T - if (sizeof (int64) < 8) { - rprintf(FERROR, "Integer overflow: attempted 64-bit offset\n"); - exit_cleanup(RERR_UNSUPPORTED); - } -#endif +#if SIZEOF_INT64 < 8 + rprintf(FERROR, "Integer overflow: attempted 64-bit offset\n"); + exit_cleanup(RERR_UNSUPPORTED); +#else readfd(f,b,8); ret = IVAL(b,0) | (((int64)IVAL(b,4))<<32); +#endif return ret; } @@ -777,6 +779,47 @@ unsigned char read_byte(int f) return c; } +/* Populate a sum_struct with values from the socket. This is + * called by both the sender and the receiver. */ +void read_sum_head(int f, struct sum_struct *sum) +{ + sum->count = read_int(f); + sum->blength = read_int(f); + if (sum->blength < 0 || sum->blength > MAX_BLOCK_SIZE) { + rprintf(FERROR, "Invalid block length %ld\n", + (long)sum->blength); + exit_cleanup(RERR_PROTOCOL); + } + sum->s2length = protocol_version < 27 ? csum_length : (int)read_int(f); + if (sum->s2length < 0 || sum->s2length > MD4_SUM_LENGTH) { + rprintf(FERROR, "Invalid checksum length %d\n", sum->s2length); + exit_cleanup(RERR_PROTOCOL); + } + sum->remainder = read_int(f); + if (sum->remainder < 0 || sum->remainder > sum->blength) { + rprintf(FERROR, "Invalid remainder length %ld\n", + (long)sum->remainder); + exit_cleanup(RERR_PROTOCOL); + } +} + +/* Send the values from a sum_struct over the socket. Set sum to + * NULL if there are no checksums to send. This is called by both + * the generator and the sender. */ +void write_sum_head(int f, struct sum_struct *sum) +{ + static struct sum_struct null_sum; + + if (sum == NULL) + sum = &null_sum; + + write_int(f, sum->count); + write_int(f, sum->blength); + if (protocol_version >= 27) + write_int(f, sum->s2length); + write_int(f, sum->remainder); +} + /** * Sleep after writing to limit I/O bandwidth usage. @@ -916,7 +959,7 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) /* If the other side is sending us error messages, try * to grab any messages they sent before they died. */ while (fd == sock_f_out && io_multiplexing_in) { - io_timeout = 30; + io_timeout = select_timeout = 30; readfd_unbuffered(sock_f_in, io_filesfrom_buf, sizeof io_filesfrom_buf); } @@ -1040,18 +1083,16 @@ void write_longint(int f, int64 x) return; } -#ifdef INT64_IS_OFF_T - if (sizeof (int64) < 8) { - rprintf(FERROR, "Integer overflow: attempted 64-bit offset\n"); - exit_cleanup(RERR_UNSUPPORTED); - } -#endif - +#if SIZEOF_INT64 < 8 + rprintf(FERROR, "Integer overflow: attempted 64-bit offset\n"); + exit_cleanup(RERR_UNSUPPORTED); +#else write_int(f, (int32)0xFFFFFFFF); SIVAL(b,0,(x&0xFFFFFFFF)); SIVAL(b,4,((x>>32)&0xFFFFFFFF)); writefd(f,b,8); +#endif } void write_buf(int f,char *buf,size_t len)