*fix* execute an external command by calling fork/execl and do not ignore SIGCHLD (maybe fixes issue 263)
git-svn-id: http://tint2.googlecode.com/svn/trunk@480 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
parent
e26cecf664
commit
5521275bef
5 changed files with 28 additions and 18 deletions
|
@ -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;
|
||||
|
|
|
@ -22,8 +22,6 @@
|
|||
#include <cairo.h>
|
||||
#include <cairo-xlib.h>
|
||||
#include <pango/pangocairo.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue