1d50a71bdSMitsuru IWASAKI %{ 2d50a71bdSMitsuru IWASAKI /*- 3*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 41de7b4b8SPedro F. Giffuni * 5d50a71bdSMitsuru IWASAKI * APM (Advanced Power Management) Event Dispatcher 6d50a71bdSMitsuru IWASAKI * 7d50a71bdSMitsuru IWASAKI * Copyright (c) 1999 Mitsuru IWASAKI <iwasaki@FreeBSD.org> 8d50a71bdSMitsuru IWASAKI * Copyright (c) 1999 KOIE Hidetaka <koie@suri.co.jp> 9d50a71bdSMitsuru IWASAKI * All rights reserved. 10d50a71bdSMitsuru IWASAKI * 11d50a71bdSMitsuru IWASAKI * Redistribution and use in source and binary forms, with or without 12d50a71bdSMitsuru IWASAKI * modification, are permitted provided that the following conditions 13d50a71bdSMitsuru IWASAKI * are met: 14d50a71bdSMitsuru IWASAKI * 1. Redistributions of source code must retain the above copyright 15d50a71bdSMitsuru IWASAKI * notice, this list of conditions and the following disclaimer. 16d50a71bdSMitsuru IWASAKI * 2. Redistributions in binary form must reproduce the above copyright 17d50a71bdSMitsuru IWASAKI * notice, this list of conditions and the following disclaimer in the 18d50a71bdSMitsuru IWASAKI * documentation and/or other materials provided with the distribution. 19d50a71bdSMitsuru IWASAKI * 20d50a71bdSMitsuru IWASAKI * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21d50a71bdSMitsuru IWASAKI * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22d50a71bdSMitsuru IWASAKI * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23d50a71bdSMitsuru IWASAKI * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24d50a71bdSMitsuru IWASAKI * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25d50a71bdSMitsuru IWASAKI * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26d50a71bdSMitsuru IWASAKI * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27d50a71bdSMitsuru IWASAKI * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28d50a71bdSMitsuru IWASAKI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29d50a71bdSMitsuru IWASAKI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30d50a71bdSMitsuru IWASAKI * SUCH DAMAGE. 31d50a71bdSMitsuru IWASAKI */ 32d50a71bdSMitsuru IWASAKI 3300774f35SPeter Wemm #include <sys/types.h> 34d50a71bdSMitsuru IWASAKI #include <stdio.h> 35d50a71bdSMitsuru IWASAKI #include <bitstring.h> 36719b9dc1SNick Sayer #include <stdlib.h> 37f4fe0dcbSWarner Losh #include <string.h> 38d50a71bdSMitsuru IWASAKI #include "apmd.h" 39d50a71bdSMitsuru IWASAKI 40d50a71bdSMitsuru IWASAKI #ifdef DEBUG 41d50a71bdSMitsuru IWASAKI #define YYDEBUG 1 42d50a71bdSMitsuru IWASAKI #endif 43d50a71bdSMitsuru IWASAKI 44d50a71bdSMitsuru IWASAKI extern int first_time; 45d50a71bdSMitsuru IWASAKI 46d50a71bdSMitsuru IWASAKI %} 47d50a71bdSMitsuru IWASAKI 48d50a71bdSMitsuru IWASAKI %union { 49d50a71bdSMitsuru IWASAKI char *str; 50d50a71bdSMitsuru IWASAKI bitstr_t bit_decl(evlist, EVENT_MAX); 51d50a71bdSMitsuru IWASAKI int ev; 52d50a71bdSMitsuru IWASAKI struct event_cmd * evcmd; 53719b9dc1SNick Sayer int i; 54d50a71bdSMitsuru IWASAKI } 55d50a71bdSMitsuru IWASAKI 56d50a71bdSMitsuru IWASAKI %token BEGINBLOCK ENDBLOCK 57d50a71bdSMitsuru IWASAKI %token COMMA SEMICOLON 58d50a71bdSMitsuru IWASAKI %token APMEVENT 59719b9dc1SNick Sayer %token APMBATT 60719b9dc1SNick Sayer %token BATTCHARGE BATTDISCHARGE 61c7012f4aSMaxim Konovalov %token <i> BATTTIME BATTPERCENT 62d50a71bdSMitsuru IWASAKI %token EXECCMD REJECTCMD 63d50a71bdSMitsuru IWASAKI %token <ev> EVENT 64d50a71bdSMitsuru IWASAKI %token <str> STRING UNKNOWN 65d50a71bdSMitsuru IWASAKI 66719b9dc1SNick Sayer %type <i> apm_battery_level 67719b9dc1SNick Sayer %type <i> apm_battery_direction 68d50a71bdSMitsuru IWASAKI %type <str> string 69d50a71bdSMitsuru IWASAKI %type <str> unknown 70d50a71bdSMitsuru IWASAKI %type <evlist> event_list 71d50a71bdSMitsuru IWASAKI %type <evcmd> cmd_list 72d50a71bdSMitsuru IWASAKI %type <evcmd> cmd 73d50a71bdSMitsuru IWASAKI %type <evcmd> exec_cmd reject_cmd 74d50a71bdSMitsuru IWASAKI 75d50a71bdSMitsuru IWASAKI %% 76d50a71bdSMitsuru IWASAKI 77d50a71bdSMitsuru IWASAKI config_file 78d50a71bdSMitsuru IWASAKI : { first_time = 1; } config_list 79d50a71bdSMitsuru IWASAKI ; 80d50a71bdSMitsuru IWASAKI 81d50a71bdSMitsuru IWASAKI config_list 82d50a71bdSMitsuru IWASAKI : config 83d50a71bdSMitsuru IWASAKI | config_list config 84d50a71bdSMitsuru IWASAKI ; 85d50a71bdSMitsuru IWASAKI 86d50a71bdSMitsuru IWASAKI config 87d50a71bdSMitsuru IWASAKI : apm_event_statement 88719b9dc1SNick Sayer | apm_battery_statement 89d50a71bdSMitsuru IWASAKI ; 90d50a71bdSMitsuru IWASAKI 91d50a71bdSMitsuru IWASAKI apm_event_statement 92d50a71bdSMitsuru IWASAKI : APMEVENT event_list BEGINBLOCK cmd_list ENDBLOCK 93d50a71bdSMitsuru IWASAKI { 94d50a71bdSMitsuru IWASAKI if (register_apm_event_handlers($2, $4) < 0) 95d50a71bdSMitsuru IWASAKI abort(); /* XXX */ 96d50a71bdSMitsuru IWASAKI free_event_cmd_list($4); 97d50a71bdSMitsuru IWASAKI } 98d50a71bdSMitsuru IWASAKI ; 99d50a71bdSMitsuru IWASAKI 100719b9dc1SNick Sayer apm_battery_level 101719b9dc1SNick Sayer : BATTPERCENT 102719b9dc1SNick Sayer { 103719b9dc1SNick Sayer $$ = $1; 104719b9dc1SNick Sayer } 105719b9dc1SNick Sayer | BATTTIME 106719b9dc1SNick Sayer { 107719b9dc1SNick Sayer $$ = $1; 108719b9dc1SNick Sayer } 109719b9dc1SNick Sayer ; 110719b9dc1SNick Sayer 111719b9dc1SNick Sayer apm_battery_direction 112719b9dc1SNick Sayer : BATTCHARGE 113719b9dc1SNick Sayer { 114719b9dc1SNick Sayer $$ = 1; 115719b9dc1SNick Sayer } 116719b9dc1SNick Sayer | BATTDISCHARGE 117719b9dc1SNick Sayer { 118719b9dc1SNick Sayer $$ = -1; 119719b9dc1SNick Sayer } 120719b9dc1SNick Sayer ; 121719b9dc1SNick Sayer apm_battery_statement 122719b9dc1SNick Sayer : APMBATT apm_battery_level apm_battery_direction 123719b9dc1SNick Sayer BEGINBLOCK cmd_list ENDBLOCK 124719b9dc1SNick Sayer { 125719b9dc1SNick Sayer if (register_battery_handlers($2, $3, $5) < 0) 126719b9dc1SNick Sayer abort(); /* XXX */ 127719b9dc1SNick Sayer free_event_cmd_list($5); 128719b9dc1SNick Sayer } 129719b9dc1SNick Sayer ; 130719b9dc1SNick Sayer 131d50a71bdSMitsuru IWASAKI event_list 132d50a71bdSMitsuru IWASAKI : EVENT 133d50a71bdSMitsuru IWASAKI { 134d50a71bdSMitsuru IWASAKI bit_nclear($$, 0, EVENT_MAX - 1); 135d50a71bdSMitsuru IWASAKI bit_set($$, $1); 136d50a71bdSMitsuru IWASAKI } 137d50a71bdSMitsuru IWASAKI | event_list COMMA EVENT 138d50a71bdSMitsuru IWASAKI { 139d50a71bdSMitsuru IWASAKI memcpy(&($$), &($1), bitstr_size(EVENT_MAX)); 140d50a71bdSMitsuru IWASAKI bit_set($$, $3); 141d50a71bdSMitsuru IWASAKI } 142d50a71bdSMitsuru IWASAKI ; 143d50a71bdSMitsuru IWASAKI 144d50a71bdSMitsuru IWASAKI cmd_list 145d50a71bdSMitsuru IWASAKI : /* empty */ 146d50a71bdSMitsuru IWASAKI { 147d50a71bdSMitsuru IWASAKI $$ = NULL; 148d50a71bdSMitsuru IWASAKI } 149d50a71bdSMitsuru IWASAKI | cmd_list cmd 150d50a71bdSMitsuru IWASAKI { 151d50a71bdSMitsuru IWASAKI struct event_cmd * p = $1; 152d50a71bdSMitsuru IWASAKI if (p) { 153d50a71bdSMitsuru IWASAKI while (p->next != NULL) 154d50a71bdSMitsuru IWASAKI p = p->next; 155d50a71bdSMitsuru IWASAKI p->next = $2; 156d50a71bdSMitsuru IWASAKI $$ = $1; 157d50a71bdSMitsuru IWASAKI } else { 158d50a71bdSMitsuru IWASAKI $$ = $2; 159d50a71bdSMitsuru IWASAKI } 160d50a71bdSMitsuru IWASAKI } 161d50a71bdSMitsuru IWASAKI ; 162d50a71bdSMitsuru IWASAKI 163d50a71bdSMitsuru IWASAKI cmd 164d50a71bdSMitsuru IWASAKI : exec_cmd SEMICOLON { $$ = $1; } 165d50a71bdSMitsuru IWASAKI | reject_cmd SEMICOLON { $$ = $1; } 166d50a71bdSMitsuru IWASAKI ; 167d50a71bdSMitsuru IWASAKI 168d50a71bdSMitsuru IWASAKI exec_cmd 169d50a71bdSMitsuru IWASAKI : EXECCMD string 170d50a71bdSMitsuru IWASAKI { 171d50a71bdSMitsuru IWASAKI size_t len = sizeof (struct event_cmd_exec); 172d50a71bdSMitsuru IWASAKI struct event_cmd_exec *cmd = malloc(len); 173d50a71bdSMitsuru IWASAKI cmd->evcmd.next = NULL; 174d50a71bdSMitsuru IWASAKI cmd->evcmd.len = len; 175d50a71bdSMitsuru IWASAKI cmd->evcmd.name = "exec"; 176d50a71bdSMitsuru IWASAKI cmd->evcmd.op = &event_cmd_exec_ops; 177d50a71bdSMitsuru IWASAKI cmd->line = $2; 178d50a71bdSMitsuru IWASAKI $$ = (struct event_cmd *) cmd; 179d50a71bdSMitsuru IWASAKI } 180d50a71bdSMitsuru IWASAKI ; 181d50a71bdSMitsuru IWASAKI 182d50a71bdSMitsuru IWASAKI reject_cmd 183d50a71bdSMitsuru IWASAKI : REJECTCMD 184d50a71bdSMitsuru IWASAKI { 185d50a71bdSMitsuru IWASAKI size_t len = sizeof (struct event_cmd_reject); 186d50a71bdSMitsuru IWASAKI struct event_cmd_reject *cmd = malloc(len); 187d50a71bdSMitsuru IWASAKI cmd->evcmd.next = NULL; 188d50a71bdSMitsuru IWASAKI cmd->evcmd.len = len; 189d50a71bdSMitsuru IWASAKI cmd->evcmd.name = "reject"; 190d50a71bdSMitsuru IWASAKI cmd->evcmd.op = &event_cmd_reject_ops; 191d50a71bdSMitsuru IWASAKI $$ = (struct event_cmd *) cmd; 192d50a71bdSMitsuru IWASAKI } 193d50a71bdSMitsuru IWASAKI ; 194d50a71bdSMitsuru IWASAKI 195d50a71bdSMitsuru IWASAKI string 196d50a71bdSMitsuru IWASAKI : STRING { $$ = $1; } 197d50a71bdSMitsuru IWASAKI ; 198d50a71bdSMitsuru IWASAKI 199d50a71bdSMitsuru IWASAKI unknown 200d50a71bdSMitsuru IWASAKI : UNKNOWN 201d50a71bdSMitsuru IWASAKI { 202d50a71bdSMitsuru IWASAKI $$ = $1; 203d50a71bdSMitsuru IWASAKI } 204d50a71bdSMitsuru IWASAKI ; 205d50a71bdSMitsuru IWASAKI %% 206d50a71bdSMitsuru IWASAKI 207