1
0
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:
Sébastien Helleu
2020-04-21 22:31:12 +02:00
parent de1e61f7cd
commit 100440c8a1
6 changed files with 127 additions and 43 deletions
+1 -1
View File
@@ -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.
*/
+22
View 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.
*/
+1
View File
@@ -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
View File
@@ -688,7 +688,7 @@ weechat_locale_check ()
}
/*
* Callback for system signal SIGHUP: reloads config.
* Callback for system signal SIGHUP: reloads configuration.
*/
void
+83 -41
View File
@@ -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 */
+19
View File
@@ -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