xref: /inferno-os/appl/lib/powerman.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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