X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/4ccfd96cfee813f3855be5a902acc3d5cd0545a4..0d67e00af8119231c94951f1291c96a8d09861c8:/io.c diff --git a/io.c b/io.c index 828f552b..f01353ff 100644 --- a/io.c +++ b/io.c @@ -203,6 +203,10 @@ static void msg_list_add(int code, char *buf, int len) void send_msg(enum msgcode code, char *buf, int len) { + if (msg_fd_out < 0) { + io_multiplex_write(code, buf, len); + return; + } msg_list_add(code, buf, len); msg_list_push(NORMAL_FLUSH); } @@ -244,6 +248,14 @@ static void read_msg_fd(void) read_loop(fd, buf, 4); redo_list_add(IVAL(buf,0)); break; + case MSG_DELETED: + if (len >= (int)sizeof buf || !am_generator) { + rprintf(FERROR, "invalid message %d:%d\n", tag, len); + exit_cleanup(RERR_STREAMIO); + } + read_loop(fd, buf, len); + io_multiplex_write(MSG_DELETED, buf, len); + break; case MSG_INFO: case MSG_ERROR: case MSG_LOG: @@ -640,7 +652,7 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) static size_t remaining; static size_t iobuf_in_ndx; int tag, ret = 0; - char line[1024]; + char line[MAXPATHLEN+1]; if (!iobuf_in || fd != sock_f_in) return read_timeout(fd, buf, len); @@ -677,6 +689,21 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) read_loop(fd, iobuf_in, remaining); iobuf_in_ndx = 0; break; + case MSG_DELETED: + if (remaining >= sizeof line) { + rprintf(FERROR, "invalid multi-message %d:%ld\n", + tag, (long)remaining); + exit_cleanup(RERR_STREAMIO); + } + read_loop(fd, line, remaining); + line[remaining] = '\0'; + /* A directory name was sent with the trailing null */ + if (remaining > 0 && !line[remaining-1]) + log_delete(line, S_IFDIR); + else + log_delete(line, S_IFREG); + remaining = 0; + break; case MSG_INFO: case MSG_ERROR: if (remaining >= sizeof line) { @@ -729,6 +756,14 @@ static void readfd(int fd, char *buffer, size_t N) } +int read_shortint(int f) +{ + uchar b[2]; + readfd(f, (char *)b, 2); + return (b[1] << 8) + b[0]; +} + + int32 read_int(int f) { char b[4]; @@ -772,9 +807,9 @@ void read_sbuf(int f,char *buf,size_t len) buf[len] = 0; } -unsigned char read_byte(int f) +uchar read_byte(int f) { - unsigned char c; + uchar c; readfd(f, (char *)&c, 1); return c; } @@ -786,19 +821,20 @@ 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); + rprintf(FERROR, "[%s] Invalid block length %ld\n", + who_am_i(), (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); + rprintf(FERROR, "[%s] Invalid checksum length %d\n", + who_am_i(), 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); + rprintf(FERROR, "[%s] Invalid remainder length %ld\n", + who_am_i(), (long)sum->remainder); exit_cleanup(RERR_PROTOCOL); } } @@ -1054,6 +1090,15 @@ static void writefd(int fd,char *buf,size_t len) } +void write_shortint(int f, int x) +{ + uchar b[2]; + b[0] = x; + b[1] = x >> 8; + writefd(f, (char *)b, 2); +} + + void write_int(int f,int32 x) { char b[4]; @@ -1100,19 +1145,20 @@ void write_buf(int f,char *buf,size_t len) writefd(f,buf,len); } + /** Write a string to the connection */ void write_sbuf(int f, char *buf) { writefd(f, buf, strlen(buf)); } -void write_byte(int f,unsigned char c) + +void write_byte(int f, uchar c) { writefd(f, (char *)&c, 1); } - /** * Read a line of up to @p maxlen characters into @p buf (not counting * the trailing null). Strips the (required) trailing newline and all