Date: Sun, 14 Oct 2001 17:29:39 -0400 (EDT) From: "Andrew R. Reiter" <arr@watson.org> To: "Walter C. Pelissero" <walter@pelissero.org> Cc: hackers@FreeBSD.ORG Subject: Re: apmd fixes Message-ID: <Pine.NEB.3.96L.1011014172822.85531A-100000@fledge.watson.org> In-Reply-To: <15305.48681.337589.764014@hyde.lpds.sublink.org>
next in thread | previous in thread | raw e-mail | index | archive | help
While fixing/adding that, might as well go ahead and fix the signal
handler enque_signal(). I don't believe using err() in in a signal
handler is recommended as it could possible allow for undefined behavior
to occur.
Andrew
On Sun, 14 Oct 2001, Walter C. Pelissero wrote:
:Here are a couple of patches to apmd (as of FreeBSD 4.4-STABLE) to fix
:a bug and add a feature necessary on my Vaio PCG-XG9.
:
:The fix is to handle properly termination signals (currently ignored).
:
:The feature is the -s option that lets you fake POWERSTATECHANGE when
:the BIOS doesn't report it. This enables you to do fancy things like
:reducing the LCD backlight brightness when you unplug the power
:supply. Something like this in apmd.conf:
:
:apm_event POWERSTATECHANGE {
: exec "/bin/sh /usr/local/bin/my-preferred-power-state-change-script";
:}
:
:
:Here is the patch:
:
:--- /usr/home/wcp/tmp/apmd/apmd.c Fri Oct 12 20:22:34 2001
:+++ /usr/src/usr.sbin/apmd/apmd.c Sat Oct 13 14:58:35 2001
:@@ -55,7 +55,7 @@
: extern int yyparse(void);
:
: int debug_level = 0;
:-int verbose = 0;
:+int verbose = 0, soft_power_state_change = 0;
: const char *apmd_configfile = APMD_CONFIGFILE;
: const char *apmd_pidfile = APMD_PIDFILE;
: int apmctl_fd = -1, apmnorm_fd = -1;
:@@ -464,7 +464,6 @@
: int
: proc_signal(int fd)
: {
:- int rc = -1;
: int sig;
:
: while (read(fd, &sig, sizeof sig) == sizeof sig) {
:@@ -476,8 +475,7 @@
: break;
: case SIGTERM:
: syslog(LOG_NOTICE, "going down on signal %d", sig);
:- rc = 1;
:- goto out;
:+ return -1;
: case SIGCHLD:
: wait_child();
: break;
:@@ -486,9 +484,7 @@
: break;
: }
: }
:- rc = 0;
:- out:
:- return rc;
:+ return 0;
: }
: void
: proc_apmevent(int fd)
:@@ -548,6 +544,8 @@
: * the event-caught state.
: */
: if (last_state != AC_POWER_STATE) {
:+ if (soft_power_state_change && fork() == 0)
:+ exit(exec_event_cmd(&events[PMEV_POWERSTATECHANGE]));
: last_state = AC_POWER_STATE;
: for (p = battery_watch_list ; p!=NULL ; p = p -> next)
: p->done = 0;
:@@ -642,7 +640,7 @@
: char *prog;
: int logopt = LOG_NDELAY | LOG_PID;
:
:- while ((ch = getopt(ac, av, "df:v")) != EOF) {
:+ while ((ch = getopt(ac, av, "df:vs")) != EOF) {
: switch (ch) {
: case 'd':
: daemonize = 0;
:@@ -653,6 +651,9 @@
: break;
: case 'v':
: verbose = 1;
:+ break;
:+ case 's':
:+ soft_power_state_change = 1;
: break;
: default:
: (void) err(1, "unknown option `%c'", ch);
:
:
:--
:walter pelissero
:http://www.pelissero.org
:
:To Unsubscribe: send mail to majordomo@FreeBSD.org
:with "unsubscribe freebsd-hackers" in the body of the message
:
*-------------.................................................
| Andrew R. Reiter
| arr@fledge.watson.org
| "It requires a very unusual mind
| to undertake the analysis of the obvious" -- A.N. Whitehead
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.NEB.3.96L.1011014172822.85531A-100000>
