diff options
Diffstat (limited to 'src/daemon/purple.c')
-rw-r--r-- | src/daemon/purple.c | 61 |
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); } /* |