Mercurial > hg > nnchat
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; |