Mercurial > pidgin
comparison libpurple/protocols/simple/simple.c @ 29713:0fb628a28e5c
Two SIMPLE changes:
* Close the listener socket when disconnected. Otherwise we leak the socket
and eventually run out of sockets to listen on, because we listen on a range
of 100 sockets
* Initialize the time_t before calling ctime
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 12 Apr 2010 07:13:52 +0000 |
parents | ae2b1f9bde75 |
children | ff8a91b1f795 |
comparison
equal
deleted
inserted
replaced
29712:48e15c705add | 29713:0fb628a28e5c |
---|---|
1661 static void simple_udp_process(gpointer data, gint source, PurpleInputCondition con) { | 1661 static void simple_udp_process(gpointer data, gint source, PurpleInputCondition con) { |
1662 PurpleConnection *gc = data; | 1662 PurpleConnection *gc = data; |
1663 struct simple_account_data *sip = gc->proto_data; | 1663 struct simple_account_data *sip = gc->proto_data; |
1664 struct sipmsg *msg; | 1664 struct sipmsg *msg; |
1665 int len; | 1665 int len; |
1666 time_t currtime; | 1666 time_t currtime = time(NULL); |
1667 | 1667 |
1668 static char buffer[65536]; | 1668 static char buffer[65536]; |
1669 if((len = recv(source, buffer, sizeof(buffer) - 1, 0)) > 0) { | 1669 if((len = recv(source, buffer, sizeof(buffer) - 1, 0)) > 0) { |
1670 buffer[len] = '\0'; | 1670 buffer[len] = '\0'; |
1671 purple_debug_info("simple", "\n\nreceived - %s\n######\n%s\n#######\n\n", ctime(&currtime), buffer); | 1671 purple_debug_info("simple", "\n\nreceived - %s\n######\n%s\n#######\n\n", ctime(&currtime), buffer); |
1775 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 1775 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
1776 _("Unable to create listen socket")); | 1776 _("Unable to create listen socket")); |
1777 return; | 1777 return; |
1778 } | 1778 } |
1779 | 1779 |
1780 /* | |
1781 * TODO: Is it correct to set sip->fd to the listenfd? For the TCP | |
1782 * listener we set sip->listenfd, but maybe UDP is different? | |
1783 * Maybe we use the same fd for outgoing data or something? | |
1784 */ | |
1780 sip->fd = listenfd; | 1785 sip->fd = listenfd; |
1781 | 1786 |
1782 sip->listenport = purple_network_get_port_from_fd(sip->fd); | 1787 sip->listenport = purple_network_get_port_from_fd(sip->fd); |
1783 sip->listenfd = sip->fd; | |
1784 | 1788 |
1785 sip->listenpa = purple_input_add(sip->fd, PURPLE_INPUT_READ, simple_udp_process, sip->gc); | 1789 sip->listenpa = purple_input_add(sip->fd, PURPLE_INPUT_READ, simple_udp_process, sip->gc); |
1786 | 1790 |
1787 sip->resendtimeout = purple_timeout_add(2500, (GSourceFunc) resend_timeout, sip); | 1791 sip->resendtimeout = purple_timeout_add(2500, (GSourceFunc) resend_timeout, sip); |
1788 sip->registertimeout = purple_timeout_add((rand()%100)+10*1000, (GSourceFunc)subscribe_timeout, sip); | 1792 sip->registertimeout = purple_timeout_add((rand()%100)+10*1000, (GSourceFunc)subscribe_timeout, sip); |
1980 | 1984 |
1981 do_register_exp(sip, 0); | 1985 do_register_exp(sip, 0); |
1982 } | 1986 } |
1983 connection_free_all(sip); | 1987 connection_free_all(sip); |
1984 | 1988 |
1989 if (sip->listenpa) | |
1990 purple_input_remove(sip->listenpa); | |
1991 if (sip->tx_handler) | |
1992 purple_input_remove(sip->tx_handler); | |
1993 if (sip->resendtimeout) | |
1994 purple_timeout_remove(sip->resendtimeout); | |
1995 if (sip->registertimeout) | |
1996 purple_timeout_remove(sip->registertimeout); | |
1985 if (sip->query_data != NULL) | 1997 if (sip->query_data != NULL) |
1986 purple_dnsquery_destroy(sip->query_data); | 1998 purple_dnsquery_destroy(sip->query_data); |
1987 | 1999 |
1988 if (sip->srv_query_data != NULL) | 2000 if (sip->srv_query_data != NULL) |
1989 purple_srv_cancel(sip->srv_query_data); | 2001 purple_srv_cancel(sip->srv_query_data); |
1990 | 2002 |
1991 if (sip->listen_data != NULL) | 2003 if (sip->listen_data != NULL) |
1992 purple_network_listen_cancel(sip->listen_data); | 2004 purple_network_listen_cancel(sip->listen_data); |
2005 | |
2006 if (sip->fd >= 0) | |
2007 close(sip->fd); | |
2008 if (sip->listenfd >= 0) | |
2009 close(sip->listenfd); | |
1993 | 2010 |
1994 g_free(sip->servername); | 2011 g_free(sip->servername); |
1995 g_free(sip->username); | 2012 g_free(sip->username); |
1996 g_free(sip->password); | 2013 g_free(sip->password); |
1997 g_free(sip->registrar.nonce); | 2014 g_free(sip->registrar.nonce); |
2006 g_free(sip->proxy.digest_session_key); | 2023 g_free(sip->proxy.digest_session_key); |
2007 g_free(sip->publish_etag); | 2024 g_free(sip->publish_etag); |
2008 if (sip->txbuf) | 2025 if (sip->txbuf) |
2009 purple_circ_buffer_destroy(sip->txbuf); | 2026 purple_circ_buffer_destroy(sip->txbuf); |
2010 g_free(sip->realhostname); | 2027 g_free(sip->realhostname); |
2011 if (sip->listenpa) | |
2012 purple_input_remove(sip->listenpa); | |
2013 if (sip->tx_handler) | |
2014 purple_input_remove(sip->tx_handler); | |
2015 if (sip->resendtimeout) | |
2016 purple_timeout_remove(sip->resendtimeout); | |
2017 if (sip->registertimeout) | |
2018 purple_timeout_remove(sip->registertimeout); | |
2019 | 2028 |
2020 g_free(sip); | 2029 g_free(sip); |
2021 gc->proto_data = NULL; | 2030 gc->proto_data = NULL; |
2022 } | 2031 } |
2023 | 2032 |