summaryrefslogtreecommitdiffstats
path: root/src/daemon/purple.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/purple.c')
-rw-r--r--src/daemon/purple.c61
1 files changed, 52 insertions, 9 deletions
diff --git a/src/daemon/purple.c b/src/daemon/purple.c
index 6b73774..882ea61 100644
--- a/src/daemon/purple.c
+++ b/src/daemon/purple.c
@@ -120,6 +120,35 @@ static void pthread_mutex_unlock_thunk(void *arg)
(void) pthread_mutex_unlock(mutex);
}
+static void purple_account_destroy_thunk(void *arg)
+{
+ PurpleAccount *account = arg;
+
+ purple_account_destroy(account);
+}
+
+static void purple_core_destroy(void *arg)
+{
+ (void) arg;
+
+ purple_timeout_add(0, purple_core_quit_cb, NULL);
+}
+
+static void g_main_loop_unref_thunk(void *arg)
+{
+ GMainLoop *loop = arg;
+
+ g_main_loop_unref(loop);
+}
+
+static void g_main_loop_quit_thunk(void *arg)
+{
+ GMainLoop *loop = arg;
+
+ g_main_loop_quit(loop);
+}
+
+
static void *purple_spawn(void *disregard)
{
GMainLoop *loop;
@@ -131,16 +160,21 @@ static void *purple_spawn(void *disregard)
(void) disregard;
pthread_cleanup_push(pthread_mutex_unlock_thunk, &state.mutex);
- pthread_cleanup_push(free, progname);
- pthread_cleanup_push(free, user);
- pthread_cleanup_push(free, password);
- pthread_cleanup_push(free, proto);
progname = setting_progname();
+ pthread_cleanup_push(free, progname);
+
user = setting_im_user();
+ pthread_cleanup_push(free, user);
+
password = setting_im_password();
+ pthread_cleanup_push(free, password);
+
proto = setting_im_proto();
+ pthread_cleanup_push(free, proto);
+
loop = g_main_loop_new(NULL, FALSE);
+ pthread_cleanup_push(g_main_loop_unref_thunk, loop);
/* avoid an unholy army of libpurple's DNS resolver process zombies */
signal(SIGCHLD, SIG_IGN);
@@ -158,22 +192,31 @@ static void *purple_spawn(void *disregard)
purple_core_set_ui_ops(&core_uiops);
purple_eventloop_set_ui_ops(&eventloops);
- purple_core_init(setting_progname());
+ purple_core_init(progname);
purple_prefs_load();
- state.account = purple_account_new(setting_im_user(), setting_im_proto());
- purple_account_set_password(state.account, setting_im_password());
- purple_account_set_enabled(state.account, setting_progname(), TRUE);
+ pthread_cleanup_push(purple_core_destroy, NULL);
+
+ state.account = purple_account_new(user, proto);
+ purple_account_set_password(state.account, password);
+ purple_account_set_enabled(state.account, progname, TRUE);
+
+ pthread_cleanup_push(purple_account_destroy_thunk, state.account);
g_main_loop_run(loop);
+ pthread_cleanup_push(g_main_loop_quit_thunk, loop);
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
+ pthread_cleanup_pop(1);
+ pthread_cleanup_pop(1);
+ pthread_cleanup_pop(1);
+ pthread_cleanup_pop(1);
- return NULL;
+ pthread_exit(NULL);
}
/*