summaryrefslogtreecommitdiff
path: root/os/init/reminit.b
diff options
context:
space:
mode:
Diffstat (limited to 'os/init/reminit.b')
-rw-r--r--os/init/reminit.b239
1 files changed, 239 insertions, 0 deletions
diff --git a/os/init/reminit.b b/os/init/reminit.b
new file mode 100644
index 00000000..b87ff996
--- /dev/null
+++ b/os/init/reminit.b
@@ -0,0 +1,239 @@
+implement Init;
+#
+# init program for standalone remote pc kernel - for benchmarking
+#
+include "sys.m";
+sys: Sys;
+FD, Connection, sprint, Dir: import sys;
+print, fprint, open, bind, mount, dial, sleep, read, chdir: import sys;
+
+include "draw.m";
+draw: Draw;
+Context: import draw;
+
+include "keyring.m";
+kr: Keyring;
+
+include "security.m";
+auth: Auth;
+
+Init: module
+{
+ init: fn();
+};
+
+Shell: module
+{
+ init: fn(ctxt: ref Context, argv: list of string);
+};
+
+remotefs(server: string): int
+{
+ ok, n: int;
+ c: Connection;
+
+ (ok, c) = dial("tcp!" + server + "!6666", nil);
+ if(ok < 0)
+ return -1;
+
+ sys->print("Connected ...\n");
+ if(kr != nil){
+ err: string;
+ sys->print("Authenticate ...");
+ ai := kr->readauthinfo("/nvfs/default");
+ if(ai == nil){
+ sys->print("readauthinfo /nvfs/default failed: %r\n");
+ sys->print("trying mount as `nobody'\n");
+ }
+ (c.dfd, err) = auth->client("none", ai, c.dfd);
+ if(c.dfd == nil){
+ sys->print("authentication failed: %s\n", err);
+ return -1;
+ }
+ }
+
+ sys->print("mount ...\n");
+
+ c.cfd = nil;
+ n = mount(c.dfd, "/n/remote", sys->MREPL, "");
+ if(n > 0)
+ return 0;
+ return -1;
+}
+
+Bootpreadlen: con 128;
+
+bootp(): string
+{
+#
+# BUG: if bootp fails, can't then use "add ether" correctly
+#
+ fd := open("/net/ipifc", sys->OWRITE);
+ if(fd == nil) {
+ print("init: open /net/ipifc: %r");
+ return nil;
+ }
+ fprint(fd, "bootp /net/ether0");
+
+ fd = open("/net/bootp", sys->OREAD);
+ if(fd == nil) {
+ print("init: open /net/bootp: %r\n");
+ return nil;
+ }
+
+ buf := array[Bootpreadlen] of byte;
+ nr := read(fd, buf, len buf);
+ fd = nil;
+ if(nr > 0) {
+ (ntok, ls) := sys->tokenize(string buf, " \t\n");
+ while(ls != nil) {
+ if(hd ls == "fsip") {
+ ls = tl ls;
+ break;
+ }
+ ls = tl ls;
+ }
+ srv : string;
+ if(ls == nil || ((srv = hd ls) == "0.0.0.0")) {
+ print("init: server address not in bootp read\n");
+ return nil;
+ }
+ return srv;
+ }
+ return nil;
+}
+
+init()
+{
+
+ sys = load Sys Sys->PATH;
+ stdin := sys->fildes(0);
+ kr = load Keyring Keyring->PATH;
+ auth = load Auth Auth->PATH;
+ if(auth != nil)
+ auth->init();
+
+ sys->print("**\n** Inferno\n** Vita Nuova\n**\n");
+
+ sys->print("Setup boot net services ...\n");
+
+ #
+ # Setup what we need to call a server and
+ # Authenticate
+ #
+ sys->print("Bind ethernet ...\n");
+ bind("#l", "/net", sys->MREPL);
+ sys->print("Bind IP ...\n");
+ bind("#I", "/net", sys->MAFTER);
+ sys->print("Bind console ...\n");
+ bind("#c", "/dev", sys->MAFTER);
+
+ setsysname();
+ if (1) {
+ print("bootp ...\n");
+ srv := bootp();
+ if (srv != nil)
+ if (remotefs(srv) < 0)
+ print("No remote filesystem\n");
+ else {
+ print("Remote filesystem mounted\n");
+ bind("/n/remote/dis", "/dis", sys->MBEFORE);
+ bind("/n/remote/dis/lib", "/dis/lib", sys->MBEFORE);
+ }
+ } else {
+ print("Standalone mode\n");
+ fd := open("/net/ipifc", sys->OWRITE);
+ if(fd == nil) {
+ print("init: open /net/ipifc: %r");
+ exit;
+ }
+ fprint(fd, "add ether /net/ether0 %s %s", "200.1.1.60", "255.255.255.0");
+ fd = nil;
+ }
+ #
+ # default namespace
+ #
+ sys->unmount(nil, "/dev");
+ bind("#c", "/dev", sys->MBEFORE); # console
+ bind("#l", "/net", sys->MBEFORE); # ethernet
+ bind("#I", "/net", sys->MBEFORE); # TCP/IP
+ bind("#p", "/prog", sys->MREPL); # prog device
+ sys->bind("#d", "/fd", Sys->MREPL);
+
+ bind("#T", "/dev", sys->MBEFORE); # kprof device
+ bind("#x", "/dev", sys->MBEFORE); # bench device
+
+ print("clock...\n");
+ setclock();
+
+ print("Server...\n");
+ dc: ref Context;
+ cs := load Shell "/dis/ndb/cs.dis";
+ if(cs == nil)
+ print("Server not loaded\n");
+ else
+ cs->init(dc, "cs" :: nil);
+ server := load Shell "/dis/lib/srv.dis";
+ if(server == nil)
+ print("Server not loaded\n");
+ else {
+# server->init(dc, "srv" :: nil);
+ }
+
+ print("Console...\n");
+sys->chdir("/n/remote/usr/john/appl/bench");
+ shell := load Shell "/dis/sh.dis";
+ if(shell == nil) {
+ print("init: load /dis/sh.dis: %r");
+ exit;
+ }
+ shell->init(dc, nil);
+}
+
+setclock()
+{
+ (ok, dir) := sys->stat("/");
+ if (ok < 0) {
+ print("init: stat /: %r");
+ return;
+ }
+
+ fd := sys->open("/dev/time", sys->OWRITE);
+ if (fd == nil) {
+ print("init: open /dev/time: %r");
+ return;
+ }
+
+ # Time is kept as microsecs, atime is in secs
+ b := array of byte sprint("%d000000", dir.atime);
+ if (sys->write(fd, b, len b) != len b)
+ print("init: write /dev/time: %r");
+}
+
+#
+# Set system name from nvram
+#
+setsysname()
+{
+ fd := open("/nvfs/ID", sys->OREAD);
+ if(fd == nil)
+ return;
+ fds := open("/dev/sysname", sys->OWRITE);
+ if(fds == nil)
+ return;
+ buf := array[128] of byte;
+ nr := sys->read(fd, buf, len buf);
+ if(nr <= 0)
+ return;
+ sys->write(fds, buf, nr);
+}
+
+readline(fd: ref Sys->FD): string
+{
+ l := array [128] of byte;
+ nb := sys->read(fd, l, len l);
+ if(nb <= 1)
+ return "";
+ return string l[0:nb-1];
+}
+