From 35dc866951d48409e88a1fde5fdb52dfe60f3b18 Mon Sep 17 00:00:00 2001 From: Andreas Fink Date: Fri, 11 Jun 2010 18:47:26 +0000 Subject: [PATCH] *fix* execute an external command by calling fork/execl and do not ignore SIGCHLD (maybe fixes issue 263) --- src/battery/battery.c | 5 +++-- src/clock/clock.c | 16 ++-------------- src/tint.c | 2 +- src/util/common.c | 19 ++++++++++++++++++- src/util/common.h | 4 ++++ 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/battery/battery.c b/src/battery/battery.c index 5480412..4bbde3c 100644 --- a/src/battery/battery.c +++ b/src/battery/battery.c @@ -39,6 +39,7 @@ #include "battery.h" #include "clock.h" #include "timer.h" +#include "common.h" PangoFontDescription *bat1_font_desc; PangoFontDescription *bat2_font_desc; @@ -352,8 +353,8 @@ void update_battery() { new_percentage = (energy_now*100)/energy_full; if(battery_low_status > new_percentage && battery_state.state == BATTERY_DISCHARGING && !battery_low_cmd_send) { - system(battery_low_cmd); // return value == -1, since we've set SIGCHLD to SIGIGN - battery_low_cmd_send = 1; + tint_exec(battery_low_cmd); + battery_low_cmd_send = 1; } if(battery_low_status < new_percentage && battery_state.state == BATTERY_CHARGING && battery_low_cmd_send) { battery_low_cmd_send = 0; diff --git a/src/clock/clock.c b/src/clock/clock.c index 273fb81..6e5032d 100644 --- a/src/clock/clock.c +++ b/src/clock/clock.c @@ -22,8 +22,6 @@ #include #include #include -#include -#include #include #include "window.h" @@ -33,6 +31,7 @@ #include "taskbar.h" #include "clock.h" #include "timer.h" +#include "common.h" char *time1_format; @@ -302,17 +301,6 @@ void clock_action(int button) command = clock_rclick_command; break; } - if (command) { - pid_t pid; - pid = fork(); - if (pid == 0) { - // change for the fork the signal mask -// sigset_t sigset; -// sigprocmask(SIG_SETMASK, &sigset, 0); -// sigprocmask(SIG_UNBLOCK, &sigset, 0); - execl("/bin/sh", "/bin/sh", "-c", command, NULL); - _exit(0); - } - } + tint_exec(command); } diff --git a/src/tint.c b/src/tint.c index 23394d9..fbe62ac 100644 --- a/src/tint.c +++ b/src/tint.c @@ -95,7 +95,7 @@ void init (int argc, char *argv[]) sigaction(SIGINT, &sa, 0); sigaction(SIGTERM, &sa, 0); sigaction(SIGHUP, &sa, 0); - signal(SIGCHLD, SIG_IGN); // don't have to wait() after fork() +// signal(SIGCHLD, SIG_IGN); // don't have to wait() after fork() // BSD is too stupid to support pselect(), therefore we have to use select and hope that we do not // end up in a race condition there diff --git a/src/util/common.c b/src/util/common.c index 545a6be..629d29c 100644 --- a/src/util/common.c +++ b/src/util/common.c @@ -25,7 +25,7 @@ #include #include #include - +#include #include "common.h" #include "../server.h" @@ -77,6 +77,23 @@ int parse_line (const char *line, char **key, char **value) } +void tint_exec(const char *command) +{ + if (command) { + pid_t pid; + pid = fork(); + if (pid == 0) { + // change for the fork the signal mask +// sigset_t sigset; +// sigprocmask(SIG_SETMASK, &sigset, 0); +// sigprocmask(SIG_UNBLOCK, &sigset, 0); + execl("/bin/sh", "/bin/sh", "-c", command, NULL); + _exit(0); + } + } +} + + int hex_char_to_int (char c) { int r; diff --git a/src/util/common.h b/src/util/common.h index e620511..e85af7e 100644 --- a/src/util/common.h +++ b/src/util/common.h @@ -40,6 +40,10 @@ void copy_file(const char *pathSrc, const char *pathDest); // extract key = value int parse_line (const char *line, char **key, char **value); +// execute a command by calling fork +void tint_exec(const char* command); + + // conversion int hex_char_to_int (char c); int hex_to_rgb (char *hex, int *r, int *g, int *b); -- 2.44.0