Mercurial > pidgin
changeset 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 | 48e15c705add |
children | ff8a91b1f795 |
files | libpurple/protocols/simple/simple.c |
diffstat | 1 files changed, 19 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/simple/simple.c Mon Apr 12 07:10:48 2010 +0000 +++ b/libpurple/protocols/simple/simple.c Mon Apr 12 07:13:52 2010 +0000 @@ -1663,7 +1663,7 @@ struct simple_account_data *sip = gc->proto_data; struct sipmsg *msg; int len; - time_t currtime; + time_t currtime = time(NULL); static char buffer[65536]; if((len = recv(source, buffer, sizeof(buffer) - 1, 0)) > 0) { @@ -1777,10 +1777,14 @@ return; } + /* + * TODO: Is it correct to set sip->fd to the listenfd? For the TCP + * listener we set sip->listenfd, but maybe UDP is different? + * Maybe we use the same fd for outgoing data or something? + */ sip->fd = listenfd; sip->listenport = purple_network_get_port_from_fd(sip->fd); - sip->listenfd = sip->fd; sip->listenpa = purple_input_add(sip->fd, PURPLE_INPUT_READ, simple_udp_process, sip->gc); @@ -1982,6 +1986,14 @@ } connection_free_all(sip); + if (sip->listenpa) + purple_input_remove(sip->listenpa); + if (sip->tx_handler) + purple_input_remove(sip->tx_handler); + if (sip->resendtimeout) + purple_timeout_remove(sip->resendtimeout); + if (sip->registertimeout) + purple_timeout_remove(sip->registertimeout); if (sip->query_data != NULL) purple_dnsquery_destroy(sip->query_data); @@ -1991,6 +2003,11 @@ if (sip->listen_data != NULL) purple_network_listen_cancel(sip->listen_data); + if (sip->fd >= 0) + close(sip->fd); + if (sip->listenfd >= 0) + close(sip->listenfd); + g_free(sip->servername); g_free(sip->username); g_free(sip->password); @@ -2008,14 +2025,6 @@ if (sip->txbuf) purple_circ_buffer_destroy(sip->txbuf); g_free(sip->realhostname); - if (sip->listenpa) - purple_input_remove(sip->listenpa); - if (sip->tx_handler) - purple_input_remove(sip->tx_handler); - if (sip->resendtimeout) - purple_timeout_remove(sip->resendtimeout); - if (sip->registertimeout) - purple_timeout_remove(sip->registertimeout); g_free(sip); gc->proto_data = NULL;