summaryrefslogtreecommitdiff
path: root/appl/lib/chanfill.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/lib/chanfill.b')
-rw-r--r--appl/lib/chanfill.b56
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;
+ }
+ }
+}