configuration parsing and loading code for rsyncd. This is based
[rsync/rsync.git] / token.c
diff --git a/token.c b/token.c
index 4e36cc6..a377b29 100644 (file)
--- a/token.c
+++ b/token.c
@@ -26,8 +26,8 @@ extern int do_compression;
 /* non-compressing recv token */
 static int simple_recv_token(int f,char **data)
 {
-  static int residue = 0;
-  static char *buf = NULL;
+  static int residue;
+  static char *buf;
   int n;
 
   if (!buf) {
@@ -99,7 +99,7 @@ static int last_run_end;
 static z_stream tx_strm;
 
 /* Output buffer */
-static char *obuf = NULL;
+static char *obuf;
 
 /* Send a deflated token */
 static void
@@ -116,8 +116,8 @@ send_deflated_token(int f, int token,
            tx_strm.zalloc = z_alloc;
            tx_strm.zfree = z_free;
            if (deflateInit2(&tx_strm, Z_DEFAULT_COMPRESSION, 8,
-                            -15, 8, Z_DEFAULT_STRATEGY, -4) != Z_OK) {
-               fprintf(FERROR, "compression init failed\n");
+                            -15, 8, Z_DEFAULT_STRATEGY) != Z_OK) {
+               rprintf(FERROR, "compression init failed\n");
                exit_cleanup(1);
            }
            if ((obuf = malloc(MAX_DATA_COUNT+2)) == NULL)
@@ -157,18 +157,18 @@ send_deflated_token(int f, int token,
            if (tx_strm.avail_in == 0 && nb != 0) {
                /* give it some more input */
                n = MIN(nb, CHUNK_SIZE);
-               tx_strm.next_in = map_ptr(buf, offset, n);
+               tx_strm.next_in = (Bytef *)map_ptr(buf, offset, n);
                tx_strm.avail_in = n;
                nb -= n;
                offset += n;
            }
            if (tx_strm.avail_out == 0) {
-               tx_strm.next_out = obuf + 2;
+               tx_strm.next_out = (Bytef *)(obuf + 2);
                tx_strm.avail_out = MAX_DATA_COUNT;
            }
            r = deflate(&tx_strm, nb? Z_NO_FLUSH: Z_PACKET_FLUSH);
            if (r != Z_OK) {
-               fprintf(FERROR, "deflate returned %d\n", r);
+               rprintf(FERROR, "deflate returned %d\n", r);
                exit_cleanup(1);
            }
            if (nb == 0 || tx_strm.avail_out == 0) {
@@ -185,13 +185,13 @@ send_deflated_token(int f, int token,
     if (token != -1) {
        /* add the data in the current block to the compressor's
           history and hash table */
-       tx_strm.next_in = map_ptr(buf, offset, toklen);
+       tx_strm.next_in = (Bytef *)map_ptr(buf, offset, toklen);
        tx_strm.avail_in = toklen;
        tx_strm.next_out = NULL;
        tx_strm.avail_out = 2 * toklen;
        r = deflate(&tx_strm, Z_INSERT_ONLY);
        if (r != Z_OK || tx_strm.avail_in != 0) {
-           fprintf(FERROR, "deflate on token returned %d (%d bytes left)\n",
+           rprintf(FERROR, "deflate on token returned %d (%d bytes left)\n",
                    r, tx_strm.avail_in);
            exit_cleanup(1);
        }
@@ -220,7 +220,8 @@ static int
 recv_deflated_token(int f, char **data)
 {
     int n, r, flag;
-    static int init_done = 0;
+    static int init_done;
+    static int saved_flag;
 
     for (;;) {
        switch (recv_state) {
@@ -230,7 +231,7 @@ recv_deflated_token(int f, char **data)
                rx_strm.zalloc = z_alloc;
                rx_strm.zfree = z_free;
                if (inflateInit2(&rx_strm, -15) != Z_OK) {
-                   fprintf(FERROR, "inflate init failed\n");
+                   rprintf(FERROR, "inflate init failed\n");
                    exit_cleanup(1);
                }
                if ((cbuf = malloc(MAX_DATA_COUNT)) == NULL
@@ -241,15 +242,20 @@ recv_deflated_token(int f, char **data)
                inflateReset(&rx_strm);
            }
            recv_state = r_idle;
+           rx_token = 0;
            break;
            
        case r_idle:
        case r_inflated:
-           flag = read_byte(f);
+           if (saved_flag) {
+               flag = saved_flag & 0xff;
+               saved_flag = 0;
+           } else
+               flag = read_byte(f);
            if ((flag & 0xC0) == DEFLATED_DATA) {
                n = ((flag & 0x3f) << 8) + read_byte(f);
                read_buf(f, cbuf, n);
-               rx_strm.next_in = cbuf;
+               rx_strm.next_in = (Bytef *)cbuf;
                rx_strm.avail_in = n;
                recv_state = r_inflating;
                break;
@@ -257,15 +263,24 @@ recv_deflated_token(int f, char **data)
            if (recv_state == r_inflated) {
                /* check previous inflated stuff ended correctly */
                rx_strm.avail_in = 0;
-               rx_strm.next_out = dbuf;
+               rx_strm.next_out = (Bytef *)dbuf;
                rx_strm.avail_out = CHUNK_SIZE;
                r = inflate(&rx_strm, Z_PACKET_FLUSH);
                n = CHUNK_SIZE - rx_strm.avail_out;
-               if (r != Z_OK || n != 0) {
-                   fprintf(FERROR, "inflate flush returned %d (%d bytes)\n",
+               if (r != Z_OK) {
+                   rprintf(FERROR, "inflate flush returned %d (%d bytes)\n",
                            r, n);
                    exit_cleanup(1);
                }
+               if (n != 0) {
+                   /* have to return some more data and
+                      save the flag for later. */
+                   saved_flag = flag + 0x10000;
+                   if (rx_strm.avail_out != 0)
+                       recv_state = r_idle;
+                   *data = dbuf;
+                   return n;
+               }
                recv_state = r_idle;
            }
            if (flag == END_FLAG) {
@@ -288,18 +303,21 @@ recv_deflated_token(int f, char **data)
            return -1 - rx_token;
 
        case r_inflating:
-           rx_strm.next_out = dbuf;
+           rx_strm.next_out = (Bytef *)dbuf;
            rx_strm.avail_out = CHUNK_SIZE;
            r = inflate(&rx_strm, Z_NO_FLUSH);
            n = CHUNK_SIZE - rx_strm.avail_out;
-           if (r != Z_OK || n == 0) {
-               fprintf(FERROR, "inflate returned %d (%d bytes)\n", r, n);
+           if (r != Z_OK) {
+               rprintf(FERROR, "inflate returned %d (%d bytes)\n", r, n);
                exit_cleanup(1);
            }
-           if (rx_strm.avail_out != 0)
+           if (rx_strm.avail_in == 0)
                recv_state = r_inflated;
-           *data = dbuf;
-           return n;
+           if (n != 0) {
+               *data = dbuf;
+               return n;
+           }
+           break;
 
        case r_running:
            ++rx_token;
@@ -319,11 +337,11 @@ see_deflate_token(char *buf, int len)
 {
     int r;
 
-    rx_strm.next_in = buf;
+    rx_strm.next_in = (Bytef *)buf;
     rx_strm.avail_in = len;
     r = inflateIncomp(&rx_strm);
     if (r != Z_OK) {
-       fprintf(FERROR, "inflateIncomp returned %d\n", r);
+       rprintf(FERROR, "inflateIncomp returned %d\n", r);
        exit_cleanup(1);
     }
 }
@@ -367,8 +385,6 @@ int recv_token(int f,char **data)
  */
 void see_token(char *data, int toklen)
 {
-    int r;
-
     if (do_compression)
        see_deflate_token(data, toklen);
 }