comparison 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
comparison
equal deleted inserted replaced
359:8f3c102db611 360:b465a17ffa47
181 goto error; 181 goto error;
182 } 182 }
183 183
184 FD_ZERO(&(conn->sockfds)); 184 FD_ZERO(&(conn->sockfds));
185 FD_SET(conn->socket, &(conn->sockfds)); 185 FD_SET(conn->socket, &(conn->sockfds));
186 186
187 /* Proxy-specific setup */ 187 /* Proxy-specific setup */
188 if (conn->proxy.type == NN_PROXY_SOCKS4 || conn->proxy.type == NN_PROXY_SOCKS4A) { 188 if (conn->proxy.type == NN_PROXY_SOCKS4 || conn->proxy.type == NN_PROXY_SOCKS4A) {
189 struct nn_socks_t *socksh; 189 struct nn_socks_t *socksh;
190 size_t bufsiz = sizeof(struct nn_socks_t) + strlen(userid) + 1; 190 size_t bufsiz = sizeof(struct nn_socks_t) + strlen(userid) + 1;
191 char *ptr, *buf; 191 char *ptr, *buf;
219 ptr += strlen(userid) + 1; 219 ptr += strlen(userid) + 1;
220 strcpy(ptr, conn->host); 220 strcpy(ptr, conn->host);
221 } 221 }
222 222
223 /* Send request */ 223 /* Send request */
224 nn_conn_reset(conn);
224 if (!nn_conn_send_buf(conn, buf, bufsiz)) { 225 if (!nn_conn_send_buf(conn, buf, bufsiz)) {
225 th_free(buf); 226 th_free(buf);
226 nn_conn_err(conn, "Error sending SOCKS proxy request.\n"); 227 nn_conn_err(conn, "Error sending SOCKS proxy request.\n");
227 goto error; 228 goto error;
228 } 229 }
229 th_free(buf); 230 th_free(buf);
230 231
231 /* Wait for SOCKS server to reply */ 232 /* Wait for SOCKS server to reply */
232 for (status = tries = 1; tries <= 20 && status > 0; tries++) { 233 for (status = tries = 1; tries <= 20 && status > 0; tries++) {
233 usleep(500); 234 usleep(500);
235 nn_conn_reset(conn);
234 status = nn_conn_pull(conn); 236 status = nn_conn_pull(conn);
235 } 237 }
236 238
237 /* Check results */ 239 /* Check results */
238 if (status == 0) { 240 if (status == 0) {
262 nn_conn_err(conn, "Proxy negotiation timed out.\n"); 264 nn_conn_err(conn, "Proxy negotiation timed out.\n");
263 goto error; 265 goto error;
264 } 266 }
265 } 267 }
266 268
269 nn_conn_reset(conn);
267 conn->status = NN_CONN_OPEN; 270 conn->status = NN_CONN_OPEN;
268 return 0; 271 return 0;
269 272
270 error: 273 error:
271 conn->status = NN_CONN_CLOSED; 274 conn->status = NN_CONN_CLOSED;
314 } 317 }
315 318
316 return TRUE; 319 return TRUE;
317 } 320 }
318 321
322 void nn_conn_reset(nn_conn_t *conn)
323 {
324 if (conn != NULL) {
325 conn->ptr = conn->buf;
326 conn->got = conn->total = 0;
327 }
328 }
319 329
320 int nn_conn_pull(nn_conn_t *conn) 330 int nn_conn_pull(nn_conn_t *conn)
321 { 331 {
322 int result; 332 int result;
323 struct timeval socktv; 333 struct timeval socktv;
324 fd_set tmpfds; 334 fd_set tmpfds;
325 335
326 if (conn == NULL) 336 if (conn == NULL)
327 return -10; 337 return -10;
328
329 conn->ptr = conn->buf;
330 338
331 /* Check for incoming data */ 339 /* Check for incoming data */
332 socktv.tv_sec = 0; 340 socktv.tv_sec = 0;
333 socktv.tv_usec = NN_DELAY_USEC; 341 socktv.tv_usec = NN_DELAY_USEC;
334 tmpfds = conn->sockfds; 342 tmpfds = conn->sockfds;
340 socket, conn->err, nn_get_socket_errstr(conn->err)); 348 socket, conn->err, nn_get_socket_errstr(conn->err));
341 return -1; 349 return -1;
342 } 350 }
343 } else 351 } else
344 if (FD_ISSET(conn->socket, &tmpfds)) { 352 if (FD_ISSET(conn->socket, &tmpfds)) {
345 conn->got = recv(conn->socket, conn->buf, NN_CONNBUF_SIZE, 0); 353 conn->got = recv(conn->socket, conn->ptr, NN_CONNBUF_SIZE - conn->total, 0);
346 if (conn->got < 0) { 354 if (conn->got < 0) {
347 conn->err = nn_get_socket_errno(); 355 conn->err = nn_get_socket_errno();
348 nn_conn_err(conn, "Error in recv: %d, %s\n", conn->err, nn_get_socket_errstr(conn->err)); 356 nn_conn_err(conn, "Error in recv: %d, %s\n", conn->err, nn_get_socket_errstr(conn->err));
349 return -2; 357 return -2;
350 } else if (conn->got == 0) { 358 } else if (conn->got == 0) {
351 nn_conn_err(conn, "Server closed connection.\n"); 359 nn_conn_err(conn, "Server closed connection.\n");
352 conn->status = NN_CONN_CLOSED; 360 conn->status = NN_CONN_CLOSED;
353 return -3; 361 return -3;
354 } else { 362 } else {
355 /* Handle protocol data */ 363 /* Handle protocol data */
356 conn->buf[conn->got] = 0; 364 conn->total += conn->got;
365 conn->ptr += conn->got;
357 return 0; 366 return 0;
358 } 367 }
359 } 368 }
360 369
361 return 1; 370 return 1;