1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-01 15:26: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
+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 */