| 310 |
310 |
| 311 /* TODO: Non-blocking! */ |
311 /* TODO: Non-blocking! */ |
| 312 |
312 |
| 313 if (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) < 0) |
313 if (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) < 0) |
| 314 { |
314 { |
| 315 purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP public IP request! (%s)\n", strerror(errno)); |
315 purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP public IP request! (%s)\n", g_strerror(errno)); |
| 316 g_free(gateway); |
316 g_free(gateway); |
| 317 pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER; |
317 pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER; |
| 318 return NULL; |
318 return NULL; |
| 319 } |
319 } |
| 320 |
320 |
| 321 if (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) < 0) |
321 if (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) < 0) |
| 322 { |
322 { |
| 323 purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", strerror(errno)); |
323 purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", g_strerror(errno)); |
| 324 g_free(gateway); |
324 g_free(gateway); |
| 325 pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER; |
325 pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER; |
| 326 return NULL; |
326 return NULL; |
| 327 } |
327 } |
| 328 |
328 |
| 330 len = sizeof(struct sockaddr_in); |
330 len = sizeof(struct sockaddr_in); |
| 331 if (recvfrom(sendfd, &resp, sizeof(PurplePmpIpResponse), 0, (struct sockaddr *)(&addr), &len) < 0) |
331 if (recvfrom(sendfd, &resp, sizeof(PurplePmpIpResponse), 0, (struct sockaddr *)(&addr), &len) < 0) |
| 332 { |
332 { |
| 333 if (errno != EAGAIN) |
333 if (errno != EAGAIN) |
| 334 { |
334 { |
| 335 purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", strerror(errno)); |
335 purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", g_strerror(errno)); |
| 336 g_free(gateway); |
336 g_free(gateway); |
| 337 pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER; |
337 pmp_info.status = PURPLE_PMP_STATUS_UNABLE_TO_DISCOVER; |
| 338 return NULL; |
338 return NULL; |
| 339 } |
339 } |
| 340 } |
340 } |
| 430 #endif |
430 #endif |
| 431 |
431 |
| 432 /* TODO: Non-blocking! */ |
432 /* TODO: Non-blocking! */ |
| 433 success = (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) >= 0); |
433 success = (sendto(sendfd, &req, sizeof(req), 0, (struct sockaddr *)(gateway), sizeof(struct sockaddr)) >= 0); |
| 434 if (!success) |
434 if (!success) |
| 435 purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP mapping request! (%s)\n", strerror(errno)); |
435 purple_debug_info("nat-pmp", "There was an error sending the NAT-PMP mapping request! (%s)\n", g_strerror(errno)); |
| 436 |
436 |
| 437 if (success) |
437 if (success) |
| 438 { |
438 { |
| 439 success = (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) >= 0); |
439 success = (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) >= 0); |
| 440 if (!success) |
440 if (!success) |
| 441 purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", strerror(errno)); |
441 purple_debug_info("nat-pmp", "There was an error setting the socket's options! (%s)\n", g_strerror(errno)); |
| 442 } |
442 } |
| 443 |
443 |
| 444 if (success) |
444 if (success) |
| 445 { |
445 { |
| 446 /* The original code treats EAGAIN as a reason to iterate.. but I've removed iteration. This may be a problem */ |
446 /* The original code treats EAGAIN as a reason to iterate.. but I've removed iteration. This may be a problem */ |
| 447 /* TODO: Non-blocking! */ |
447 /* TODO: Non-blocking! */ |
| 448 success = ((recvfrom(sendfd, resp, sizeof(PurplePmpMapResponse), 0, NULL, NULL) >= 0) || |
448 success = ((recvfrom(sendfd, resp, sizeof(PurplePmpMapResponse), 0, NULL, NULL) >= 0) || |
| 449 (errno == EAGAIN)); |
449 (errno == EAGAIN)); |
| 450 if (!success) |
450 if (!success) |
| 451 purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", strerror(errno)); |
451 purple_debug_info("nat-pmp", "There was an error receiving the response from the NAT-PMP device! (%s)\n", g_strerror(errno)); |
| 452 } |
452 } |
| 453 |
453 |
| 454 if (success) |
454 if (success) |
| 455 { |
455 { |
| 456 success = (resp->opcode == (req.opcode + 128)); |
456 success = (resp->opcode == (req.opcode + 128)); |