diff --git a/clite/core.js b/clite/core.js index 2329495..0bb92f5 100644 --- a/clite/core.js +++ b/clite/core.js @@ -186,6 +186,33 @@ var clite = { return true; } + function defaultConfig() { + // /etc/env contains the default environment variables + vfsapi.mkFile('/etc/env'); + var n = vfsapi.getNode('/etc/env'); + if (!n) { + clite.log.write('environment failure'); + return false; + } + n.data.content = ` +PATH=/bin +`; + n.perms = '-rw-r--r--'; + // /etc/passwd contains user account details + vfsapi.mkFile('/etc/passwd'); + var n = vfsapi.getNode('/etc/passwd'); + if (!n) { + clite.log.write('access config failure'); + return false; + } + n.data.content = ` +root:x:0:0:root:/root:/bin/sh +guest:x:1:1:guest:/usr/home/guest:/bin/sh +`; + // TODO: check cookies for a local user + n.perms = '-rw-r--r--'; + } + function init1() { clite.log.write('CLIte Version '+clite.state.version); // setup vfs @@ -256,6 +283,9 @@ data/about.txt:/usr/share/site/about:0:0:-rw-rw-r--`; fn.data.content = null; } clite.io.close(fd); + // populate /etc (mostly for environment) + clite.log.write('Populating /etc'); + defaultConfig(); // populate /dev (data/filesys.txt is /dev/wfs already) clite.log.write('Populating /dev'); defaultDevices(); @@ -422,7 +452,7 @@ clite.user = { groups:[], env:{ HOME:'/', - USER:udata.name, + USER:this.name, } }; clite.user.getUID = function() { @@ -438,21 +468,64 @@ clite.user = { return true; return false; } - function setLogin(user,uid,gid,groups) { - udata.name = user; - udata.uid = uid; - udata.gid = gid; - udata.groups = groups; - udata.env.HOME = '/usr/home/'+user; - udata.env.PWD = udata.env.HOME; - udata.env.USER = udata.name; - clite.shell.env.HOME = '/usr/home/'+user; - clite.shell.env.PWD = '/usr/home/'+user; - clite.shell.env.USER = user; - clite.shell.prompt.generate(); + function setLogin(uid) { + var found = false; + + var n = vfs.getFile('/etc/passwd'); + if (!n) + return false; + var lines = n.split('\n'); + lines.forEach(function(line) { + if (found) + return; + if (line[0] == '#') + return; + var sects = line.split(':'); + // 0 username + // 1 null + // 2 uid + // 3 gid + // 4 real name + // 5 home dir + // 6 shell + if (sects.length != 7) + return; + if (parseInt(sects[2]) != uid) + return; + found = true; + udata.name = sects[0]; + udata.uid = uid; + udata.gid = parseInt(sects[3]); + udata.env.HOME = sects[5]; + udata.env.SHELL = sects[6]; + udata.env.USER = udata.name; + udata.env.PWD = udata.env.HOME; + }); + + if (!found) + return false; + + n = vfs.getFile('/etc/env'); + if (!n) + return false; + lines = n.split('\n'); + lines.forEach(function(line) { + if (line[0] == '#') + return; + var sects = line.split('='); + if (sects.length != 2) + return; + udata.env[sects[0].trim()] = sects[1].trim(); + }); + + // TODO: read in data from /etc/groups + udata.groups = []; + clite.user.hasLogin = function() { return true; } + + return true; } clite.user.genGuest = function() { clite.term.clear(); @@ -464,8 +537,14 @@ clite.user = { n.gid = 1; } vfs.mkLink('/usr/home/guest/web','/usr/share/site'); - setLogin('guest',1,1,[]); - clite.term.events.refocus(); + + setLogin(1); + + // should really have init/getty exec the shell with the env data etc + clite.shell.init(); + } + clite.user.getEnv = function() { + return structuredClone(udata.env); } return false; }, @@ -481,6 +560,9 @@ clite.user = { hasLogin:function() { // check if we're in a user session return false; }, + getEnv:function() { // get the current environment (variables) + return {}; + }, genGuest:null }; @@ -1295,6 +1377,11 @@ clite.shell = { clite.shell.reading.buff = e.target.value; } }, + init:function() { + clite.shell.env = clite.user.getEnv(); + clite.shell.prompt.generate(); + clite.term.events.refocus(); + }, exit:function(pid,v) { if (pid > -1) clite.proc.exit(pid); @@ -1497,12 +1584,7 @@ clite.shell = { return; clite.shell.history.setCurrent(c+add); }, - env:{ - USER:'root', - PWD:'/', - HOME:'/', - PATH:'/bin' - }, + env:{}, macro:{ clear:function(args,io) { clite.term.clear(); @@ -1824,7 +1906,7 @@ clite.lib = { clite.shell.exit(pid,v); } clite.core.execSafeAsync(function() { - call(Object.create(env),io); + call(structuredClone(env),io); }); return pid; },