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