improve program/library loading

This commit is contained in:
Lisa Milne 2023-11-29 18:45:39 +10:00
parent d0a2029b87
commit f63b61ee48

View file

@ -1,9 +1,15 @@
var clite = {
state:{
version:'0.3-3',
version:'0.3-4',
isinit:false,
runlevel:1
},
includes:{
// a list of program/command files to load
prog:['commands.js','shell.js'],
// a list of library files to load
libs:['libclite.js','libcurses.js','libstd.js','libstdio.js','libterm.js']
},
core:{
execSafe:function(f) {
try{
@ -288,6 +294,86 @@ cat /etc/greeting
n.perms = '-rwxr-xr-x';
}
function loadCommands(nextfn) {
clite.commands = {
data:null,
load:function(name,fn) {
vfsapi.mkFile(0,'/bin/'+name);
var f = vfsapi.getNode(0,'/bin/'+name);
if (!f)
return;
f.perms = '-rwxr-xr-x';
f.data.content = fn;
vfsapi.mkFile(0,'/usr/src/'+name+'.js');
f = vfsapi.getNode(0,'/usr/src/'+name+'.js');
if (!f)
return;
f.perms = '-rw-rw-r--';
f.data.content = 'function main'+fn.toString().substring(8);
}
}
var index = 0;
function cb() {
if (clite.commands.data)
clite.core.execSafe(clite.commands.data);
clite.commands.data = null;
if (index >= clite.includes.prog.length) {
clite.commands = null;
clite.core.execSafeAsync(nextfn);
return;
}
var f = clite.includes.prog[index];
index++;
clite.core.load.script('clite/'+f,cb);
}
cb();
}
function loadLibs(nextfn) {
clite.libs = {
index:[],
data:null,
load:function(name,header,fn) {
vfsapi.mkFile(0,'/lib/'+name+'.so');
var f = vfsapi.getNode(0,'/lib/'+name+'.so');
if (!f)
return;
f.perms = '-rw-r--r--';
f.data.content = fn;
vfsapi.mkFile(0,'/usr/src/libs/'+name+'.js');
f = vfsapi.getNode(0,'/usr/src/libs/'+name+'.js');
if (!f)
return;
f.perms = '-rw-rw-r--';
f.data.content = 'function init'+fn.toString().substring(8);
clite.libs.index.push({header:header,file:name});
}
}
var index = 0;
function cb() {
if (clite.libs.data)
clite.core.execSafe(clite.libs.data);
clite.libs.data = null;
if (index >= clite.includes.libs.length) {
clite.libs.load = null;
clite.core.execSafeAsync(nextfn);
return;
}
var f = clite.includes.libs[index];
index++;
clite.core.load.script('clite/'+f,cb);
}
cb();
}
function init1() {
clite.log.write('CLIte Version '+clite.state.version);
// setup vfs
@ -367,80 +453,13 @@ readme.txt:/usr/clite/readme:0:0:-rw-r--r--`;
defaultDevices();
// populate /bin
clite.log.write('Populating /bin');
// create a temporary function to load in commands
clite.commands = {
data:null,
load:function(name,fn) {
vfsapi.mkFile(0,'/bin/'+name);
var f = vfsapi.getNode(0,'/bin/'+name);
if (!f)
return;
f.perms = '-rwxr-xr-x';
f.data.content = fn;
vfsapi.mkFile(0,'/usr/src/'+name+'.js');
f = vfsapi.getNode(0,'/usr/src/'+name+'.js');
if (!f)
return;
f.perms = '-rw-rw-r--';
f.data.content = 'function main'+fn.toString().substring(8);
}
}
clite.core.load.script('clite/commands.js',init3);
loadCommands(init3);
}
function init3(data) {
clite.core.execSafe(clite.commands.data);
clite.core.load.script('clite/shell.js',init4);
}
function init4(data) {
clite.core.execSafe(clite.commands.data);
clite.commands = null;
function init3() {
clite.log.write('Populating /lib');
clite.libs = {
index:[],
data:null,
load:function(name,header,fn) {
vfsapi.mkFile(0,'/lib/'+name+'.so');
var f = vfsapi.getNode(0,'/lib/'+name+'.so');
if (!f)
return;
f.perms = '-rw-r--r--';
f.data.content = fn;
vfsapi.mkFile(0,'/usr/src/libs/'+name+'.js');
f = vfsapi.getNode(0,'/usr/src/libs/'+name+'.js');
if (!f)
return;
f.perms = '-rw-rw-r--';
f.data.content = 'function init'+fn.toString().substring(8);
clite.libs.index.push({header:header,file:name});
}
}
clite.core.load.script('clite/libstd.js',init5);
loadLibs(init4);
}
function init5(data) {
clite.core.execSafe(clite.libs.data);
clite.core.load.script('clite/libclite.js',init6);
}
function init6(data) {
clite.core.execSafe(clite.libs.data);
clite.core.load.script('clite/libstdio.js',init7);
}
function init7(data) {
clite.core.execSafe(clite.libs.data);
clite.core.load.script('clite/libterm.js',init8);
}
function init8(data) {
clite.core.execSafe(clite.libs.data);
clite.core.load.script('clite/libcurses.js',init9);
}
function init9(data) {
clite.core.execSafe(clite.libs.data);
clite.libs.data = null;
clite.libs.load = null;
function init4() {
clite.log.write('Bringing up the process manager');
if (!clite.proc.init(vfsapi)) {
clite.log.write('failed');
@ -471,10 +490,10 @@ readme.txt:/usr/clite/readme:0:0:-rw-r--r--`;
exit:null, // filled in by fork()
include:null, // filled in by fork()
};
var pid = clite.lib.fork(env,io,init10);
var pid = clite.lib.fork(env,io,init5);
}
}
function init10(env,io) {
function init5(env,io) {
clite.proc.setLogin(io.pid,1);
clite.lib.exec('/bin/sh',['sh'],env,io);
}