comparison libpurple/upnp.c @ 32192:f71b6a715cc7

Fix some closes on invalid fds, which can crash on Windows. committer: Ethan Blanton <elb@pidgin.im>
author Florian Quèze <florian@instantbird.org>
date Sun, 10 Jul 2011 13:11:36 +0000
parents b39b6d0008c5
children 06c38384f43d
comparison
equal deleted inserted replaced
32191:c44f896d2676 32192:f71b6a715cc7
533 if (dd->retry_count < NUM_UDP_ATTEMPTS) { 533 if (dd->retry_count < NUM_UDP_ATTEMPTS) {
534 /* TODO: We probably shouldn't be incrementing retry_count in two places */ 534 /* TODO: We probably shouldn't be incrementing retry_count in two places */
535 dd->retry_count++; 535 dd->retry_count++;
536 purple_upnp_discover_send_broadcast(dd); 536 purple_upnp_discover_send_broadcast(dd);
537 } else { 537 } else {
538 if (dd->fd) 538 if (dd->fd != -1)
539 close(dd->fd); 539 close(dd->fd);
540 540
541 control_info.status = PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER; 541 control_info.status = PURPLE_UPNP_STATUS_UNABLE_TO_DISCOVER;
542 control_info.lookup_time = time(NULL); 542 control_info.lookup_time = time(NULL);
543 control_info.service_type[0] = '\0'; 543 control_info.service_type[0] = '\0';
660 discovery_callbacks = g_slist_append(discovery_callbacks, 660 discovery_callbacks = g_slist_append(discovery_callbacks,
661 cb_data); 661 cb_data);
662 } 662 }
663 663
664 /* Set up the sockets */ 664 /* Set up the sockets */
665 sock = socket(AF_INET, SOCK_DGRAM, 0); 665 dd->fd = sock = socket(AF_INET, SOCK_DGRAM, 0);
666 if(sock == -1) { 666 if(sock == -1) {
667 purple_debug_error("upnp", 667 purple_debug_error("upnp",
668 "purple_upnp_discover(): Failed In sock creation\n"); 668 "purple_upnp_discover(): Failed In sock creation\n");
669 /* Short circuit the retry attempts */ 669 /* Short circuit the retry attempts */
670 dd->retry_count = NUM_UDP_ATTEMPTS; 670 dd->retry_count = NUM_UDP_ATTEMPTS;
671 dd->tima = purple_timeout_add(10, purple_upnp_discover_timeout, dd); 671 dd->tima = purple_timeout_add(10, purple_upnp_discover_timeout, dd);
672 return; 672 return;
673 } 673 }
674
675 dd->fd = sock;
676 674
677 /* TODO: Non-blocking! */ 675 /* TODO: Non-blocking! */
678 if((hp = gethostbyname(HTTPMU_HOST_ADDRESS)) == NULL) { 676 if((hp = gethostbyname(HTTPMU_HOST_ADDRESS)) == NULL) {
679 purple_debug_error("upnp", 677 purple_debug_error("upnp",
680 "purple_upnp_discover(): Failed In gethostbyname\n"); 678 "purple_upnp_discover(): Failed In gethostbyname\n");
818 } 816 }
819 817
820 static void 818 static void
821 looked_up_internal_ip_cb(gpointer data, gint source, const gchar *error_message) 819 looked_up_internal_ip_cb(gpointer data, gint source, const gchar *error_message)
822 { 820 {
823 if (source) { 821 if (source != -1) {
824 strncpy(control_info.internalip, 822 strncpy(control_info.internalip,
825 purple_network_get_local_system_ip(source), 823 purple_network_get_local_system_ip(source),
826 sizeof(control_info.internalip)); 824 sizeof(control_info.internalip));
827 purple_debug_info("upnp", "Local IP: %s\n", 825 purple_debug_info("upnp", "Local IP: %s\n",
828 control_info.internalip); 826 control_info.internalip);