Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/powerd Add an option to not actually run the power ...



details:   https://anonhg.NetBSD.org/src/rev/42e8600642d0
branches:  trunk
changeset: 759729:42e8600642d0
user:      pgoyette <pgoyette%NetBSD.org@localhost>
date:      Wed Dec 15 17:12:40 2010 +0000

description:
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).

diffstat:

 usr.sbin/powerd/powerd.8 |  11 ++++-
 usr.sbin/powerd/powerd.c |  86 ++++++++++++++++++++++++++++++++++-------------
 2 files changed, 69 insertions(+), 28 deletions(-)

diffs (264 lines):

diff -r 1e3af32f14ba -r 42e8600642d0 usr.sbin/powerd/powerd.8
--- a/usr.sbin/powerd/powerd.8  Wed Dec 15 17:09:07 2010 +0000
+++ b/usr.sbin/powerd/powerd.8  Wed Dec 15 17:12:40 2010 +0000
@@ -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
diff -r 1e3af32f14ba -r 42e8600642d0 usr.sbin/powerd/powerd.c
--- a/usr.sbin/powerd/powerd.c  Wed Dec 15 17:09:07 2010 +0000
+++ b/usr.sbin/powerd/powerd.c  Wed Dec 15 17:12:40 2010 +0000
@@ -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);
+       }
+}



Home | Main Index | Thread Index | Old Index