diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
| commit | 37da2899f40661e3e9631e497da8dc59b971cbd0 (patch) | |
| tree | cbc6d4680e347d906f5fa7fca73214418741df72 /appl/lib/powerman.b | |
| parent | 54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff) | |
20060303a
Diffstat (limited to 'appl/lib/powerman.b')
| -rw-r--r-- | appl/lib/powerman.b | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/appl/lib/powerman.b b/appl/lib/powerman.b new file mode 100644 index 00000000..5b343726 --- /dev/null +++ b/appl/lib/powerman.b @@ -0,0 +1,59 @@ +implement Powerman; + +# +# Copyright © 2001 Vita Nuova Holdings Limited. All rights reserved. +# + +include "sys.m"; + sys: Sys; + +include "powerman.m"; + +pid := 0; + +init(file: string, events: chan of string): int +{ + if(file == nil) + file = "/dev/powerdata"; + fd := sys->open(file, Sys->OREAD); + if(fd == nil) + return -1; + pidc := chan of int; + spawn reader(fd, events, pidc); + return pid = <-pidc; +} + +reader(fd: ref Sys->FD, events: chan of string, pidc: chan of int) +{ + pidc <-= sys->pctl(0, nil); + buf := array[128] of byte; + while((n := sys->read(fd, buf, len buf)) > 0){ + if(buf[n-1] == byte '\n') + n--; + events <-= string buf[0:n]; + } + events <-= "error"; +} + +stop() +{ + if(pid != 0){ + fd := sys->open("#p/"+string pid+"/ctl", Sys->OWRITE); + if(fd != nil) + sys->fprint(fd, "kill"); + pid = 0; + } +} + +ack(op: string) +{ + ctl("ack "+op); +} + +ctl(op: string): string +{ + fd := sys->open("/dev/powerctl", Sys->OWRITE); + if(fd != nil && sys->fprint(fd, "%s", op) >= 0) + return nil; + return sys->sprint("%r"); +} |
