# HG changeset patch # User Mikael Berthe # Date 1298823851 -3600 # Node ID 7eadf86039e6f200c812dac77ae473bc96251a80 # Parent 932d1b250a55806a59d4c1fa04c5a43a75b9db86 Use guard for the fifo system (Myhailo Danylenko) Merge patch from isbear's mcabber-experimental repository. diff -r 932d1b250a55 -r 7eadf86039e6 mcabber/mcabber/fifo.c --- a/mcabber/mcabber/fifo.c Sun Feb 27 16:51:55 2011 +0100 +++ b/mcabber/mcabber/fifo.c Sun Feb 27 17:24:11 2011 +0100 @@ -91,6 +91,7 @@ { GIOChannel *channel = (GIOChannel *)data; g_io_channel_unref(channel); + channel = NULL; } static gboolean check_fifo(const char *name) @@ -140,15 +141,37 @@ return TRUE; } -int fifo_init(const char *fifo_path) +void fifo_deinit(void) +{ + unsetenv(FIFO_ENV_NAME); + + if (fifo_channel) + g_source_remove_by_user_data(fifo_channel); + /* channel itself should be destroyed by destruction callback */ + /* destroy open fifo */ + if (fifo_name) { + /* well, that may create fifo, and then unlink, + * but at least we will not destroy non-fifo data */ + if (check_fifo(fifo_name)) + unlink(fifo_name); + g_free(fifo_name); + fifo_name = NULL; + } +} + +// fifo_init_internal(path) +// If path is NULL, reopen existing fifo, else open anew. +static int fifo_init_internal(const char *fifo_path) { if (fifo_path) { + fifo_deinit(); fifo_name = expand_filename(fifo_path); if (!check_fifo(fifo_name)) { scr_LogPrint(LPRINT_LOGNORM, "WARNING: Cannot create the FIFO. " "%s already exists and is not a pipe", fifo_name); g_free(fifo_name); + fifo_name = NULL; return -1; } } else if (fifo_name) @@ -167,15 +190,26 @@ return 1; } -void fifo_deinit(void) +static gchar *fifo_guard(const gchar *key, const gchar *new_value) { - unsetenv(FIFO_ENV_NAME); + if (new_value) + fifo_init_internal(new_value); + else + fifo_deinit(); + return g_strdup(new_value); +} - /* destroy open fifo */ - unlink(fifo_name); - g_source_remove_by_user_data(fifo_channel); - /* channel itself should be destroyed by destruction callback */ - g_free(fifo_name); +// Returns 1 in case of success, -1 on error +int fifo_init(void) +{ + const char *path = settings_opt_get("fifo_name"); + static gboolean guard_installed = FALSE; + if (!guard_installed) + if (!(guard_installed = settings_set_guard("fifo_name", fifo_guard))) + scr_LogPrint(LPRINT_DEBUG, "fifo: BUG: Cannot install option guard!"); + if (path) + return fifo_init_internal(path); + return 1; } /* vim: set expandtab cindent cinoptions=>2\:2(0 sw=2 ts=2: For Vim users... */ diff -r 932d1b250a55 -r 7eadf86039e6 mcabber/mcabber/fifo.h --- a/mcabber/mcabber/fifo.h Sun Feb 27 16:51:55 2011 +0100 +++ b/mcabber/mcabber/fifo.h Sun Feb 27 17:24:11 2011 +0100 @@ -1,7 +1,7 @@ #ifndef __MCABBER_FIFO_H__ #define __MCABBER_FIFO_H__ 1 -int fifo_init(const char *fifo_path); +int fifo_init(void); void fifo_deinit(void); #endif /* __MCABBER_FIFO_H__ */ diff -r 932d1b250a55 -r 7eadf86039e6 mcabber/mcabber/main.c --- a/mcabber/mcabber/main.c Sun Feb 27 16:51:55 2011 +0100 +++ b/mcabber/mcabber/main.c Sun Feb 27 17:24:11 2011 +0100 @@ -450,7 +450,7 @@ chatstates_disabled = settings_opt_get_int("disable_chatstates"); /* Initialize FIFO named pipe */ - fifo_init(settings_opt_get("fifo_name")); + fifo_init(); /* Load previous roster state */ hlog_load_state();