148730Siwasaki/*- 248730Siwasaki * APM (Advanced Power Management) Event Dispatcher 348730Siwasaki * 448730Siwasaki * Copyright (c) 1999 Mitsuru IWASAKI <iwasaki@FreeBSD.org> 548730Siwasaki * Copyright (c) 1999 KOIE Hidetaka <koie@suri.co.jp> 648730Siwasaki * All rights reserved. 748730Siwasaki * 848730Siwasaki * Redistribution and use in source and binary forms, with or without 948730Siwasaki * modification, are permitted provided that the following conditions 1048730Siwasaki * are met: 1148730Siwasaki * 1. Redistributions of source code must retain the above copyright 1248730Siwasaki * notice, this list of conditions and the following disclaimer. 1348730Siwasaki * 2. Redistributions in binary form must reproduce the above copyright 1448730Siwasaki * notice, this list of conditions and the following disclaimer in the 1548730Siwasaki * documentation and/or other materials provided with the distribution. 1648730Siwasaki * 1748730Siwasaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1848730Siwasaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1948730Siwasaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2048730Siwasaki * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2148730Siwasaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2248730Siwasaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2348730Siwasaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2448730Siwasaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2548730Siwasaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2648730Siwasaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2748730Siwasaki * SUCH DAMAGE. 2848730Siwasaki * 2950479Speter * $FreeBSD$ 3048730Siwasaki */ 3148730Siwasaki 3248730Siwasaki#define APMD_CONFIGFILE "/etc/apmd.conf" 3348730Siwasaki#define APM_CTL_DEVICEFILE "/dev/apmctl" 3476611Snsayer#define APM_NORM_DEVICEFILE "/dev/apm" 3548730Siwasaki#define APMD_PIDFILE "/var/run/apmd.pid" 3648730Siwasaki#define NICE_INCR -20 3748730Siwasaki 3848730Siwasakienum { 3948730Siwasaki EVENT_NOEVENT, 4048730Siwasaki EVENT_STANDBYREQ, 4148730Siwasaki EVENT_SUSPENDREQ, 4248730Siwasaki EVENT_NORMRESUME, 4348730Siwasaki EVENT_CRITRESUME, 4448730Siwasaki EVENT_BATTERYLOW, 4548730Siwasaki EVENT_POWERSTATECHANGE, 4648730Siwasaki EVENT_UPDATETIME, 4748730Siwasaki EVENT_CRITSUSPEND, 4848730Siwasaki EVENT_USERSTANDBYREQ, 4948730Siwasaki EVENT_USERSUSPENDREQ, 5048730Siwasaki EVENT_STANDBYRESUME, 5148730Siwasaki EVENT_CAPABILITIESCHANGE, 5248730Siwasaki EVENT_MAX 5348730Siwasaki}; 5448730Siwasaki 5548730Siwasakistruct event_cmd_op { 5699800Salfred int (* act)(void *this); 5799800Salfred void (* dump)(void *this, FILE * fp); 5899800Salfred struct event_cmd * (* clone)(void *this); 5999800Salfred void (* free)(void *this); 6048730Siwasaki}; 6148730Siwasakistruct event_cmd { 6248730Siwasaki struct event_cmd * next; 6348730Siwasaki size_t len; 6448730Siwasaki char * name; 6548730Siwasaki struct event_cmd_op * op; 6648730Siwasaki}; 6748730Siwasakistruct event_cmd_exec { 6848730Siwasaki struct event_cmd evcmd; 6948730Siwasaki char * line; /* Command line */ 7048730Siwasaki}; 7148730Siwasakistruct event_cmd_reject { 7248730Siwasaki struct event_cmd evcmd; 7348730Siwasaki}; 7448730Siwasaki 7548730Siwasakistruct event_config { 7648730Siwasaki const char *name; 7748730Siwasaki struct event_cmd * cmdlist; 7848730Siwasaki int rejectable; 7948730Siwasaki}; 8048730Siwasaki 8176611Snsayerstruct battery_watch_event { 8276611Snsayer struct battery_watch_event *next; 8376611Snsayer int level; 8476611Snsayer enum { 8576611Snsayer BATTERY_CHARGING, 8676611Snsayer BATTERY_DISCHARGING 8776611Snsayer } direction; 8876611Snsayer enum { 8976611Snsayer BATTERY_MINUTES, 9076611Snsayer BATTERY_PERCENT 9176611Snsayer } type; 9276611Snsayer int done; 9376611Snsayer struct event_cmd *cmdlist; 9476611Snsayer}; 9576611Snsayer 9676611Snsayer 9748730Siwasakiextern struct event_cmd_op event_cmd_exec_ops; 9848730Siwasakiextern struct event_cmd_op event_cmd_reject_ops; 9948730Siwasakiextern struct event_config events[EVENT_MAX]; 10076611Snsayerextern struct battery_watch_event *battery_watch_list; 10148730Siwasaki 10276611Snsayerextern int register_battery_handlers( 10376611Snsayer int level, int direction, 10476611Snsayer struct event_cmd *cmdlist); 10548730Siwasakiextern int register_apm_event_handlers( 10648730Siwasaki bitstr_t bit_decl(evlist, EVENT_MAX), 10748730Siwasaki struct event_cmd *cmdlist); 10848730Siwasakiextern void free_event_cmd_list(struct event_cmd *p); 109208075Suqs 110208075Suqsextern int yyparse(void); 111208075Suqs 112208075Suqsvoid yyerror(const char *); 113208075Suqsint yylex(void); 114208075Suqs 115208075Suqsstruct event_cmd *event_cmd_default_clone(void *); 116208075Suqsint event_cmd_exec_act(void *); 117208075Suqsvoid event_cmd_exec_dump(void *, FILE *); 118208075Suqsstruct event_cmd *event_cmd_exec_clone(void *); 119208075Suqsvoid event_cmd_exec_free(void *); 120208075Suqsint event_cmd_reject_act(void *); 121208075Suqsstruct event_cmd *clone_event_cmd_list(struct event_cmd *); 122208075Suqsint exec_run_cmd(struct event_cmd *); 123208075Suqsint exec_event_cmd(struct event_config *); 124208075Suqsvoid read_config(void); 125208075Suqsvoid dump_config(void); 126208075Suqsvoid destroy_config(void); 127208075Suqsvoid restart(void); 128208075Suqsvoid enque_signal(int); 129208075Suqsvoid wait_child(void); 130208075Suqsint proc_signal(int); 131208075Suqsvoid proc_apmevent(int); 132208075Suqsvoid check_battery(void); 133208075Suqsvoid event_loop(void); 134