xref: /inferno-os/appl/lib/chanfill.b (revision 6e425a9de8c003b5a733621a6b6730ec3cc902b8)
1implement ChanFill;
2
3#
4#	Iobuf fill routine to serve a file2chan.
5#
6
7include	"sys.m";
8include	"bufio.m";
9
10myfill:	BufioFill;
11bufio:	Bufio;
12fid:	int;
13wc:	Sys->Rwrite;
14fio:	ref Sys->FileIO;
15
16Iobuf:	import bufio;
17
18init(data: array of byte, f: int, c: Sys->Rwrite, r: ref Sys->FileIO, b: Bufio): ref Iobuf
19{
20	if (myfill == nil)
21		myfill = load BufioFill SELF;
22	bufio = b;
23	i := bufio->sopen(string data);
24	fid = f;
25	wc = c;
26	fio = r;
27	i.setfill(myfill);
28	wc <-= (len data, nil);
29	return i;
30}
31
32fill(b: ref Iobuf): int
33{
34	for (;;) {
35		(nil, data, f, c) := <-fio.write;
36		if (f != fid) {
37			if (c != nil)
38				c <-= (0, "file busy");
39			continue;
40		}
41		if (c == nil)
42			return Bufio->EOF;
43		c <-= (len data, nil);
44		i := len data;
45		if (i == 0)
46			continue;
47		b.buffer[b.size:] = data;
48		b.size += i;
49		b.filpos += big i;
50		return i;
51	}
52}
53