mirror of
https://codeberg.org/TicklishHoneyBee/CLIte.git
synced 2026-03-11 09:04:37 +00:00
get shell working with tty (also fix a bug that went unnoticed without a proper tty)
This commit is contained in:
parent
c5917c0e81
commit
0597769c61
4 changed files with 155 additions and 152 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
248
clite/core.js
248
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in a new issue