diff libnnchat.c @ 360:b465a17ffa47

Finally fix handling of long packets.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 23 Jun 2011 10:37:11 +0300
parents 8f3c102db611
children 88ac689d11bc
line wrap: on
line diff
--- a/libnnchat.c	Thu Jun 23 10:11:45 2011 +0300
+++ b/libnnchat.c	Thu Jun 23 10:37:11 2011 +0300
@@ -183,7 +183,7 @@
 
     FD_ZERO(&(conn->sockfds));
     FD_SET(conn->socket, &(conn->sockfds));
-
+    
     /* Proxy-specific setup */
     if (conn->proxy.type == NN_PROXY_SOCKS4 || conn->proxy.type == NN_PROXY_SOCKS4A) {
         struct nn_socks_t *socksh;
@@ -221,6 +221,7 @@
         }
         
         /* Send request */
+        nn_conn_reset(conn);
         if (!nn_conn_send_buf(conn, buf, bufsiz)) {
             th_free(buf);
             nn_conn_err(conn, "Error sending SOCKS proxy request.\n");
@@ -231,6 +232,7 @@
         /* Wait for SOCKS server to reply */
         for (status = tries = 1; tries <= 20 && status > 0; tries++) {
             usleep(500);
+            nn_conn_reset(conn);
             status = nn_conn_pull(conn);
         }
         
@@ -264,6 +266,7 @@
         }
     }
 
+    nn_conn_reset(conn);
     conn->status = NN_CONN_OPEN;
     return 0;
 
@@ -316,6 +319,13 @@
     return TRUE;
 }
 
+void nn_conn_reset(nn_conn_t *conn)
+{
+    if (conn != NULL) {
+        conn->ptr = conn->buf;
+        conn->got = conn->total = 0;
+    }
+}
 
 int nn_conn_pull(nn_conn_t *conn)
 {
@@ -326,8 +336,6 @@
     if (conn == NULL)
         return -10;
 
-    conn->ptr = conn->buf;
-
     /* Check for incoming data */
     socktv.tv_sec = 0;
     socktv.tv_usec = NN_DELAY_USEC;
@@ -342,7 +350,7 @@
         }
     } else
     if (FD_ISSET(conn->socket, &tmpfds)) {
-        conn->got = recv(conn->socket, conn->buf, NN_CONNBUF_SIZE, 0);
+        conn->got = recv(conn->socket, conn->ptr, NN_CONNBUF_SIZE - conn->total, 0);
         if (conn->got < 0) {
             conn->err = nn_get_socket_errno();
             nn_conn_err(conn, "Error in recv: %d, %s\n", conn->err, nn_get_socket_errstr(conn->err));
@@ -353,7 +361,8 @@
             return -3;
         } else {
             /* Handle protocol data */
-            conn->buf[conn->got] = 0;
+            conn->total += conn->got;
+            conn->ptr += conn->got;
             return 0;
         }
     }