Moved read_sum_head() here from sender.c (because the generator uses it
[rsync/rsync.git] / io.c
diff --git a/io.c b/io.c
index 62880fb..762cf81 100644 (file)
--- 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);
                }
        }
@@ -777,6 +780,30 @@ 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);
+       }
+}
+
 
 /**
  * Sleep after writing to limit I/O bandwidth usage.