luci-0.8: merge r4510

This commit is contained in:
Jo-Philipp Wich 2009-05-13 00:19:59 +00:00
parent 8fdf06b232
commit 90b2eeb9fd
2 changed files with 52 additions and 11 deletions

View file

@ -18,6 +18,34 @@
#include "watchdog.h"
/* Global watchdog fd, required by signal handler */
int wdfd = -1;
/* Watchdog shutdown helper */
static void shutdown_watchdog(int sig)
{
static int wdelay = 3600;
static const char wshutdown = WATCH_SHUTDOWN;
if( wdfd > -1 )
{
syslog(LOG_INFO, "Stopping watchdog timer");
write(wdfd, &wshutdown, 1);
/* Older Kamikaze versions are compiled with
* CONFIG_WATCHDOG_NOWAYOUT=y, this can be
* harmful if we're in the middle of an upgrade.
* Increase the watchdog timeout to 3600 seconds
* here to avoid unplanned reboots. */
ioctl(wdfd, WDIOC_SETTIMEOUT, &wdelay);
close(wdfd);
wdfd = -1;
}
exit(0);
}
/* Get BSSID of given interface */
static int iw_get_bssid(int iwfd, const char *ifname, char *bssid)
{
@ -257,11 +285,14 @@ static wifi_tuple_t * load_wifi_uci(wifi_tuple_t *ifs, time_t *modtime)
/* Daemon implementation */
static int do_daemon(void)
{
static int wdtrigger = 1;
static int wdtimeout = INTERVAL * 2;
static const char wdkeepalive = WATCH_KEEPALIVE;
int iwfd;
int wdfd;
int wdtrigger = 1;
int channel;
char bssid[18];
struct sigaction sa;
wifi_tuple_t *ifs = NULL, *curif;
time_t modtime = 0;
@ -284,8 +315,21 @@ static int do_daemon(void)
if( (wdfd = open(WATCH_DEVICE, O_WRONLY)) > -1 )
{
syslog(LOG_INFO, "Opened %s - polling each %i seconds",
syslog(LOG_INFO, "Opened %s - polling every %i seconds",
WATCH_DEVICE, INTERVAL);
/* Install signal handler to halt watchdog on shutdown */
sa.sa_handler = shutdown_watchdog;
sa.sa_flags = SA_NOCLDWAIT | SA_RESTART;
sigaction(SIGHUP, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGPIPE, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);
sigaction(SIGUSR2, &sa, NULL);
/* Set watchdog timeout to twice the interval */
ioctl(wdfd, WDIOC_SETTIMEOUT, &wdtimeout);
}
while( 1 )
@ -375,19 +419,14 @@ static int do_daemon(void)
/* Reset watchdog timer */
if( wdfd > -1 )
write(wdfd, '\0', 1);
write(wdfd, &wdkeepalive, 1);
sleep(INTERVAL);
}
if( wdfd > -1 )
{
syslog(LOG_INFO, "Stopping watchdog timer");
write(wdfd, WATCH_SHUTDOWN, 1);
close(wdfd);
}
shutdown_watchdog(0);
closelog();
return 0;
}

View file

@ -28,6 +28,7 @@
#include <fcntl.h>
#include <math.h>
#include <time.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@ -59,6 +60,7 @@
/* Watchdog device */
#define WATCH_DEVICE "/dev/watchdog"
#define WATCH_SHUTDOWN 'V'
#define WATCH_KEEPALIVE '\0'
/* System load error action and treshold */
#define LOAD_TRESHOLD 5.00