diff --git a/clite/core.js b/clite/core.js index 47e91db..4c4be6f 100644 --- a/clite/core.js +++ b/clite/core.js @@ -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; } diff --git a/clite/user.js b/clite/user.js index dc0f59e..7fdd125 100644 --- a/clite/user.js +++ b/clite/user.js @@ -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