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