diff --git a/clite/core.js b/clite/core.js index 4092cff..185bcc6 100644 --- a/clite/core.js +++ b/clite/core.js @@ -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); }