summaryrefslogtreecommitdiff
path: root/appl/lib/styxconv/ostyx.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/lib/styxconv/ostyx.b')
-rw-r--r--appl/lib/styxconv/ostyx.b87
1 files changed, 62 insertions, 25 deletions
diff --git a/appl/lib/styxconv/ostyx.b b/appl/lib/styxconv/ostyx.b
index ce8e0d9e..b575a0cb 100644
--- a/appl/lib/styxconv/ostyx.b
+++ b/appl/lib/styxconv/ostyx.b
@@ -13,43 +13,81 @@ DEBUG: con 0;
CHANHASHSIZE: con 32;
+init()
+{
+ sys = load Sys Sys->PATH;
+ gsofar = 0;
+ gdata = array[MAXRPC] of {* => byte 0};
+}
+
+# note that this implementation fails if we're reading OTmsgs and ORmsgs
+# concurrently. luckily we don't need to in styxconv.
gsofar: int;
gdata: array of byte;
-ORmsg.read(fd: ref Sys->FD, msize: int): ref ORmsg
+ORmsg.read(fd: ref Sys->FD): ref ORmsg
{
- if(sys == nil)
- sys = load Sys Sys->PATH;
- if(gdata == nil){
- gsofar = 0;
- gdata = array[msize] of byte;
- }
+ mlen := 0;
+ m: ref ORmsg;
for (;;){
- n := sys->read(fd, gdata[gsofar:], len gdata - gsofar);
- if(n <= 0){
- m: ref ORmsg = nil;
-
- if(n < 0)
- m = ref ORmsg.Error(-1, sys->sprint("%r"));
+ if(gsofar > 0)
+ (mlen, m) = d2rmsg(gdata[0 : gsofar]);
+ if(mlen == 0){
+ if(gsofar == len gdata){
+ ndata := array[MAXRPC] of byte;
+ ndata[0:] = gdata;
+ gdata = ndata;
+ }
+ n := sys->read(fd, gdata[gsofar:], len gdata - gsofar);
+ if(n <= 0)
+ return nil;
+ gsofar += n;
+ }else if(mlen > 0){
+ if(tagof(m) == tagof(OTmsg.Write)) {
+ ndata := array[MAXRPC] of byte;
+ ndata[0:] = gdata[mlen : gsofar];
+ gdata = ndata;
+ }else
+ gdata[0:] = gdata[mlen : gsofar];
+ gsofar -= mlen;
return m;
- }
- gsofar += n;
- (cn, m) := d2rmsg(gdata[0: gsofar]);
- if(cn == -1)
+ }else
gsofar = 0;
- else if(cn > 0){
- if(tagof(m) == tagof(ORmsg.Read)) {
- ndata := array[msize] of byte;
- ndata[0: ] = gdata[cn: gsofar];
+ }
+}
+
+OTmsg.read(fd: ref Sys->FD): ref OTmsg
+{
+ mlen := 0;
+ m: ref OTmsg;
+ for (;;){
+ if(gsofar > 0)
+ (mlen, m) = d2tmsg(gdata[0 : gsofar]);
+ if(mlen == 0){
+ if(gsofar == len gdata){
+ ndata := array[MAXRPC] of byte;
+ ndata[0:] = gdata;
+ gdata = ndata;
+ }
+ n := sys->read(fd, gdata[gsofar:], len gdata - gsofar);
+ if(n <= 0)
+ return nil;
+ gsofar += n;
+ }else if(mlen > 0){
+ if(tagof(m) == tagof(OTmsg.Write)) {
+ ndata := array[MAXRPC] of byte;
+ ndata[0:] = gdata[mlen : gsofar];
gdata = ndata;
}else
- gdata[0: ] = gdata[cn: gsofar];
- gsofar -= cn;
+ gdata[0:] = gdata[mlen : gsofar];
+ gsofar -= mlen;
return m;
- }
+ }else
+ gsofar = 0;
}
}
+
Styxserver.new(fd: ref Sys->FD): (chan of ref OTmsg, ref Styxserver)
{
if (sys == nil)
@@ -572,7 +610,6 @@ pstring(a: array of byte, s: string, n: int): array of byte
# convert from Dir to bytes
convD2M(d: array of byte, f: OSys->Dir): array of byte
{
- n := len d;
d = pstring(d, f.name, OSys->NAMELEN);
d = pstring(d, f.uid, OSys->NAMELEN);
d = pstring(d, f.gid, OSys->NAMELEN);