# # Software from the book "Inferno Programming with Limbo" # published by John Wiley & Sons, January 2003. # # p. Stanley-Marbell # implement StyxServer; include "sys.m"; include "draw.m"; include "arg.m"; include "styx.m"; include "styxlib.m"; sys : Sys; arg : Arg; styx : Styx; styxlib : Styxlib; Styxserver, Rmsg, Tmsg, Dirtab, Chan: import styxlib; mntflg := Sys->MREPL; mntpt := "/n/remote/"; Qpath : con 1; Qvers : con 0; dirtab := array [] of { Dirtab("dynamic.dis", (Qpath, Qvers), big 0, 8r755) }; StyxServer : module { init : fn(nil : ref Draw->Context, args : list of string); }; init(nil : ref Draw->Context, args : list of string) { sys = load Sys Sys->PATH; styxlib = load Styxlib Styxlib->PATH; styx = load Styx Styx->PATH; arg = load Arg Arg->PATH; arg->init(args); while((c := arg->opt()) != 0) { case c { 'b' => mntflg = Sys->MBEFORE; 'a' => mntflg = Sys->MAFTER; 'r' => mntflg = Sys->MREPL; 'c' => mntflg |= Sys->MCREATE; * => { sys->print("Usage : styxserver [-rabc] \n"); exit; } } } args = arg->argv(); if (len args != 1) { sys->print("Usage : styxserver [-rabc] \n"); exit; } mntpt = hd args; styxpipe := array [2] of ref Sys->FD; sys->pipe(styxpipe); (tmsgchan, srv) := Styxserver.new(styxpipe[0]); sync := chan of int; spawn server(tmsgchan, srv, sync); <-sync; if (sys->mount(styxpipe[1], mntpt, mntflg, nil) < 0) { sys->raise(sys->sprint("fail:StyxServer mount failed : %r")); } } server(tmsgchan : chan of ref Styxlib->Tmsg, srv : ref Styxserver, sync : chan of int) { devgen := styxlib->dirgenmodule(); sync <-= 0; while () { msg := <-tmsgchan; if (msg == nil) { exit; } pick m := msg { Readerror => sys->raise(sys->sprint( "fail:Styxserver error reading Styx pipe : %r")); Nop => srv.reply(ref Rmsg.Nop(m.tag)); Attach => srv.devattach(m); Clone => srv.devclone(m); Clunk => srv.devclunk(m); Create => srv.reply(ref Rmsg.Error(m.tag, Styxlib->Eperm)); Flush => srv.devflush(m); Open => srv.devopen(m, devgen, dirtab); Read => { c := srv.fidtochan(m.fid); if (c == nil) { srv.reply(ref Rmsg.Error(m.tag, Styxlib->Eperm)); break; } if (c.isdir()) { srv.devdirread(m, devgen, dirtab); break; } srv.reply(ref Rmsg.Error(m.tag, Styxlib->Eperm)); } Remove => srv.reply(ref Rmsg.Error(m.tag, Styxlib->Eperm)); Stat => srv.devstat(m, devgen, dirtab); Walk => srv.devwalk(m, devgen, dirtab); Write => srv.reply(ref Rmsg.Error(m.tag, Styxlib->Eperm)); Wstat => srv.reply(ref Rmsg.Error(m.tag, Styxlib->Eperm)); } } }