mirror of
https://github.com/weechat/weechat.git
synced 2026-06-26 04:46:37 +02:00
core: restore signal "signal_sighup", and if eaten do not reload configuration
This commit is contained in:
@@ -5197,6 +5197,7 @@ void
|
||||
command_reload_files ()
|
||||
{
|
||||
struct t_config_file *ptr_config_file;
|
||||
|
||||
for (ptr_config_file = config_files; ptr_config_file;
|
||||
ptr_config_file = ptr_config_file->next_config)
|
||||
{
|
||||
@@ -5204,7 +5205,6 @@ command_reload_files ()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Callback for command "/reload": reloads a configuration file.
|
||||
*/
|
||||
|
||||
@@ -464,6 +464,28 @@ util_signal_search (const char *name)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gets a signal name with a signal number; only some commonly used signal
|
||||
* names are supported here (see declaration of util_signals[]).
|
||||
*
|
||||
* Returns the pointer to the signal name, NULL if not found.
|
||||
*/
|
||||
|
||||
const char *
|
||||
util_signal_search_number (int signal_number)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; util_signals[i].name; i++)
|
||||
{
|
||||
if (util_signals[i].signal == signal_number)
|
||||
return util_signals[i].name;
|
||||
}
|
||||
|
||||
/* signal not found */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Catches a system signal.
|
||||
*/
|
||||
|
||||
@@ -59,6 +59,7 @@ extern long util_parse_delay (const char *string_delay, long default_factor);
|
||||
|
||||
/* signal */
|
||||
extern int util_signal_search (const char *name);
|
||||
extern const char *util_signal_search_number (int signal_number);
|
||||
extern void util_catch_signal (int signum, void (*handler)(int));
|
||||
|
||||
/* files/directories */
|
||||
|
||||
+1
-1
@@ -688,7 +688,7 @@ weechat_locale_check ()
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback for system signal SIGHUP: reloads config.
|
||||
* Callback for system signal SIGHUP: reloads configuration.
|
||||
*/
|
||||
|
||||
void
|
||||
|
||||
@@ -264,6 +264,30 @@ gui_main_init ()
|
||||
gui_window_set_bracketed_paste_mode (CONFIG_BOOLEAN(config_look_paste_bracketed));
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns signal name with a signal number.
|
||||
*
|
||||
* Note: result must be freed after use.
|
||||
*/
|
||||
|
||||
char *
|
||||
gui_main_get_signal_name (int signal_number)
|
||||
{
|
||||
const char *signal_name;
|
||||
char str_signal[32];
|
||||
|
||||
signal_name = util_signal_search_number (signal_number);
|
||||
if (!signal_name)
|
||||
return NULL;
|
||||
|
||||
snprintf (str_signal, sizeof (str_signal),
|
||||
"SIG%s",
|
||||
signal_name);
|
||||
string_toupper (str_signal);
|
||||
|
||||
return strdup (str_signal);
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback for system signal SIGWINCH: refreshes screen.
|
||||
*/
|
||||
@@ -274,6 +298,55 @@ gui_main_signal_sigwinch ()
|
||||
gui_signal_sigwinch_received = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sends a WeeChat signal on a system signal received.
|
||||
*
|
||||
* Returns:
|
||||
* WEECHAT_RC_OK: the WeeChat handler must be executed
|
||||
* WEECHAT_RC_OK_EAT: signal eaten, the WeeChat handler must NOT be executed
|
||||
*/
|
||||
|
||||
int
|
||||
gui_main_handle_signal (const char *signal_name)
|
||||
{
|
||||
int rc;
|
||||
char str_signal[32];
|
||||
|
||||
if (!signal_name)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
snprintf (str_signal, sizeof (str_signal), "signal_%s", signal_name);
|
||||
string_tolower (str_signal);
|
||||
|
||||
rc = hook_signal_send (str_signal, WEECHAT_HOOK_SIGNAL_STRING, NULL);
|
||||
|
||||
return (rc == WEECHAT_RC_OK_EAT) ? WEECHAT_RC_OK_EAT : WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback for signals received that will make WeeChat reload configuration.
|
||||
*/
|
||||
|
||||
void
|
||||
gui_main_handle_reload_signal ()
|
||||
{
|
||||
char *signal_name;
|
||||
|
||||
signal_name = gui_main_get_signal_name (weechat_reload_signal);
|
||||
|
||||
if (gui_main_handle_signal (signal_name) != WEECHAT_RC_OK_EAT)
|
||||
{
|
||||
log_printf ("Signal %s received, reloading WeeChat configuration...",
|
||||
signal_name);
|
||||
command_reload_files ();
|
||||
}
|
||||
|
||||
if (signal_name)
|
||||
free (signal_name);
|
||||
|
||||
weechat_reload_signal = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback for signals received that will make WeeChat quit.
|
||||
*/
|
||||
@@ -281,56 +354,26 @@ gui_main_signal_sigwinch ()
|
||||
void
|
||||
gui_main_handle_quit_signals ()
|
||||
{
|
||||
char str_signal[32], str_weechat_signal[64];
|
||||
int rc;
|
||||
char *signal_name;
|
||||
|
||||
switch (weechat_quit_signal)
|
||||
{
|
||||
case SIGHUP:
|
||||
snprintf (str_signal, sizeof (str_signal), "SIGHUP");
|
||||
break;
|
||||
case SIGQUIT:
|
||||
snprintf (str_signal, sizeof (str_signal), "SIGQUIT");
|
||||
break;
|
||||
case SIGTERM:
|
||||
snprintf (str_signal, sizeof (str_signal), "SIGTERM");
|
||||
break;
|
||||
default:
|
||||
str_signal[0] = '\0';
|
||||
break;
|
||||
}
|
||||
signal_name = gui_main_get_signal_name (weechat_quit_signal);
|
||||
|
||||
if (str_signal[0])
|
||||
if (gui_main_handle_signal (signal_name) != WEECHAT_RC_OK_EAT)
|
||||
{
|
||||
snprintf (str_weechat_signal, sizeof (str_weechat_signal),
|
||||
"signal_%s", str_signal);
|
||||
string_tolower (str_weechat_signal);
|
||||
rc = hook_signal_send (str_weechat_signal,
|
||||
WEECHAT_HOOK_SIGNAL_STRING, NULL);
|
||||
if ((rc != WEECHAT_RC_OK_EAT) && !weechat_quit)
|
||||
if (!weechat_quit)
|
||||
{
|
||||
log_printf (_("Signal %s received, exiting WeeChat..."),
|
||||
str_signal);
|
||||
signal_name);
|
||||
(void) hook_signal_send ("quit", WEECHAT_HOOK_SIGNAL_STRING, NULL);
|
||||
weechat_quit = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (signal_name)
|
||||
free (signal_name);
|
||||
|
||||
weechat_quit_signal = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback for signals received that will make WeeChat reload.
|
||||
*/
|
||||
|
||||
void
|
||||
gui_main_handle_reload_signal ()
|
||||
{
|
||||
log_printf ("Signal SIGHUP received, reloading WeeChat configuration...");
|
||||
command_reload_files ();
|
||||
weechat_reload_signal = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Displays infos about ncurses lib.
|
||||
*/
|
||||
@@ -523,11 +566,10 @@ gui_main_loop ()
|
||||
hook_process_exec ();
|
||||
|
||||
/* handle signals received */
|
||||
if (weechat_reload_signal > 0)
|
||||
gui_main_handle_reload_signal ();
|
||||
if (weechat_quit_signal > 0)
|
||||
gui_main_handle_quit_signals ();
|
||||
|
||||
if (weechat_reload_signal > 0)
|
||||
gui_main_handle_reload_signal ();
|
||||
}
|
||||
|
||||
/* remove keyboard hook */
|
||||
|
||||
@@ -259,6 +259,25 @@ TEST(CoreUtil, SignalSearch)
|
||||
LONGS_EQUAL(SIGUSR2, util_signal_search ("USR2"));
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests functions:
|
||||
* util_signal_search_number
|
||||
*/
|
||||
|
||||
TEST(CoreUtil, SignalSearchNumber)
|
||||
{
|
||||
POINTERS_EQUAL(NULL, util_signal_search_number (-1));
|
||||
POINTERS_EQUAL(NULL, util_signal_search_number (999999999));
|
||||
|
||||
STRCMP_EQUAL("hup", util_signal_search_number (SIGHUP));
|
||||
STRCMP_EQUAL("int", util_signal_search_number (SIGINT));
|
||||
STRCMP_EQUAL("quit", util_signal_search_number (SIGQUIT));
|
||||
STRCMP_EQUAL("kill", util_signal_search_number (SIGKILL));
|
||||
STRCMP_EQUAL("term", util_signal_search_number (SIGTERM));
|
||||
STRCMP_EQUAL("usr1", util_signal_search_number (SIGUSR1));
|
||||
STRCMP_EQUAL("usr2", util_signal_search_number (SIGUSR2));
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests functions:
|
||||
* util_catch_signal
|
||||
|
||||
Reference in New Issue
Block a user