diff --git a/clite/bios.js b/clite/bios.js index 6986789..346a612 100644 --- a/clite/bios.js +++ b/clite/bios.js @@ -47,8 +47,8 @@ var bios = { }, file:function(name,callback) { if (window.location.protocol == 'file:') { // this is a dirty hack and I hate it, just let me open a file: path! - clite.term.setCustom({type:'file',callback:callback}); - clite.term.writeLine('open file: '+name); + //clite.term.setCustom({type:'file',callback:callback}); + //clite.term.writeLine('open file: '+name); return; } diff --git a/clite/commands.js b/clite/commands.js index 3927f00..ae9ed17 100644 --- a/clite/commands.js +++ b/clite/commands.js @@ -38,6 +38,7 @@ clite.commands.load('ls',function(args,env,io) { var long = false; var all = false; var access = false; + var one = false; var stdlib = io.include('stdlib'); var stdio = io.include('stdio'); var time = io.include('time'); @@ -52,6 +53,7 @@ Options: -l Display data in long format -u Display access time in long format -a Do not ignore entries starting with . +-1 Display one entry per line `); } @@ -83,12 +85,14 @@ Options: var lp = stdio.readAll(fd); if (!lp) lp = '?'; - stdio.printf('%s%16s%16s%14s%16s -> %s\n',st.perms,uname,gname,d,st.name,lp); + stdio.printf('%s%12s%12s%14s%12s -> %s\n',st.perms,uname,gname,d,st.name,lp); }else{ - stdio.printf('%s%16s%16s%14s%16s\n',st.perms,uname,gname,d,st.name); + stdio.printf('%s%12s%12s%14s%12s\n',st.perms,uname,gname,d,st.name); } + }else if (one) { + stdio.printf('%s\n',st.name); }else{ - stdio.printf(st.name); + stdio.printf('%s ',st.name); } } @@ -109,6 +113,9 @@ Options: case 'a': all = true; break; + case '1': + one = true; + break; default: stdio.write(io.stderr,'unknown argument: -'+args[i][j]); } @@ -159,6 +166,8 @@ Options: stdio.close(efd); } stdio.close(fd); + if (!one && !long) + stdio.write(io.stdout,'\n'); }); return 0; diff --git a/clite/core.js b/clite/core.js index 395d707..e9a5756 100644 --- a/clite/core.js +++ b/clite/core.js @@ -41,31 +41,6 @@ var clite = { } return true; }, - load:{ - script:function(name,callback) { - var head = document.getElementsByTagName('head')[0]; - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.src = name+'?d='+(new Date).getTime(); - script.onload = callback; - head.appendChild(script); - }, - file:function(name,callback) { - if (window.location.protocol == 'file:') { // this is a dirty hack and I hate it, just let me open a file: path! - //clite.term.setCustom({type:'file',callback:callback}); - //clite.term.writeLine('open file: '+name); - return; - } - - fetch(name+'?d='+(new Date).getTime()) - .then(function(response) { - return response.text(); - }) - .then(function(data) { - callback(data); - }); - } - }, download:function(name,data) { var link = document.createElement("a"); link.target = '_blank'; @@ -79,22 +54,24 @@ var clite = { }, reboot:function() { clite.log.write('The system is rebooting'); - setTimeout(function() { - clite.term.ttyctrl('hide'); - clite.log.write('Bringing down the system'); - var l = clite.core.load.script; - var s = Array.from(document.getElementsByTagName('src')); - s.forEach(function(el,i) { - el.parentNode.removeChild(el); - }); - clite.log.write('Resetting system core'); - delete clite; - clite = null; - l('clite/core.js',function() {setTimeout('clite.init();',500)}); - },10); + // TODO: this all needs redoing with bios calls + //setTimeout(function() { + //clite.term.ttyctrl('hide'); + //clite.log.write('Bringing down the system'); + //var l = clite.core.load.script; + //var s = Array.from(document.getElementsByTagName('src')); + //s.forEach(function(el,i) { + //el.parentNode.removeChild(el); + //}); + //clite.log.write('Resetting system core'); + //delete clite; + //clite = null; + //l('clite/core.js',function() {setTimeout('clite.init();',500)}); + //},10); }, shutdown:function() { clite.log.write('The system is shutting down'); + // TODO: this all needs redoing with bios calls setTimeout(function() { var s = Array.from(document.getElementsByTagName('src')); s.forEach(function(el) { @@ -251,8 +228,8 @@ var clite = { return false; } n.data.content = { - read:null, - write:null + read:clite.tty.read, + write:clite.tty.write }; n.perms = 'crw-rw-rw-'; n.data.isdev = true; @@ -329,7 +306,8 @@ guest:x:1: | | | | | | | |_ ___ | | | | | | | __/ _ \\ | |____| |____ _| |_| || __/ - \\_____|______|_____|\\__\\___|`; + \\_____|______|_____|\\__\\___| +`; n.perms = '-rw-r--r--'; // /etc/shrc shell startup file vfsapi.mkFile(0,'/etc/shrc'); @@ -379,7 +357,7 @@ cat /etc/greeting var f = clite.includes.prog[index]; index++; - clite.core.load.script('clite/'+f,cb); + clite.state.bios.core.load.script('clite/'+f,cb); } cb(); } @@ -420,7 +398,7 @@ cat /etc/greeting var f = clite.includes.libs[index]; index++; - clite.core.load.script('clite/'+f,cb); + clite.state.bios.core.load.script('clite/'+f,cb); } cb(); } @@ -448,7 +426,7 @@ license.txt:/etc/license:0:0:-rw-r--r--`; init2(d); return; } - clite.core.load.file('data/filesys.txt',init2); + clite.state.bios.core.load.file('data/filesys.txt',init2); } function init2(data) { if (data == null) { @@ -1069,7 +1047,7 @@ clite.io = { if (typeof cb === 'function') { fd.remote.callback = cb; if (fd.remote.ispending) { - clite.core.load.file(fd.node.data.remote,function(d) { + clite.state.bios.core.load.file(fd.node.data.remote,function(d) { fd.node.data.content = d; fd.remote.ispending = false; try{ @@ -1307,11 +1285,10 @@ clite.io = { try{ if (fd.node.data.content.write.length == 2) { var ctty = clite.proc.getTTY(pid); - fd.node.data.content.write(ctty,cb); + return fd.node.data.content.write(ctty,data); }else{ - fd.node.data.content.write(cb); + return fd.node.data.content.write(data); } - return fd.node.data.content.write(data); } catch(err) { return false; } @@ -2227,6 +2204,11 @@ clite.tty = { off = i+1; break; } + // special case, returns any non-character key found + if (t.buff[i].code <32 || t.buff[i].code > 126) { + k = t.buff.splice(i,1); + return t.code; + } l += t.buff[i].char; } if (off < 0) @@ -2286,24 +2268,32 @@ clite.tty = { return true; }, input:function(key) { + // TODO: check for control for special conversions + if (key.down) + return; if (!clite.tty.data.active) return; var t = clite.tty.data.active; - if (t.echo) + // TODO: this hides control characters from echoing... do we want that? + if (t.echo && ((key.code > 31 && key.code < 127) || key.code == 10)) clite.tty.write(t.id,key.char); if (t.raw) { if (typeof t.rcb === 'function') { - t.rcb(key.char); + if ((key.code > 31 && key.code < 127) || key.code == 10) { + t.rcb(key.char); + }else{ + t.rcb(key.code); + } }else{ t.buff.push(key); } return; } t.buff.push(key); - if (key.code != 10) - return; if (typeof t.rcb !== 'function') return; + if (key.code != 10) + return; var l = clite.tty.internal.popLine(t); if (!l) return; @@ -2517,83 +2507,83 @@ clite.term = { //}, ttyctrl:function(fn,v) { switch (fn) { - case 'iget': // returns the current input string - bypassing tty read - try{ - return clite.term.data.buff; - } catch(err) { - return ''; - } - break; - case 'iset': // sets the current input string - try{ - if (typeof v !== 'string') - v = ''; - clite.term.data.field.value = v; - clite.term.data.buff = v; - return true; - } catch(err) { - return false; - } - break; - case 'prompt': // sets the prompt for input - if (typeof v !== 'string') - v = ''; - clite.term.data.prompt = v; - return true; - break; - case 'hide': // turns off input - clite.term.data.show = false; - var f = document.getElementById('form'); - if (!f) - return; - f.parentNode.removeChild(f); - break; - case 'show': // turns on input - clite.term.data.show = true; - //clite.term.genForm(); - break; - case 'alt': // switch to the alternate frame buffer - if (typeof v === 'boolean') { - clite.term.data.isalt = v; - } - if (!clite.term.data.isalt) { - var t = document.getElementById('termalt'); - if (t) - t.parentNode.removeChild(t); - }else{ - //clite.term.genAlt(); - } - //clite.term.genForm(); - return clite.term.data.isalt; - break; - case 'rawout': - if (!clite.term.data.isalt) - return false; - if (typeof v === 'boolean') { - clite.term.data.alt.israwOut = v; - } - return clite.term.data.alt.israwOut; - break; - case 'rawin': - if (!clite.term.data.isalt) - return false; - if (typeof v === 'boolean') { - clite.term.data.alt.israwIn = v; - } - return clite.term.data.alt.israwIn; - break; - case 'atton': - break; - case 'attoff': - break; - case 'echo': - if (!clite.term.data.isalt) - return false; - if (typeof v === 'boolean') { - clite.term.data.alt.echo = v; - } - return clite.term.data.alt.echo; - break; + //case 'iget': // returns the current input string - bypassing tty read + //try{ + //return clite.term.data.buff; + //} catch(err) { + //return ''; + //} + //break; + //case 'iset': // sets the current input string + //try{ + //if (typeof v !== 'string') + //v = ''; + //clite.term.data.field.value = v; + //clite.term.data.buff = v; + //return true; + //} catch(err) { + //return false; + //} + //break; + //case 'prompt': // sets the prompt for input + //if (typeof v !== 'string') + //v = ''; + //clite.term.data.prompt = v; + //return true; + //break; + //case 'hide': // turns off input + //clite.term.data.show = false; + //var f = document.getElementById('form'); + //if (!f) + //return; + //f.parentNode.removeChild(f); + //break; + //case 'show': // turns on input + //clite.term.data.show = true; + ////clite.term.genForm(); + //break; + //case 'alt': // switch to the alternate frame buffer + //if (typeof v === 'boolean') { + //clite.term.data.isalt = v; + //} + //if (!clite.term.data.isalt) { + //var t = document.getElementById('termalt'); + //if (t) + //t.parentNode.removeChild(t); + //}else{ + ////clite.term.genAlt(); + //} + ////clite.term.genForm(); + //return clite.term.data.isalt; + //break; + //case 'rawout': + //if (!clite.term.data.isalt) + //return false; + //if (typeof v === 'boolean') { + //clite.term.data.alt.israwOut = v; + //} + //return clite.term.data.alt.israwOut; + //break; + //case 'rawin': + //if (!clite.term.data.isalt) + //return false; + //if (typeof v === 'boolean') { + //clite.term.data.alt.israwIn = v; + //} + //return clite.term.data.alt.israwIn; + //break; + //case 'atton': + //break; + //case 'attoff': + //break; + //case 'echo': + //if (!clite.term.data.isalt) + //return false; + //if (typeof v === 'boolean') { + //clite.term.data.alt.echo = v; + //} + //return clite.term.data.alt.echo; + //break; default: return false; } diff --git a/clite/shell.js b/clite/shell.js index f258f98..1cfab6f 100644 --- a/clite/shell.js +++ b/clite/shell.js @@ -260,10 +260,6 @@ clite.commands.load('sh',function(args,env,io) { } history.add(txt); history.resetCurrent(); - // clear the tty prompt - term.ttyctrl('prompt',''); - if (interactive) - stdio.write(io.stdout,prompt+txt); // split command line into arguments var args = clite.strToArgs(txt); args.forEach(function(val,i) { @@ -324,7 +320,25 @@ clite.commands.load('sh',function(args,env,io) { inputRead(); return; } - stdlib.waitpid(pid,inputRead); + // TODO: if we're not interactive, we still want to waitpid + if (interactive) + stdlib.waitpid(pid,inputRead); + } + + function writePrompt() { + // generate the prompt + var p = env.PS1; + if (typeof p === 'undefined') + p = '${USER}:${PWD}' + + prompt = preprocess(p); + if (stdlib.getuid() == 0) { + prompt += '# '; + }else{ + prompt += '$ '; + } + + stdio.write(io.stdout,prompt); } function inputControl(key) { @@ -355,19 +369,7 @@ clite.commands.load('sh',function(args,env,io) { function inputRead() { if (has_exited) return; - // generate the prompt - var p = env.PS1; - if (typeof p === 'undefined') - p = '${USER}:${PWD}' - - prompt = preprocess(p); - if (stdlib.getuid() == 0) { - prompt += '# '; - }else{ - prompt += '$ '; - } - // set the prompt - term.ttyctrl('prompt',prompt); + writePrompt(); // ensure input is enabled term.ttyctrl('show'); // and that we're on the main framebuffer @@ -395,6 +397,8 @@ clite.commands.load('sh',function(args,env,io) { } } + //alert('shell'); + stdlib.waitall(function() { history.clear(); inputRead();