1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2024-12-23 19:39:06 +00:00

corrected signal processing

git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky@366 7f574dfc-610e-0410-a909-a81674777703
This commit is contained in:
Philip Kovacs 2005-11-01 06:51:48 +00:00
parent 26aaefdb9d
commit 84e871402d
3 changed files with 55 additions and 36 deletions

View File

@ -1752,6 +1752,7 @@ int a = stippled_borders, b = 1;
int argc, port_begin, port_end, item, connection_index;
char itembuf[32];
memset(itembuf,0,sizeof(itembuf));
connection_index=0;
/* massive argument checking */
if (!arg) {
CRIT_ERR("tcp_portmon: needs arguments");
@ -4257,16 +4258,42 @@ static void main_loop()
}
#endif /* X11 */
/* inspect pending signal prior to entering next loop */
switch(g_signal_pending) {
case SIGUSR1:
{
ERR("received SIGUSR1. reloading the config file.");
reload_config();
break;
}
case SIGINT:
case SIGTERM:
{
ERR("received SIGINT or SIGTERM to terminate. bye!");
clean_up();
exit(0);
/*break;*/
}
default:
{
/* Reaching here means someone set a signal( SIGXXXX, signal_handler )
* but didn't write any code to deal with it. if you don't want to
* handle a signal, don't set a handler on it in the first place. */
if (g_signal_pending)
ERR("ignoring signal (%d)", g_signal_pending);
break;
}
}
g_signal_pending=0;
}
}
static void load_config_file(const char *);
/* signal handler that reloads config file */
static void reload_handler(int a)
/* reload the config file */
void reload_config(void)
{
ERR("Conky: received signal %d, reloading config\n", a);
if (current_config) {
clear_fs_stats();
load_config_file(current_config);
@ -4287,7 +4314,7 @@ static void reload_handler(int a)
}
}
static void clean_up()
void clean_up(void)
{
#ifdef X11
#ifdef XDBE
@ -4329,13 +4356,6 @@ static void clean_up()
#endif
}
static void term_handler(int a)
{
a = a; /* to get rid of warning */
clean_up();
exit(0);
}
static int string_to_bool(const char *s)
{
if (!s)
@ -4867,6 +4887,7 @@ static const char *getopt_string = "vVdt:f:u:i:hc:w:x:y:a:"
int main(int argc, char **argv)
{
g_signal_pending=0;
memset(&info, 0, sizeof(info) );
/* handle command line parameters that don't change configs */
@ -5137,34 +5158,24 @@ int main(int argc, char **argv)
}
}
/* set SIGUSR1, SIGINT and SIGTERM handlers */
/* Set signal handlers */
if ( signal(SIGINT,signal_handler) == SIG_ERR ||
signal(SIGUSR1,signal_handler) == SIG_ERR ||
signal(SIGTERM,signal_handler) == SIG_ERR )
{
struct
sigaction sa;
sa.sa_handler = reload_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGUSR1, &sa, NULL) != 0)
ERR("can't set signal handler for SIGUSR1: %s",
strerror(errno));
sa.sa_handler = term_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGINT, &sa, NULL) != 0)
ERR("can't set signal handler for SIGINT: %s",
strerror(errno));
sa.sa_handler = term_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGTERM, &sa, NULL) != 0)
ERR("can't set signal handler for SIGTERM: %s",
strerror(errno));
ERR("error setting signal handler: %s", strerror(errno) );
}
main_loop();
free(tmpstring1);
free(tmpstring2);
return 0;
}
void signal_handler(int sig)
{
/* signal handler is light as a feather, as it should be.
* we will poll g_signal_pending with each loop of conky
* and do any signal processing there, NOT here. pkovacs. */
g_signal_pending=sig;
}

View File

@ -155,6 +155,8 @@ enum {
#include "libmpdclient.h"
#endif
volatile int g_signal_pending;
struct information {
unsigned int mask;
@ -279,6 +281,10 @@ long get_x11_color(const char *);
/* struct that has all info */
struct information info;
void signal_handler(int);
void reload_config(void);
void clean_up(void);
void update_uname();
double get_time(void);
FILE *open_file(const char *file, int *reported);

View File

@ -243,6 +243,7 @@ void destroy_tcp_port_monitor(
/* destroy the monitor */
free( p_monitor );
p_monitor=NULL;
}
void age_tcp_port_monitor(
@ -706,6 +707,7 @@ void destroy_tcp_port_monitor_collection(
}
free( p_collection );
p_collection=NULL;
}
/* Updates the tcp statistics for all monitors within a collection */