get shell working with tty (also fix a bug that went unnoticed without a proper tty)

This commit is contained in:
Lisa Milne 2023-12-12 18:39:45 +10:00
parent c5917c0e81
commit 0597769c61
4 changed files with 155 additions and 152 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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();