# HG changeset patch # User Sulabh Mahajan # Date 1219264377 0 # Node ID 0e1fba363b01b69ad5fa8bff6d7944f6b2ce1c59 # Parent c031f88aa026c22090475afb5bb4c4d6c8b25d05 Implement keep alives for p2p connections, remove bug causing hundreds of initialization packets diff -r c031f88aa026 -r 0e1fba363b01 libpurple/protocols/yahoo/yahoo.c --- a/libpurple/protocols/yahoo/yahoo.c Tue Jul 22 18:57:02 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Wed Aug 20 20:32:57 2008 +0000 @@ -2330,6 +2330,51 @@ g_free(decoded_group); } +/* write pkt to the source */ +static void yahoo_p2p_write_pkt(gint source, struct yahoo_packet *pkt) +{ + size_t pkt_len; + guchar *raw_packet; + + /*build the raw packet and send it to the host*/ + pkt_len = yahoo_packet_build(pkt, 0, 0, 0, &raw_packet); + if(write(source, raw_packet, pkt_len) != pkt_len) + purple_debug_warning("yahoo","p2p: couldn't write to the source\n"); + g_free(raw_packet); +} + +static void yahoo_p2p_keepalive_cb(gpointer key, gpointer value, gpointer user_data) +{ + struct yahoo_p2p_data *p2p_data = value; + PurpleConnection *gc = user_data; + struct yahoo_packet *pkt_to_send; + PurpleAccount *account; + struct yahoo_data *yd = gc->proto_data; + + account = purple_connection_get_account(gc); + + pkt_to_send = yahoo_packet_new(YAHOO_SERVICE_P2PFILEXFER, YAHOO_STATUS_AVAILABLE, yd->session_id); + yahoo_packet_hash(pkt_to_send, "ssisi", + 4, purple_normalize(account, purple_account_get_username(account)), + 5, p2p_data->host_username, + 241, 0, /* Protocol identifier */ + 49, "PEERTOPEER", + 13, 7); + yahoo_p2p_write_pkt(p2p_data->source, pkt_to_send); + + yahoo_packet_free(pkt_to_send); +} + +static gboolean yahoo_p2p_keepalive(gpointer data) +{ + PurpleConnection *gc = data; + struct yahoo_data *yd = gc->proto_data; + + g_hash_table_foreach(yd->peers, yahoo_p2p_keepalive_cb, gc); + + return TRUE; +} + /* destroy p2p_data associated with a peer and close p2p connection. * g_hash_table_remove() calls this function to destroy p2p_data associated with the peer, * call g_hash_table_remove() instead of this fucntion if peer has an entry in the table */ @@ -2354,19 +2399,6 @@ g_free(p2p_data); } -/* write pkt to the source */ -static void yahoo_p2p_write_pkt(gint source, struct yahoo_packet *pkt) -{ - size_t pkt_len; - guchar *raw_packet; - - /*build the raw packet and send it to the host*/ - pkt_len = yahoo_packet_build(pkt, 0, 0, 0, &raw_packet); - if(write(source, raw_packet, pkt_len) != pkt_len) - purple_debug_warning("yahoo","p2p: couldn't write to the source\n"); - g_free(raw_packet); -} - /* exchange of initial p2pfilexfer packets, service type YAHOO_SERVICE_P2PFILEXFER */ static void yahoo_p2p_process_p2pfilexfer(gpointer data, gint source, struct yahoo_packet *pkt) { @@ -2417,7 +2449,9 @@ case 1 : val_13_to_send = 5; break; case 5 : val_13_to_send = 6; break; case 6 : val_13_to_send = 7; break; - case 7 : val_13_to_send = 7; break; + case 7 : if( g_hash_table_lookup(yd->peers, p2p_data->host_username) ) + return; + val_13_to_send = 7; break; default: purple_debug_warning("yahoo","p2p:Unknown value for key 13\n"); return; } @@ -3506,6 +3540,7 @@ yd->xfer_peer_idstring_map = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); yd->peers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, yahoo_p2p_disconnect_destroy_data); yd->sms_carrier = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + yd->yahoo_p2p_timer = purple_timeout_add_seconds(YAHOO_P2P_KEEPALIVE_SECS, yahoo_p2p_keepalive, gc); yd->confs = NULL; yd->conf_id = 2; diff -r c031f88aa026 -r 0e1fba363b01 libpurple/protocols/yahoo/yahoo.h --- a/libpurple/protocols/yahoo/yahoo.h Tue Jul 22 18:57:02 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.h Wed Aug 20 20:32:57 2008 +0000 @@ -31,6 +31,7 @@ #define YAHOO_PAGER_HOST "scs.msg.yahoo.com" #define YAHOO_PAGER_PORT 5050 #define YAHOO_PAGER_PORT_P2P 5101 +#define YAHOO_P2P_KEEPALIVE_SECS 300 #define YAHOO_PROFILE_URL "http://profiles.yahoo.com/" #define YAHOO_MAIL_URL "https://login.yahoo.com/config/login?.src=ym" #define YAHOO_XFER_HOST "filetransfer.msg.yahoo.com" @@ -200,6 +201,7 @@ */ char *current_list15_grp; GHashTable *peers; /* information about p2p data */ + int yahoo_p2p_timer; int yahoo_local_p2p_server_fd; int yahoo_p2p_server_watcher; GHashTable *sms_carrier; /* sms carrier data */