make reading from and writing to devices work consistantly

This commit is contained in:
Lisa Milne 2023-11-12 19:16:26 +10:00
parent f90a77c42a
commit 45b03465c3
2 changed files with 98 additions and 22 deletions

View file

@ -149,8 +149,8 @@ Options:
pending = files.length;
function fcb(fd) {
if (fd.node.data.isdir || fd.node.data.islink || fd.node.data.isdev) {
io.error('not a normal file: '+file);
if (fd.node.data.isdir || fd.node.data.islink) {
io.error('not a normal file: '+fd.node.name);
}else{
var d = stdio.readAll(fd);
if (d != null) {
@ -180,7 +180,7 @@ Options:
pending--;
return;
}
if (fd.node.data.isdir || fd.node.data.islink || fd.node.data.isdev) {
if (fd.node.data.isdir || fd.node.data.islink) {
io.error('not a normal file: '+file);
pending--;
return;

View file

@ -105,6 +105,64 @@ var clite = {
clite.term.clear(false);
var vfsapi = null;
function defaultDevices() {
// writing to /dev/local downloads data {name:'filename to save',data:'file content'}
vfsapi.mkFile('/dev/local');
var n = vfsapi.getNode('/dev/local');
if (!n) {
clite.log.write('local device failure');
return false;
}
n.data.content = {
read:null,
write:function(obj) {
if (typeof obj === 'string') {
clite.core.download('data.txt',obj);
}else if (typeof obj.name === 'string' && typeof obj.data === 'string') {
clite.core.download(obj.name,obj.data);
}else{
return false;
}
return true;
}
};
n.perms = 'crw-rw-rw-';
n.data.isdev = true;
// /dev/null - writing to it goes nowhere, reading from it is always null
vfsapi.mkFile('/dev/null');
n = vfsapi.getNode('/dev/null');
if (!n) {
clite.log.write('null device failure');
return false;
}
n.data.content = {
read:function() {
return null;
},
write:function(v) {
return true;
}
};
n.perms = 'crw-rw-rw-';
n.data.isdev = true;
// /dev/random - writing to it goes nowhere, reading from it returns a stringified random number (integer)
vfsapi.mkFile('/dev/random');
n = vfsapi.getNode('/dev/random');
if (!n) {
clite.log.write('random device failure');
return false;
}
n.data.content = {
read:function() {
return Math.floor(Math.random() * (Number.MAX_SAFE_INTEGER - Number.MIN_SAFE_INTEGER + 1) + Number.MIN_SAFE_INTEGER).toString();
},
write:null
};
n.perms = 'crw-rw-rw-';
n.data.isdev = true;
return true;
}
function init1() {
// setup vfs
clite.log.write('Setting up VFS');
@ -176,22 +234,7 @@ data/about.txt:/usr/share/site/about:0:0:-rw-rw-r--`;
clite.io.close(fd);
// populate /dev (data/filesys.txt is /dev/wfs already)
clite.log.write('Populating /dev');
// writing to /dev/local downloads data {name:'filename to save',data:'file content'}
vfsapi.mkFile('/dev/local');
var n = vfsapi.getNode('/dev/local');
if (!n) {
clite.log.write('local device failure');
return;
}
n.data.content = {
read:null,
write:function(obj) {
clite.core.download(obj.name,obj.data);
return true;
}
};
n.perms = 'crw-rw-rw-';
n.data.isdev = true;
defaultDevices();
// populate /bin
clite.log.write('Populating /bin');
// create a temporary function to load in commands
@ -488,6 +531,15 @@ clite.io = {
clite.io.read = function(fd) {
if (fd.node.data.content == null)
return null;
if (fd.node.data.isdev) {
if (typeof fd.node.data.content !== 'string') {
try{
return fd.node.data.content.read();
} catch(err) {
return null;
}
}
}
if (fd.pos >= fd.node.data.content.length)
return null;
return fd.node.data.content[fd.pos++];
@ -495,6 +547,15 @@ clite.io = {
clite.io.readLine = function(fd) {
if (fd.node.data.content == null)
return null;
if (fd.node.data.isdev) {
if (typeof fd.node.data.content !== 'string') {
try{
return fd.node.data.content.read();
} catch(err) {
return null;
}
}
}
if (fd.pos >= fd.node.data.content.length)
return null;
if (typeof fd.node.data.content != 'string')
@ -511,13 +572,28 @@ clite.io = {
return l;
}
clite.io.readAll = function(fd) {
if (fd.node.data.isdev) {
if (typeof fd.node.data.content !== 'string') {
try{
return fd.node.data.content.read();
} catch(err) {
return null;
}
}
}
return fd.node.data.content;
}
clite.io.write = function(fd,data) {
if (!fd.canwrite)
return false;
if (fd.node.data.isdev && typeof data.name === 'string' && typeof data.data === 'string') {
return fd.node.data.content.write(data);
if (fd.node.data.isdev) {
if (typeof fd.node.data.content != 'string') {
try{
return fd.node.data.content.write(data);
} catch(err) {
return false;
}
}
}
if (typeof fd.node.data.content != 'string')
return false;
@ -565,7 +641,7 @@ clite.io = {
}
clite.io.remove = function(path) {
var fd = getFileDes(path,true,null);
if (!fd || !fd.canwrite)
if (!fd || !fd.canwrite || fd.node.data.isdev)
return false;
return vfsapi.remove(path);
}