diff options
-rw-r--r-- | contrib/package/freifunk-watchdog/Makefile | 2 | ||||
-rw-r--r-- | contrib/package/freifunk-watchdog/src/watchdog.c | 17 | ||||
-rw-r--r-- | contrib/package/freifunk-watchdog/src/watchdog.h | 35 |
3 files changed, 33 insertions, 21 deletions
diff --git a/contrib/package/freifunk-watchdog/Makefile b/contrib/package/freifunk-watchdog/Makefile index 7a68afb88..25c4efa35 100644 --- a/contrib/package/freifunk-watchdog/Makefile +++ b/contrib/package/freifunk-watchdog/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=freifunk-watchdog -PKG_RELEASE:=6 +PKG_RELEASE:=7 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DEPENDS := uci diff --git a/contrib/package/freifunk-watchdog/src/watchdog.c b/contrib/package/freifunk-watchdog/src/watchdog.c index b87bed0a9..2d6e4a6f7 100644 --- a/contrib/package/freifunk-watchdog/src/watchdog.c +++ b/contrib/package/freifunk-watchdog/src/watchdog.c @@ -21,10 +21,18 @@ /* Global watchdog fd, required by signal handler */ int wdfd = -1; +/* Handle finished childs */ +static void sigchld_handler(int sig) +{ + pid_t pid; + + while( (pid = waitpid(-1, NULL, WNOHANG)) > 0 ) + syslog(LOG_INFO, "Child returned (pid %d)", pid); +} + /* Watchdog shutdown helper */ static void shutdown_watchdog(int sig) { - static int wdelay = 3600; static const char wshutdown = WATCH_SHUTDOWN; if( wdfd > -1 ) @@ -298,7 +306,7 @@ static int do_daemon(void) int loadavg_panic = 0; openlog(SYSLOG_IDENT, 0, LOG_DAEMON); - //daemon(1, 1); + memset(&sa, 0, sizeof(sa)); if( (iwfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ) { @@ -327,6 +335,11 @@ static int do_daemon(void) ioctl(wdfd, WDIOC_SETTIMEOUT, &wdtimeout); } + /* Install signal handler to reap childs */ + sa.sa_handler = sigchld_handler; + sa.sa_flags = 0; + sigaction(SIGCHLD, &sa, NULL); + while( 1 ) { /* Check/increment action interval */ diff --git a/contrib/package/freifunk-watchdog/src/watchdog.h b/contrib/package/freifunk-watchdog/src/watchdog.h index 6d9ccf82c..71c10e9c1 100644 --- a/contrib/package/freifunk-watchdog/src/watchdog.h +++ b/contrib/package/freifunk-watchdog/src/watchdog.h @@ -29,6 +29,7 @@ #include <math.h> #include <time.h> #include <signal.h> +#include <sys/wait.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <sys/socket.h> @@ -67,7 +68,7 @@ /* System load error action and treshold */ #define LOAD_TRESHOLD 15.00 -#define LOAD_ACTION "/sbin/reboot" +#define LOAD_ACTION "/sbin/reboot", "/sbin/reboot" /* Fallback binary name (passed by makefile) */ #ifndef BINARY @@ -107,22 +108,20 @@ iw_ioctl(int skfd, /* Socket to the kernel */ } /* fork() & execl() helper */ -#define EXEC(x) \ - do { \ - switch(fork()) \ - { \ - case -1: \ - syslog(LOG_CRIT, "Unable to fork child: %s", \ - strerror(errno)); \ - \ - break; \ - \ - case 0: \ - execl(x, NULL); \ - syslog(LOG_CRIT, "Unable to execute action: %s", \ - strerror(errno)); \ - \ - return 1; \ - } \ +#define EXEC(x) \ + do { \ + switch(fork()) \ + { \ + case -1: \ + syslog(LOG_CRIT, "Unable to fork child: %s", \ + strerror(errno)); \ + break; \ + \ + case 0: \ + execl(x, NULL); \ + syslog(LOG_CRIT, "Unable to execute action: %s", \ + strerror(errno)); \ + return 1; \ + } \ } while(0) |