1implement Powerman; 2 3# 4# Copyright © 2001 Vita Nuova Holdings Limited. All rights reserved. 5# 6 7include "sys.m"; 8 sys: Sys; 9 10include "powerman.m"; 11 12pid := 0; 13 14init(file: string, events: chan of string): int 15{ 16 if(file == nil) 17 file = "/dev/powerdata"; 18 fd := sys->open(file, Sys->OREAD); 19 if(fd == nil) 20 return -1; 21 pidc := chan of int; 22 spawn reader(fd, events, pidc); 23 return pid = <-pidc; 24} 25 26reader(fd: ref Sys->FD, events: chan of string, pidc: chan of int) 27{ 28 pidc <-= sys->pctl(0, nil); 29 buf := array[128] of byte; 30 while((n := sys->read(fd, buf, len buf)) > 0){ 31 if(buf[n-1] == byte '\n') 32 n--; 33 events <-= string buf[0:n]; 34 } 35 events <-= "error"; 36} 37 38stop() 39{ 40 if(pid != 0){ 41 fd := sys->open("#p/"+string pid+"/ctl", Sys->OWRITE); 42 if(fd != nil) 43 sys->fprint(fd, "kill"); 44 pid = 0; 45 } 46} 47 48ack(op: string) 49{ 50 ctl("ack "+op); 51} 52 53ctl(op: string): string 54{ 55 fd := sys->open("/dev/powerctl", Sys->OWRITE); 56 if(fd != nil && sys->fprint(fd, "%s", op) >= 0) 57 return nil; 58 return sys->sprint("%r"); 59} 60