Module Name:    src
Committed By:   pgoyette
Date:           Wed Dec 15 17:12:40 UTC 2010

Modified Files:
        src/usr.sbin/powerd: powerd.8 powerd.c

Log Message:
Add an option to not actually run the power management scripts, and
when in debug mode send all error messages to stderr rather than to
syslog(8).


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/usr.sbin/powerd/powerd.8
cvs rdiff -u -r1.14 -r1.15 src/usr.sbin/powerd/powerd.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/powerd/powerd.8
diff -u src/usr.sbin/powerd/powerd.8:1.22 src/usr.sbin/powerd/powerd.8:1.23
--- src/usr.sbin/powerd/powerd.8:1.22	Wed Jan 27 06:52:24 2010
+++ src/usr.sbin/powerd/powerd.8	Wed Dec 15 17:12:40 2010
@@ -1,4 +1,4 @@
-.\"	$NetBSD: powerd.8,v 1.22 2010/01/27 06:52:24 wiz Exp $
+.\"	$NetBSD: powerd.8,v 1.23 2010/12/15 17:12:40 pgoyette Exp $
 .\"
 .\" Copyright (c) 2003 Wasabi Systems, Inc.
 .\" All rights reserved.
@@ -33,7 +33,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd January 26, 2010
+.Dd December 15, 2010
 .Dt POWERD 8
 .Os
 .Sh NAME
@@ -42,6 +42,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl d
+.Op Fl n
 .Sh DESCRIPTION
 .Nm
 acts upon power management events posted by the kernel's power management
@@ -58,9 +59,13 @@
 .Bl -tag -width xxxx
 .It Fl d
 Enable debugging mode.
-Verbose messages will be sent to stderr and
+Verbose messages and all messages intended for
+.Xr syslog 8
+will be sent to stderr, and
 .Nm
 will stay in the foreground of the controlling terminal.
+.It Fl n
+Prevent execution of power management scripts.
 .El
 .Sh CONFIGURATION SCRIPTS
 All configuration of

Index: src/usr.sbin/powerd/powerd.c
diff -u src/usr.sbin/powerd/powerd.c:1.14 src/usr.sbin/powerd/powerd.c:1.15
--- src/usr.sbin/powerd/powerd.c:1.14	Sat Apr 24 20:44:33 2010
+++ src/usr.sbin/powerd/powerd.c	Wed Dec 15 17:12:40 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: powerd.c,v 1.14 2010/04/24 20:44:33 jruoho Exp $	*/
+/*	$NetBSD: powerd.c,v 1.15 2010/12/15 17:12:40 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -39,6 +39,8 @@
  * Power management daemon for sysmon.
  */
 
+#define SYSLOG_NAMES
+
 #include <sys/cdefs.h>
 #include <sys/param.h>
 #include <sys/event.h>
@@ -54,8 +56,10 @@
 #include <unistd.h>
 #include <util.h>
 #include <prop/proplib.h>
+#include <stdarg.h>
+#include <string.h>
 
-int	debug;
+int	debug, no_scripts;
 
 static int kq;
 
@@ -67,6 +71,7 @@
 static int wait_for_events(struct kevent *, size_t);
 static void dispatch_dev_power(struct kevent *);
 static void dispatch_power_event_state_change(int, power_event_t *);
