ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /os/init/geninit.b/
implement Init;
#
# init program for native inferno, generic pc version
#
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;
Init: module
{
init: fn();
};
Shell: module
{
init: fn(ctxt: ref Context, argv: list of string);
};
init()
{
sys = load Sys Sys->PATH;
stdin := sys->fildes(0);
kr = load Keyring Keyring->PATH;
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 console ...\n");
bind("#c", "/dev", sys->MAFTER);
setsysname();
print("Standalone mode\n");
#
# default namespace
#
sys->unmount(nil, "/dev");
bind("#p", "/prog", sys->MREPL); # prog device
sys->bind("#d", "/fd", Sys->MREPL);
bind("#c", "/dev", sys->MBEFORE); # console
bind("#m", "/dev", sys->MAFTER); # mouse setup device
bind("#t", "/dev", sys->MAFTER); # serial device
mouse := load Shell "/dis/mouse.dis";
if (mouse != nil) {
print("Setting up mouse\n");
mouse->init(nil, "/dis/mouse.dis" :: nil);
mouse = nil;
}
# create fake nameserver db that can be written to later
ramfile := load Shell "/dis/ramfile.dis";
if (ramfile != nil) {
ramfile->init(nil, "/dis/ramfile.dis" :: "/services/dns/db" :: "" :: nil);
ramfile = nil;
}
print("Console...\n");
shell := load Shell "/dis/sh.dis";
if(shell == nil) {
print("init: load /dis/sh.dis: %r\n");
exit;
}
print("starting shell\n");
shell->init(nil, "/dis/sh.dis" :: nil);
print("shell exited, bye bye\n");
}
#
# Set system name from nvram
#
setsysname()
{
fds := open("/dev/sysname", sys->OWRITE);
if(fds == nil)
return;
buf := array of byte "genericpc";
sys->write(fds, buf, len buf);
}