Improved the "log format" section some more.
[rsync/rsync.git] / io.c
diff --git a/io.c b/io.c
index 1cfcd72..004ae66 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;
@@ -148,7 +149,7 @@ static void check_timeout(void)
 
        if (t - last_io >= io_timeout) {
                if (!am_server && !am_daemon) {
-                       rprintf(FERROR, "io timeout after %d seconds - exiting\n",
+                       rprintf(FERROR, "io timeout after %d seconds -- exiting\n",
                                (int)(t-last_io));
                }
                exit_cleanup(RERR_TIMEOUT);
@@ -749,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;
 }
@@ -779,6 +779,48 @@ 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, "[%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, "[%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, "[%s] Invalid remainder length %ld\n",
+                       who_am_i(), (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.
@@ -1042,18 +1084,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)