watchdog: Add an info message if the watchdog reset the system
[project/procd.git] / watchdog.c
index 9d770b4470a946ec37cc65d5769445ecd544997b..39ae9ff9aa5823ab05c9b1af3e650a11e93cf7d3 100644 (file)
@@ -93,6 +93,35 @@ static int watchdog_set_drv_timeout(void)
        return ioctl(wdt_fd, WDIOC_SETTIMEOUT, &wdt_drv_timeout);
 }
 
+static void watchdog_print_status(void)
+{
+       struct watchdog_info wdt_info;
+       int bootstatus;
+
+       if (wdt_fd < 0)
+               return;
+
+       if (ioctl(wdt_fd, WDIOC_GETSUPPORT, &wdt_info)) {
+               DEBUG(2, "Watchdog GETSUPPORT failed\n");
+               return;
+       }
+
+       if (!(wdt_info.options & WDIOF_CARDRESET)) {
+               DEBUG(2, "Watchdog does not have CARDRESET support\n");
+               return;
+       }
+
+       if (ioctl(wdt_fd, WDIOC_GETBOOTSTATUS, &bootstatus)) {
+               DEBUG(2, "Watchdog GETBOOTSTATUS failed\n");
+               return;
+       }
+
+       if (bootstatus & WDIOF_CARDRESET)
+               LOG("Watchdog has previously reset the system\n");
+       else
+               DEBUG(2, "Watchdog did not previously reset the system\n");
+}
+
 void watchdog_set_magicclose(bool val)
 {
        wdt_magicclose = val;
@@ -170,6 +199,8 @@ void watchdog_init(int preinit)
        watchdog_timeout_cb(&wdt_timeout);
 
        DEBUG(4, "Opened watchdog with timeout %ds\n", watchdog_timeout(0));
+
+       watchdog_print_status();
 }