+static void powerd_log(int, const char *, ...);
 
 static const char *script_paths[] = {
 	NULL,
@@ -83,12 +88,16 @@
 
 	setprogname(*argv);
 
-	while ((ch = getopt(argc, argv, "d")) != -1) {
+	while ((ch = getopt(argc, argv, "dn")) != -1) {
 		switch (ch) {
 		case 'd':
 			debug = 1;
 			break;
 
+		case 'n':
+			no_scripts = 1;
+			break;
+
 		default:
 			usage();
 		}
@@ -99,36 +108,40 @@
 	if (argc)
 		usage();
 
-	if (debug == 0)
+	if (debug == 0) {
 		(void)daemon(0, 0);
 
-	openlog("powerd", LOG_PID | LOG_NOWAIT, LOG_DAEMON);
-	(void)pidfile(NULL);
+		openlog("powerd", LOG_PID | LOG_NOWAIT, LOG_DAEMON);
+		(void)pidfile(NULL);
+	}
 
 	if ((kq = kqueue()) == -1) {
-		syslog(LOG_ERR, "kqueue: %m");
+		powerd_log(LOG_ERR, "kqueue: %s", strerror(errno));
 		exit(EX_OSERR);
 	}
 
 	if ((fd = open(_PATH_POWER, O_RDONLY|O_NONBLOCK, 0600)) == -1) {
-		syslog(LOG_ERR, "open %s: %m", _PATH_POWER);
+		powerd_log(LOG_ERR, "open %s: %s", _PATH_POWER,
+		    strerror(errno));
 		exit(EX_OSERR);
 	}
 
 	if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
-		syslog(LOG_ERR, "Cannot set close on exec in power fd: %m");
+		powerd_log(LOG_ERR, "Cannot set close on exec in power fd: %s",
+		    strerror(errno));
 		exit(EX_OSERR);
 	}
 
 	if (ioctl(fd, POWER_IOC_GET_TYPE, &power_type) == -1) {
-		syslog(LOG_ERR, "POWER_IOC_GET_TYPE: %m");
+		powerd_log(LOG_ERR, "POWER_IOC_GET_TYPE: %s", strerror(errno));
 		exit(EX_OSERR);
 	}
 
 	(void)asprintf(&cp, "%s/%s", _PATH_POWERD_SCRIPTS,
 	    power_type.power_type);
 	if (cp == NULL) {
-		syslog(LOG_ERR, "allocating script path: %m");
+		powerd_log(LOG_ERR, "allocating script path: %s",
+		    strerror(errno));
 		exit(EX_OSERR);
 	}
 	script_paths[0] = cp;
@@ -153,7 +166,7 @@
 usage(void)
 {
 
-	(void)fprintf(stderr, "usage: %s [-d]\n", getprogname());
+	(void)fprintf(stderr, "usage: %s [-dn]\n", getprogname());
 	exit(EX_USAGE);
 }
 
@@ -173,16 +186,19 @@
 			argv[0] = path;
 
 			if (debug) {
-				(void)fprintf(stderr, "running script: %s",
-				    argv[0]);
+				(void)fprintf(stderr, "%srunning script: %s",
+				    no_scripts?"not ":"", argv[0]);
 				for (j = 1; argv[j] != NULL; j++)
 					(void)fprintf(stderr, " %s", argv[j]);
 				(void)fprintf(stderr, "\n");
 			}
+			if (no_scripts != 0)
+				return;
 
 			switch ((pid = vfork())) {
 			case -1:
-				syslog(LOG_ERR, "fork to run script: %m");
+				powerd_log(LOG_ERR, "fork to run script: %s",
+				    strerror(errno));
 				return;
 
 			case 0:
@@ -194,17 +210,18 @@
 			default:
 				/* Parent. */
 				if (waitpid(pid, &status, 0) == -1) {
-					syslog(LOG_ERR, "waitpid for %s: %m",
-					    path);
+					powerd_log(LOG_ERR,
+					    "waitpid for %s: %s", path,
+					    strerror(errno));
 					break;
 				}
 				if (WIFEXITED(status) &&
 				    WEXITSTATUS(status) != 0) {
-					syslog(LOG_ERR,
+					powerd_log(LOG_ERR,
 					    "%s exited with status %d",
 					    path, WEXITSTATUS(status));
 				} else if (!WIFEXITED(status)) {
-					syslog(LOG_ERR,
+					powerd_log(LOG_ERR,
 					    "%s terminated abnormally", path);
 				}
 				break;
@@ -214,9 +231,7 @@
 		}
 	}
 
-	syslog(LOG_ERR, "no script for %s", argv[0]);
-	if (debug)
-		(void)fprintf(stderr, "no script for %s\n", argv[0]);
+	powerd_log(LOG_ERR, "no script for %s", argv[0]);
 }
 
 static struct kevent changebuf[8];
@@ -243,7 +258,7 @@
 	    events, nevents, NULL)) < 0) {
 		nchanges = 0;
 		if (errno != EINTR) {
-			syslog(LOG_ERR, "kevent: %m");
+			powerd_log(LOG_ERR, "kevent: %s", strerror(errno));
 			exit(EX_OSERR);
 		}
 	}
@@ -266,7 +281,8 @@
 	if (read(fd, &pev, sizeof(pev)) != sizeof(pev)) {
 		if (errno == EWOULDBLOCK)
 			return;
-		syslog(LOG_ERR, "read of %s: %m", _PATH_POWER);
+		powerd_log(LOG_ERR, "read of %s: %s", _PATH_POWER,
+		    strerror(errno));
 		exit(EX_OSERR);
 	}
 
@@ -280,7 +296,7 @@
 		dispatch_power_event_state_change(fd, &pev);
 		break;
 	default:
-		syslog(LOG_INFO, "unknown %s event type: %d",
+		powerd_log(LOG_INFO, "unknown %s event type: %d",
 		    _PATH_POWER, pev.pev_type);
 	}
 
@@ -329,3 +345,23 @@
 
 	run_script(argv);
 }
+
+static void
+powerd_log(int pri, const char *msg, ...)
+{
+	va_list arglist;
+	unsigned int i;
+
+	va_start(arglist, msg);
+	if (debug == 0)
+		vsyslog(pri, msg, arglist);
+	else {
+		for (i = 0; i < __arraycount(prioritynames); i++)
+			if (prioritynames[i].c_val == pri)
+				break;
+		fprintf(stderr, "%s: ",
+		    (prioritynames[i].c_val == -1) ?
+			    "UNKNOWN" : prioritynames[i].c_name);
+		vfprintf(stderr, msg, arglist);
+	}
+}

Reply via email to