diff options
Diffstat (limited to 'os/init/shell.b')
| -rw-r--r-- | os/init/shell.b | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/os/init/shell.b b/os/init/shell.b new file mode 100644 index 00000000..e0b19ec9 --- /dev/null +++ b/os/init/shell.b @@ -0,0 +1,97 @@ +implement InitShell; + +include "sys.m"; +include "draw.m"; + +sys: Sys; + +InitShell: module +{ + init: fn(nil: ref Draw->Context, nil: list of string); +}; + +Sh: module +{ + init: fn(ctxt: ref Draw->Context, argv: list of string); +}; + +init(nil: ref Draw->Context, nil: list of string) +{ + shell := load Sh "/dis/sh.dis"; + + sys = load Sys Sys->PATH; + + if(sys != nil) + sys->print("init: starting shell\n"); + +# sys->bind("#I", "/net", sys->MAFTER); # IP + sys->bind("#p", "/prog", sys->MREPL); # prog device + sys->bind("#d", "/fd", Sys->MREPL); + sys->bind("#i", "/dev", sys->MREPL); # draw device + sys->bind("#t", "/dev", sys->MAFTER); # serial line + sys->bind("#c", "/dev", sys->MAFTER); # console device + sys->bind("#W","/dev",sys->MAFTER); # Flash +# sys->bind("#O", "/dev", sys->MAFTER); # Modem +# sys->bind("#T","/dev",sys->MAFTER); # Touchscreen + + srv(); + + spawn shell->init(nil, nil); +} + +srv() +{ + remotedebug := sysenv("remotedebug"); + if(remotedebug != "1") + return; + + sys->print("srv..."); + if(echoto("#t/eia0ctl", "b38400") < 0) + return; + + fd := sys->open("/dev/eia0", Sys->ORDWR); + if (fd == nil) { + sys->print("eia data open: %r\n"); + return; + } + if (sys->export(fd, "/", Sys->EXPASYNC) < 0) { + sys->print("export: %r\n"); + return; + } + sys->print("ok\n"); +} + +sysenv(param: string): string +{ + fd := sys->open("#c/sysenv", sys->OREAD); + if (fd == nil) + return(nil); + buf := array[4096] of byte; + nb := sys->read(fd, buf, len buf); + (nfl,fl) := sys->tokenize(string buf, "\n"); + while (fl != nil) { + pair := hd fl; + (npl, pl) := sys->tokenize(pair, "="); + if (npl > 1) { + if ((hd pl) == param) + return hd tl pl; + } + fl = tl fl; + } + return nil ; +} + +echoto(fname, str: string): int +{ + fd := sys->open(fname, Sys->OWRITE); + if(fd == nil) { + sys->print("%s: %r\n", fname); + return -1; + } + x := array of byte str; + if(sys->write(fd, x, len x) == -1) { + sys->print("write: %r\n"); + return -1; + } + return 0; +} |
