xref: /inferno-os/appl/lib/wait.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Wait;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsyth#
4*37da2899SCharles.Forsyth# Copyright © 2003 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 "wait.m";
11*37da2899SCharles.Forsyth
12*37da2899SCharles.Forsythinit()
13*37da2899SCharles.Forsyth{
14*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
15*37da2899SCharles.Forsyth}
16*37da2899SCharles.Forsyth
17*37da2899SCharles.Forsythread(fd: ref Sys->FD): (int, string, string)
18*37da2899SCharles.Forsyth{
19*37da2899SCharles.Forsyth	buf := array[2*Sys->WAITLEN] of byte;
20*37da2899SCharles.Forsyth	n := sys->read(fd, buf, len buf);
21*37da2899SCharles.Forsyth	if(n <= 0)
22*37da2899SCharles.Forsyth		return (n, nil, sys->sprint("%r"));
23*37da2899SCharles.Forsyth	return parse(string buf[0:n]);
24*37da2899SCharles.Forsyth}
25*37da2899SCharles.Forsyth
26*37da2899SCharles.Forsythmonitor(fd: ref Sys->FD): (int, chan of (int, string, string))
27*37da2899SCharles.Forsyth{
28*37da2899SCharles.Forsyth	pid := chan of int;
29*37da2899SCharles.Forsyth	out := chan of (int, string, string);
30*37da2899SCharles.Forsyth	spawn waitreader(fd, pid, out);
31*37da2899SCharles.Forsyth	return (<-pid, out);
32*37da2899SCharles.Forsyth}
33*37da2899SCharles.Forsyth
34*37da2899SCharles.Forsythwaitreader(fd: ref Sys->FD, pid: chan of int, out: chan of (int, string, string))
35*37da2899SCharles.Forsyth{
36*37da2899SCharles.Forsyth	pid <-= sys->pctl(0, nil);
37*37da2899SCharles.Forsyth	for(;;){
38*37da2899SCharles.Forsyth		(child, modname, status) := read(fd);
39*37da2899SCharles.Forsyth		out <-= (child, modname, status);
40*37da2899SCharles.Forsyth		if(child <= 0)
41*37da2899SCharles.Forsyth			break;	# exit on error
42*37da2899SCharles.Forsyth	}
43*37da2899SCharles.Forsyth}
44*37da2899SCharles.Forsyth
45*37da2899SCharles.Forsythparse(status: string): (int, string, string)
46*37da2899SCharles.Forsyth{
47*37da2899SCharles.Forsyth	for (i := 0; i < len status; i++)
48*37da2899SCharles.Forsyth		if (status[i] == ' ')
49*37da2899SCharles.Forsyth			break;
50*37da2899SCharles.Forsyth	j := i+2;	# skip space and "
51*37da2899SCharles.Forsyth	for (i = j; i < len status; i++)
52*37da2899SCharles.Forsyth		if (status[i] == '"')
53*37da2899SCharles.Forsyth			break;
54*37da2899SCharles.Forsyth	return (int status, status[j:i], status[i+2:]);
55*37da2899SCharles.Forsyth}
56