148730Siwasaki%{ 248730Siwasaki/*- 348730Siwasaki * APM (Advanced Power Management) Event Dispatcher 448730Siwasaki * 548730Siwasaki * Copyright (c) 1999 Mitsuru IWASAKI <iwasaki@FreeBSD.org> 648730Siwasaki * Copyright (c) 1999 KOIE Hidetaka <koie@suri.co.jp> 748730Siwasaki * All rights reserved. 848730Siwasaki * 948730Siwasaki * Redistribution and use in source and binary forms, with or without 1048730Siwasaki * modification, are permitted provided that the following conditions 1148730Siwasaki * are met: 1248730Siwasaki * 1. Redistributions of source code must retain the above copyright 1348730Siwasaki * notice, this list of conditions and the following disclaimer. 1448730Siwasaki * 2. Redistributions in binary form must reproduce the above copyright 1548730Siwasaki * notice, this list of conditions and the following disclaimer in the 1648730Siwasaki * documentation and/or other materials provided with the distribution. 1748730Siwasaki * 1848730Siwasaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1948730Siwasaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2048730Siwasaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2148730Siwasaki * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2248730Siwasaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2348730Siwasaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2448730Siwasaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2548730Siwasaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2648730Siwasaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2748730Siwasaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2848730Siwasaki * SUCH DAMAGE. 2948730Siwasaki * 3050479Speter * $FreeBSD$ 3148730Siwasaki */ 3248730Siwasaki 3348730Siwasaki#include <stdio.h> 3448730Siwasaki#include <bitstring.h> 3576611Snsayer#include <stdlib.h> 36116074Simp#include <string.h> 3748730Siwasaki#include "apmd.h" 3848730Siwasaki 3948730Siwasaki#ifdef DEBUG 4048730Siwasaki#define YYDEBUG 1 4148730Siwasaki#endif 4248730Siwasaki 4348730Siwasakiextern int first_time; 4448730Siwasaki 4548730Siwasaki%} 4648730Siwasaki 4748730Siwasaki%union { 4848730Siwasaki char *str; 4948730Siwasaki bitstr_t bit_decl(evlist, EVENT_MAX); 5048730Siwasaki int ev; 5148730Siwasaki struct event_cmd * evcmd; 5276611Snsayer int i; 5348730Siwasaki} 5448730Siwasaki 5548730Siwasaki%token BEGINBLOCK ENDBLOCK 5648730Siwasaki%token COMMA SEMICOLON 5748730Siwasaki%token APMEVENT 5876611Snsayer%token APMBATT 5976611Snsayer%token BATTCHARGE BATTDISCHARGE 60116442Smaxim%token <i> BATTTIME BATTPERCENT 6148730Siwasaki%token EXECCMD REJECTCMD 6248730Siwasaki%token <ev> EVENT 6348730Siwasaki%token <str> STRING UNKNOWN 6448730Siwasaki 6576611Snsayer%type <i> apm_battery_level 6676611Snsayer%type <i> apm_battery_direction 6748730Siwasaki%type <str> string 6848730Siwasaki%type <str> unknown 6948730Siwasaki%type <evlist> event_list 7048730Siwasaki%type <evcmd> cmd_list 7148730Siwasaki%type <evcmd> cmd 7248730Siwasaki%type <evcmd> exec_cmd reject_cmd 7348730Siwasaki 7448730Siwasaki%% 7548730Siwasaki 7648730Siwasakiconfig_file 7748730Siwasaki : { first_time = 1; } config_list 7848730Siwasaki ; 7948730Siwasaki 8048730Siwasakiconfig_list 8148730Siwasaki : config 8248730Siwasaki | config_list config 8348730Siwasaki ; 8448730Siwasaki 8548730Siwasakiconfig 8648730Siwasaki : apm_event_statement 8776611Snsayer | apm_battery_statement 8848730Siwasaki ; 8948730Siwasaki 9048730Siwasakiapm_event_statement 9148730Siwasaki : APMEVENT event_list BEGINBLOCK cmd_list ENDBLOCK 9248730Siwasaki { 9348730Siwasaki if (register_apm_event_handlers($2, $4) < 0) 9448730Siwasaki abort(); /* XXX */ 9548730Siwasaki free_event_cmd_list($4); 9648730Siwasaki } 9748730Siwasaki ; 9848730Siwasaki 9976611Snsayerapm_battery_level 10076611Snsayer : BATTPERCENT 10176611Snsayer { 10276611Snsayer $$ = $1; 10376611Snsayer } 10476611Snsayer | BATTTIME 10576611Snsayer { 10676611Snsayer $$ = $1; 10776611Snsayer } 10876611Snsayer ; 10976611Snsayer 11076611Snsayerapm_battery_direction 11176611Snsayer : BATTCHARGE 11276611Snsayer { 11376611Snsayer $$ = 1; 11476611Snsayer } 11576611Snsayer | BATTDISCHARGE 11676611Snsayer { 11776611Snsayer $$ = -1; 11876611Snsayer } 11976611Snsayer ; 12076611Snsayerapm_battery_statement 12176611Snsayer : APMBATT apm_battery_level apm_battery_direction 12276611Snsayer BEGINBLOCK cmd_list ENDBLOCK 12376611Snsayer { 12476611Snsayer if (register_battery_handlers($2, $3, $5) < 0) 12576611Snsayer abort(); /* XXX */ 12676611Snsayer free_event_cmd_list($5); 12776611Snsayer } 12876611Snsayer ; 12976611Snsayer 13048730Siwasakievent_list 13148730Siwasaki : EVENT 13248730Siwasaki { 13348730Siwasaki bit_nclear($$, 0, EVENT_MAX - 1); 13448730Siwasaki bit_set($$, $1); 13548730Siwasaki } 13648730Siwasaki | event_list COMMA EVENT 13748730Siwasaki { 13848730Siwasaki memcpy(&($$), &($1), bitstr_size(EVENT_MAX)); 13948730Siwasaki bit_set($$, $3); 14048730Siwasaki } 14148730Siwasaki ; 14248730Siwasaki 14348730Siwasakicmd_list 14448730Siwasaki : /* empty */ 14548730Siwasaki { 14648730Siwasaki $$ = NULL; 14748730Siwasaki } 14848730Siwasaki | cmd_list cmd 14948730Siwasaki { 15048730Siwasaki struct event_cmd * p = $1; 15148730Siwasaki if (p) { 15248730Siwasaki while (p->next != NULL) 15348730Siwasaki p = p->next; 15448730Siwasaki p->next = $2; 15548730Siwasaki $$ = $1; 15648730Siwasaki } else { 15748730Siwasaki $$ = $2; 15848730Siwasaki } 15948730Siwasaki } 16048730Siwasaki ; 16148730Siwasaki 16248730Siwasakicmd 16348730Siwasaki : exec_cmd SEMICOLON { $$ = $1; } 16448730Siwasaki | reject_cmd SEMICOLON { $$ = $1; } 16548730Siwasaki ; 16648730Siwasaki 16748730Siwasakiexec_cmd 16848730Siwasaki : EXECCMD string 16948730Siwasaki { 17048730Siwasaki size_t len = sizeof (struct event_cmd_exec); 17148730Siwasaki struct event_cmd_exec *cmd = malloc(len); 17248730Siwasaki cmd->evcmd.next = NULL; 17348730Siwasaki cmd->evcmd.len = len; 17448730Siwasaki cmd->evcmd.name = "exec"; 17548730Siwasaki cmd->evcmd.op = &event_cmd_exec_ops; 17648730Siwasaki cmd->line = $2; 17748730Siwasaki $$ = (struct event_cmd *) cmd; 17848730Siwasaki } 17948730Siwasaki ; 18048730Siwasaki 18148730Siwasakireject_cmd 18248730Siwasaki : REJECTCMD 18348730Siwasaki { 18448730Siwasaki size_t len = sizeof (struct event_cmd_reject); 18548730Siwasaki struct event_cmd_reject *cmd = malloc(len); 18648730Siwasaki cmd->evcmd.next = NULL; 18748730Siwasaki cmd->evcmd.len = len; 18848730Siwasaki cmd->evcmd.name = "reject"; 18948730Siwasaki cmd->evcmd.op = &event_cmd_reject_ops; 19048730Siwasaki $$ = (struct event_cmd *) cmd; 19148730Siwasaki } 19248730Siwasaki ; 19348730Siwasaki 19448730Siwasakistring 19548730Siwasaki : STRING { $$ = $1; } 19648730Siwasaki ; 19748730Siwasaki 19848730Siwasakiunknown 19948730Siwasaki : UNKNOWN 20048730Siwasaki { 20148730Siwasaki $$ = $1; 20248730Siwasaki } 20348730Siwasaki ; 20448730Siwasaki%% 20548730Siwasaki 206