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