Date: Sat, 24 Nov 2001 13:42:20 GMT From: "Walter C. Pelissero" <walter@pelissero.org> To: FreeBSD-gnats-submit@freebsd.org Subject: i386/32251: bugfix and new feature for apmd Message-ID: <200111241342.fAODgKH09420@pelissero.org>
next in thread | raw e-mail | index | archive | help
>Number: 32251 >Category: i386 >Synopsis: bugfix and new feature for apmd >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sat Nov 24 05:50:01 PST 2001 >Closed-Date: >Last-Modified: >Originator: Walter C. Pelissero >Release: FreeBSD 4.4-STABLE i386 >Organization: >Environment: System: FreeBSD hyde.lpds.sublink.org 4.4-STABLE FreeBSD 4.4-STABLE #0: Wed Nov 14 13:34:31 GMT 2001 root@hyde.lpds.sublink.org:/.amd_mnt/daemon/host/usr/src/sys/compile/PCG-XG9 i386 >Description: Apmd would benefit of the included patches. One is to correct a bug: apmd ignores termination signals. The other one introduces a new feature. With the -s flag apmd simulate a POWERSTATECHANGE event when a power state change is detected (AC_POWER_STATE) but the bios of the laptop doesn't report it. This enables you to do things like dimming the LCD backlight when you unplug the power cord. >How-To-Repeat: To verify the bug: killall apmd To verify the new feature add this to your /atc/apmd.conf: apm_event POWERSTATECHANGE { exec "/bin/sh /usr/local/bin/my-preferred-power-state-change-script"; } >Fix: --- /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); >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200111241342.fAODgKH09420>