int msn_sb_write( struct msn_switchboard *sb, const char *fmt, ... ) { va_list params; char *out; size_t len; int st; va_start( params, fmt ); out = g_strdup_vprintf( fmt, params ); va_end( params ); if( getenv( "BITLBEE_DEBUG" ) ) fprintf( stderr, "->SB%d:%s\n", sb->fd, out ); len = strlen( out ); st = write( sb->fd, out, len ); g_free( out ); if( st != len ) { msn_sb_destroy( sb ); return 0; } return 1; }
static void msn_add_deny( struct im_connection *ic, char *who ) { struct msn_switchboard *sb; msn_buddy_list_add( ic, MSN_BUDDY_BL, who, who, NULL ); /* If there's still a conversation with this person, close it. */ if( ( sb = msn_sb_by_handle( ic, who ) ) ) { msn_sb_destroy( sb ); } }
static void msn_logout( struct im_connection *ic ) { struct msn_data *md = ic->proto_data; GSList *l; int i; if( md ) { /** Disabling MSN ft support for now. while( md->filetransfers ) { imcb_file_canceled( md->filetransfers->data, "Closing connection" ); } */ msn_ns_close( md->ns ); while( md->switchboards ) msn_sb_destroy( md->switchboards->data ); msn_msgq_purge( ic, &md->msgq ); msn_soapq_flush( ic, FALSE ); for( i = 0; i < sizeof( md->tokens ) / sizeof( md->tokens[0] ); i ++ ) g_free( md->tokens[i] ); g_free( md->lock_key ); g_free( md->pp_policy ); g_free( md->uuid ); while( md->groups ) { struct msn_group *mg = md->groups->data; g_free( mg->id ); g_free( mg->name ); g_free( mg ); md->groups = g_slist_remove( md->groups, mg ); } g_free( md->profile_rid ); if( md->domaintree ) g_tree_destroy( md->domaintree ); md->domaintree = NULL; while( md->grpq ) { struct msn_groupadd *ga = md->grpq->data; g_free( ga->group ); g_free( ga->who ); g_free( ga ); md->grpq = g_slist_remove( md->grpq, ga ); } g_free( md ); } for( l = ic->permit; l; l = l->next ) g_free( l->data ); g_slist_free( ic->permit ); for( l = ic->deny; l; l = l->next ) g_free( l->data ); g_slist_free( ic->deny ); msn_connections = g_slist_remove( msn_connections, ic ); }