comparison libpurple/protocols/simple/simple.c @ 30124: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
30123:48e15c705add 30124: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