From 45b03465c385de89c7919f8847bb95d6e77dc2ee Mon Sep 17 00:00:00 2001 From: Lisa Milne Date: Sun, 12 Nov 2023 19:16:26 +1000 Subject: [PATCH] make reading from and writing to devices work consistantly --- clite/commands.js | 6 +-- clite/core.js | 114 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 98 insertions(+), 22 deletions(-) diff --git a/clite/commands.js b/clite/commands.js index a4f709a..810fa52 100644 --- a/clite/commands.js +++ b/clite/commands.js @@ -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; diff --git a/clite/core.js b/clite/core.js index 9027a6c..01d75e2 100644 --- a/clite/core.js +++ b/clite/core.js @@ -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); }