Mercurial > pidgin.yaz
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); |