From e852f317814c3c59b76381e155e107180103a598 Mon Sep 17 00:00:00 2001 From: Lisa Milne Date: Sun, 17 Dec 2023 23:16:06 +1000 Subject: [PATCH] start of persistant filesystem --- clite/bios.js | 49 +++++++++++++++++++++++++++++++++++++++++- clite/core.js | 59 +++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 103 insertions(+), 5 deletions(-) diff --git a/clite/bios.js b/clite/bios.js index 3e92685..e412e62 100644 --- a/clite/bios.js +++ b/clite/bios.js @@ -73,6 +73,9 @@ var bios = { case 1: return bios.video.io; break; + case 2: + return bios.storage.io; + break; default:; } return null; @@ -146,6 +149,46 @@ var bios = { return true; } }, + storage:{ + data:{ + files:[] + }, + internal:{ + flush:function() { + var list = bios.storage.data.files.join(':'); + window.localStorage.setItem('files',list); + } + }, + io:{ + addFile:function(fn,data) { + if (bios.storage.data.files.indexOf(fn) < 0) + bios.storage.data.files.push(fn); + window.localStorage.setItem(fn,data); + bios.storage.internal.flush(); + }, + delFile:function(fn) { + var ind = bios.storage.data.files.indexOf(fn) + if (ind > -1) + bios.storage.data.files.splice(ind,1); + window.localStorage.removeItem(fn); + bios.storage.internal.flush(); + }, + getList:function() { + return bios.storage.data.files; + }, + getFile:function(fn) { + var ind = bios.storage.data.files.indexOf(fn) + if (ind < 0) + return null; + return window.localStorage.getItem(fn).toString(); + } + }, + init:function() { + let f = window.localStorage.getItem('files'); + if (f) + bios.storage.data.files = f.split(':'); + } + }, input:{ el:null, state:0, @@ -227,7 +270,11 @@ var bios = { bios.input.init(); bios.core.writeStringVGA(25,4,'Done',2); - bios.core.writeStringVGA(0,6,'Booting...'); + bios.core.writeStringVGA(3,5,'Storage Devices:'); + bios.storage.init(); + bios.core.writeStringVGA(25,5,'Done',2); + + bios.core.writeStringVGA(0,7,'Booting...'); bios.boot.preBoot(); } diff --git a/clite/core.js b/clite/core.js index 7b1c0ec..6574c0c 100644 --- a/clite/core.js +++ b/clite/core.js @@ -307,8 +307,8 @@ guest:x:1:1:guest:/usr/home/guest:/bin/sh return false; } n.data.content = ` -root:x:0: -guest:x:1: +root:x:0:root +guest:x:1:guest `; // TODO: check cookies for a local user n.mode = clite.lib.modestr('-rw-r--r--'); @@ -507,6 +507,18 @@ license.txt:/etc/license:0:0:-rw-r--r--`; // populate /etc (mostly for environment) clite.log.write('Populating /etc'); defaultConfig(); + var b = clite.state.bios.io.read(2); + if (b) { + let list = b.getList(); + list.forEach(function(fn) { + let d = clite.lib.dirname(fn); + vfsapi.mkPath(0,d); + vfsapi.mkFile(0,fn); + let n = vfsapi.getNode(0,fn); + if (n) + n.data.content = b.getFile(fn); + }); + } // populate /dev (data/filesys.txt is /dev/wfs already) clite.log.write('Populating /dev'); defaultDevices(); @@ -896,6 +908,13 @@ clite.user = { } return null; } + function getUserByName(n) { + for (var i=0; i