aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--protocols/jabber/jabber.c2
-rw-r--r--protocols/jabber/jabber.h1
-rw-r--r--protocols/jabber/jabber_util.c26
-rw-r--r--protocols/twitter/twitter.c2
-rw-r--r--storage_xml.c6
5 files changed, 34 insertions, 3 deletions
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c
index 75bc44d3..cf491f81 100644
--- a/protocols/jabber/jabber.c
+++ b/protocols/jabber/jabber.c
@@ -299,6 +299,8 @@ static void jabber_logout( struct im_connection *ic )
if( jd->node_cache )
g_hash_table_destroy( jd->node_cache );
+ jabber_buddy_remove_all( ic );
+
xt_free( jd->xt );
g_free( jd->away_message );
diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h
index 5be7978b..b3638597 100644
--- a/protocols/jabber/jabber.h
+++ b/protocols/jabber/jabber.h
@@ -291,6 +291,7 @@ struct jabber_buddy *jabber_buddy_by_jid( struct im_connection *ic, char *jid, g
struct jabber_buddy *jabber_buddy_by_ext_jid( struct im_connection *ic, char *jid, get_buddy_flags_t flags );
int jabber_buddy_remove( struct im_connection *ic, char *full_jid );
int jabber_buddy_remove_bare( struct im_connection *ic, char *bare_jid );
+void jabber_buddy_remove_all( struct im_connection *ic );
time_t jabber_get_timestamp( struct xt_node *xt );
struct jabber_error *jabber_error_parse( struct xt_node *node, char *xmlns );
void jabber_error_free( struct jabber_error *err );
diff --git a/protocols/jabber/jabber_util.c b/protocols/jabber/jabber_util.c
index 608cb52a..ab3e6c38 100644
--- a/protocols/jabber/jabber_util.c
+++ b/protocols/jabber/jabber_util.c
@@ -668,6 +668,32 @@ int jabber_buddy_remove_bare( struct im_connection *ic, char *bare_jid )
}
}
+static gboolean jabber_buddy_remove_all_cb( gpointer key, gpointer value, gpointer data )
+{
+ struct jabber_buddy *bud, *next;
+
+ bud = value;
+ while( bud )
+ {
+ next = bud->next;
+ g_free( bud->ext_jid );
+ g_free( bud->full_jid );
+ g_free( bud->away_message );
+ g_free( bud );
+ bud = next;
+ }
+
+ return TRUE;
+}
+
+void jabber_buddy_remove_all( struct im_connection *ic )
+{
+ struct jabber_data *jd = ic->proto_data;
+
+ g_hash_table_foreach_remove( jd->buddies, jabber_buddy_remove_all_cb, NULL );
+ g_hash_table_destroy( jd->buddies );
+}
+
time_t jabber_get_timestamp( struct xt_node *xt )
{
struct xt_node *c;
diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c
index a5fc68ab..db893e17 100644
--- a/protocols/twitter/twitter.c
+++ b/protocols/twitter/twitter.c
@@ -235,6 +235,8 @@ static void twitter_logout( struct im_connection *ic )
if( td )
{
oauth_info_free( td->oauth_info );
+ g_free( td->url_host );
+ g_free( td->url_path );
g_free( td->pass );
g_free( td );
}
diff --git a/storage_xml.c b/storage_xml.c
index a0e2fd25..3ce85713 100644
--- a/storage_xml.c
+++ b/storage_xml.c
@@ -403,8 +403,8 @@ static storage_status_t xml_save( irc_t *irc, int overwrite )
if( !overwrite && g_access( path, F_OK ) == 0 )
return STORAGE_ALREADY_EXISTS;
- strcat( path, "~" );
- if( ( fd = open( path, O_WRONLY | O_CREAT | O_TRUNC, 0600 ) ) < 0 )
+ strcat( path, ".XXXXXX" );
+ if( ( fd = mkstemp( path ) ) < 0 )
{
irc_usermsg( irc, "Error while opening configuration file." );
return STORAGE_OTHER_ERROR;
@@ -500,7 +500,7 @@ static storage_status_t xml_save( irc_t *irc, int overwrite )
fsync( fd );
close( fd );
- path2 = g_strndup( path, strlen( path ) - 1 );
+ path2 = g_strndup( path, strlen( path ) - 7 );
if( rename( path, path2 ) != 0 )
{
irc_usermsg( irc, "Error while renaming temporary configuration file." );