Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 23 Aug 2015 20:39:19 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r287080 - stable/10/usr.sbin/watchdogd
Message-ID:  <201508232039.t7NKdJ3w002804@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Sun Aug 23 20:39:19 2015
New Revision: 287080
URL: https://svnweb.freebsd.org/changeset/base/287080

Log:
  MFC r286947:  Add a new exit-timeout option to watchdogd.

Modified:
  stable/10/usr.sbin/watchdogd/watchdogd.8
  stable/10/usr.sbin/watchdogd/watchdogd.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.sbin/watchdogd/watchdogd.8
==============================================================================
--- stable/10/usr.sbin/watchdogd/watchdogd.8	Sun Aug 23 20:16:13 2015	(r287079)
+++ stable/10/usr.sbin/watchdogd/watchdogd.8	Sun Aug 23 20:39:19 2015	(r287080)
@@ -27,7 +27,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd October 18, 2014
+.Dd May 11, 2015
 .Dt WATCHDOGD 8
 .Os
 .Sh NAME
@@ -46,6 +46,7 @@
 .Op Fl s Ar sleep
 .Op Fl t Ar timeout
 .Op Fl T Ar script_timeout
+.Op Fl x Ar exit_timeout
 .Sh DESCRIPTION
 The
 .Nm
@@ -103,14 +104,25 @@ defaults to the value specified by the
 .Fl s Ar sleep
 option.
 .Pp
+The
+.Fl x Ar exit_timeout
+argument is the timeout period (in seconds) to leave in effect when the
+program exits.
+Using
+.Fl x
+with a non-zero value protects against lockup during a reboot by
+triggering a hardware reset if the software reboot doesn't complete
+before the given timeout expires.
+.Pp
 Upon receiving the
 .Dv SIGTERM
 or
 .Dv SIGINT
 signals,
 .Nm
-will first instruct the kernel to no longer perform watchdog checks and then
-will terminate.
+will terminate, after first instructing the kernel to either disable the
+timeout or reset it to the value given by
+.Fl x Ar exit_timeout .
 .Pp
 The
 .Nm

Modified: stable/10/usr.sbin/watchdogd/watchdogd.c
==============================================================================
--- stable/10/usr.sbin/watchdogd/watchdogd.c	Sun Aug 23 20:16:13 2015	(r287079)
+++ stable/10/usr.sbin/watchdogd/watchdogd.c	Sun Aug 23 20:39:19 2015	(r287080)
@@ -77,6 +77,7 @@ static int debugging = 0;
 static int end_program = 0;
 static const char *pidfile = _PATH_VARRUN "watchdogd.pid";
 static u_int timeout = WD_TO_128SEC;
+static u_int exit_timeout = WD_TO_NEVER;
 static u_int pretimeout = 0;
 static u_int timeout_sec;
 static u_int passive = 0;
@@ -461,10 +462,10 @@ watchdog_onoff(int onoff)
 		/* pat one more time for good measure */
 		return watchdog_patpat((timeout|WD_ACTIVE));
 	 } else {
-		return watchdog_patpat(0);
+		return watchdog_patpat(exit_timeout);
 	 }
 failsafe:
-	watchdog_patpat(0);
+	watchdog_patpat(exit_timeout);
 	return (error);
 }
 
@@ -476,8 +477,8 @@ usage(void)
 {
 	if (is_daemon)
 		fprintf(stderr, "usage:\n"
-"  watchdogd [-dnSw] [-e cmd] [-I file] [-s sleep] [-t timeout]\n"
-"            [-T script_timeout]\n"
+"  watchdogd [-dnSw] [-e cmd] [-I pidfile] [-s sleep] [-t timeout]\n"
+"            [-T script_timeout] [-x exit_timeout]\n"
 "            [--debug]\n"
 "            [--pretimeout seconds] [-pretimeout-action action]\n"
 "            [--softtimeout] [-softtimeout-action action]\n"
@@ -697,7 +698,7 @@ parseargs(int argc, char *argv[])
 		is_daemon = 1;
 
 	if (is_daemon)
-		getopt_shortopts = "I:de:ns:t:ST:w?";
+		getopt_shortopts = "I:de:ns:t:ST:wx:?";
 	else
 		getopt_shortopts = "dt:?";
 
@@ -741,6 +742,11 @@ parseargs(int argc, char *argv[])
 		case 'w':
 			do_timedog = 1;
 			break;
+		case 'x':
+			exit_timeout = parse_timeout_to_pow2ns(c, NULL, optarg);
+			if (exit_timeout != 0)
+				exit_timeout |= WD_ACTIVE;
+			break;
 		case 0:
 			lopt = longopts[longindex].name;
 			if (!strcmp(lopt, "pretimeout")) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201508232039.t7NKdJ3w002804>