diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
| commit | 37da2899f40661e3e9631e497da8dc59b971cbd0 (patch) | |
| tree | cbc6d4680e347d906f5fa7fca73214418741df72 /appl/lib/chanfill.b | |
| parent | 54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff) | |
20060303a
Diffstat (limited to 'appl/lib/chanfill.b')
| -rw-r--r-- | appl/lib/chanfill.b | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/appl/lib/chanfill.b b/appl/lib/chanfill.b new file mode 100644 index 00000000..7e7d2685 --- /dev/null +++ b/appl/lib/chanfill.b @@ -0,0 +1,56 @@ +implement ChanFill; + +# +# Iobuf fill routine to serve a file2chan. +# + +include "sys.m"; +include "bufio.m"; + +myfill: BufioFill; +bufio: Bufio; +fid: int; +wc: Sys->Rwrite; +fio: ref Sys->FileIO; + +Iobuf: import bufio; + +init(data: array of byte, f: int, c: Sys->Rwrite, r: ref Sys->FileIO, b: Bufio): ref Iobuf +{ + if (myfill == nil) + myfill = load BufioFill SELF; + bufio = b; + i := bufio->sopen(string data); + fid = f; + wc = c; + fio = r; + i.setfill(myfill); + wc <-= (len data, nil); + return i; +} + +fill(b: ref Iobuf): int +{ + for (;;) { + alt { + (nil, data, f, c) := <-fio.write => + if (f != fid) { + if (c != nil) + c <-= (0, "file busy"); + continue; + } + if (c == nil) + return Bufio->EOF; + c <-= (len data, nil); + i := len data; + if (i == 0) + continue; + b.buffer[b.size:] = data; + b.size += i; + b.filpos += big i; + return i; + * => + return Bufio->EOF; + } + } +} |
