persistant filesystem part 3

This commit is contained in:
Lisa Milne 2023-12-18 11:48:18 +10:00
parent 2d8214a6c8
commit e478a13f61
2 changed files with 75 additions and 29 deletions

View file

@ -511,6 +511,9 @@ license.txt:/etc/license:0:0:-rw-r--r--`;
var b = clite.state.bios.io.read(2);
if (b) {
let list = b.getList();
// if we're restoring data, assume cookies were accepted previously
if (list.length > 0)
clite.state.cookiesAccepted = true;
list.forEach(function(fn) {
clite.vfs.restoreFile(fn);
});
@ -1343,6 +1346,7 @@ clite.io = {
canread:false,
canwrite:false,
canexec:false,
path:path,
remote:{
ispending:p,
callback:null
@ -1633,6 +1637,7 @@ clite.io = {
fd.pos += data.length;
}
fd.node.time.modify = clite.time.sec();
clite.vfs.saveFile(fd.path);
return true;
}
clite.io.ftruncate = function(pid,fd,len) {
@ -1644,6 +1649,7 @@ clite.io = {
if (fd.pos > len)
fd.pos = len;
fd.node.time.modify = clite.time.sec();
clite.vfs.saveFile(fd.path);
return true;
}
clite.io.truncate = function(pid,path,len) {
@ -1671,7 +1677,11 @@ clite.io = {
if (!fd || !fd.canwrite || fd.node.data.isdev)
return false;
var uid = clite.proc.getUID(pid);
return vfsapi.remove(uid,path);
clite.vfs.saveFile(fd.path);
var r = vfsapi.remove(uid,path);
if (r)
clite.vfs.saveFile(path);
return r;
}
clite.io.link = function(pid,path,target) {
if (!getFileDes(pid,target,false,null))
@ -1681,10 +1691,14 @@ clite.io = {
if (!fd.canwrite)
return false;
fd.node.data.content = target;
clite.vfs.saveFile(path);
return true;
}
var uid = clite.proc.getUID(pid);
return vfsapi.mkLink(uid,path,target);
var r = vfsapi.mkLink(uid,path,target);
if (r)
clite.vfs.saveFile(path);
return r;
},
clite.io.fstatat = function(pid,fd,flags) {
if (!fd || !fd.node || !fd.canread)
@ -1803,6 +1817,7 @@ clite.io = {
if (!n)
return false;
n.mode = mode;
clite.vfs.saveFile(path);
return true;
}
@ -2465,26 +2480,6 @@ clite.vfs = {
return true;
}
clite.vfs.getSavedFile = function(path) {
var fsnode = {
name: '',
uid: 0,
gid: 0,
mode:clite.io.modes.S_IRUSR|clite.io.modes.S_IWUSR|clite.io.modes.S_IRGRP|clite.io.modes.S_IROTH,
time:{
access:clite.time.sec(),
modify:clite.time.sec(),
change:clite.time.sec()
},
data:{
remote:null,
isdir:false,
islink:false,
isdev:false,
istty:false,
parent:null,
content:null
}
};
let n = vfsdata.api.getNode(0,path);
if (!n)
return null;
@ -2552,7 +2547,25 @@ clite.vfs = {
}
let n = vfsdata.api.getNode(0,path);
if (!n) {
return false;
var dir = clite.lib.dirname(path);
vfsdata.api.mkPath(0,dir);
switch (type) {
case clite.io.types.FT_DIR:
vfsdata.api.mkDir(0,path);
break;
case clite.io.types.FT_LINK:
vfsdata.api.mkLink(0,path,content);
break;
case clite.io.types.FT_SCRIPT:
case clite.io.types.FT_TEXT:
vfsdata.api.mkFile(0,path);
break;
default:
return false;
}
n = vfsdata.api.getNode(0,path);
if (!n)
return false;
}
if (clite.lib.getFileType({node:n}) != type)
return false;
@ -2571,12 +2584,14 @@ clite.vfs = {
clite.vfs.saveFile = function(path) {
if (!clite.state.cookiesAccepted)
return true;
var str = clite.vfs.getSavedFile(path);
if (!str)
return false;
var b = clite.state.bios.io.read(2);
if (!b)
return false;
var str = clite.vfs.getSavedFile(path);
if (!str) {
b.delFile(path);
return true;
}
b.addFile(path,str);
return true;
}

View file

@ -192,6 +192,7 @@ clite.commands.load('user',function(args,env,io) {
var shell = null;
var group = null;
let user = null;
function help() {
stdio.printf(`
@ -349,10 +350,36 @@ Options:
return 0;
}
function preLogin(str) {
if (str == 'no') {
clite.setcookiestate(false);
io.exit(0);
return;
}
if (str != 'yes') {
cookies();
return;
}
clite.setcookiestate(true);
let r = addUser(user);
io.exit(r);
}
function cookies() {
clite.cookienotice();
stdio.printf("Enter 'yes' to agree, or 'no' to cancel: ");
if (!stdio.read(io.stdin,preLogin)) {
stdio.write(io.stderr,'internal error\n');
io.exit(1);
}
}
function main(args) {
let add = false;
let rem = false;
let user = null;
let shellnext = false;
let groupnext = false;
for (var i=1; i<args.length; i++) {
@ -400,8 +427,12 @@ Options:
return 1;
}
if (add)
return addUser(user);
if (add) {
if (clite.getcookiestate() == true)
return addUser(user);
cookies();
return null;
}
if (rem)
return delUser(user);