diff options
author | dzwdz | 2023-09-13 22:19:26 +0200 |
---|---|---|
committer | dzwdz | 2023-09-13 22:19:26 +0200 |
commit | 8757321821d05d2958160e1428250daf19c119e9 (patch) | |
tree | 3039b7d5879629805a1fe0fc4ed50ff53c0dbe47 /src/cmd | |
parent | c9fbab701ff57583733c84fa93889eacf422b861 (diff) |
*: clean up the filesystem
moved keyboard and vtty to /dev/, removed some obsolete stuff
Diffstat (limited to 'src/cmd')
-rw-r--r-- | src/cmd/init/init.c | 23 | ||||
-rw-r--r-- | src/cmd/login/login.c | 89 |
2 files changed, 4 insertions, 108 deletions
diff --git a/src/cmd/init/init.c b/src/cmd/init/init.c index 093e281..7f26f1b 100644 --- a/src/cmd/init/init.c +++ b/src/cmd/init/init.c @@ -56,18 +56,15 @@ int main(void) { MOUNT_AT("/") { fs_dirinject2((const char*[]){ - "/keyboard/", "/usr/", "/bin/", - "/Users/", "/tmp/", - "/vtty", "/net/", NULL }); } - MOUNT_AT("/keyboard") { + MOUNT_AT("/dev/keyboard") { MOUNT_AT("/") { fs_whitelist((const char*[]){"/dev/ps2/kb", NULL}); } ps2_drv(); } @@ -86,26 +83,14 @@ int main(void) { NULL }); } - MOUNT_AT("/Users/") { - MOUNT_AT("/tmp/") { - const char *argv[] = {"/bin/tmpfs", NULL}; - execv(argv[0], (void*)argv); - } - // TODO a simple union isn't enough here - fs_union((const char*[]){ - "/tmp/", - "/init/Users/", - NULL - }); - } MOUNT_AT("/tmp/") { const char *allow[] = {"/bin/tmpfs", NULL}; const char *argv[] = {"/bin/tmpfs", NULL}; MOUNT_AT("/") { fs_whitelist(allow); } execv(argv[0], (void*)argv); } - MOUNT_AT("/vtty") { - const char *allow[] = {"/bin/vterm", "/dev/video/", "/keyboard", "/init/usr/share/fonts/", NULL}; + MOUNT_AT("/dev/vtty") { + const char *allow[] = {"/bin/vterm", "/dev/video/", "/dev/keyboard", "/init/usr/share/fonts/", NULL}; const char *argv[] = {"/bin/vterm", NULL}; MOUNT_AT("/") { fs_whitelist(allow); } execv(argv[0], (void*)argv); @@ -119,7 +104,7 @@ int main(void) { if (!fork()) { redirect("/bin/shell", "/dev/com1", "/dev/com1"); - redirect("/bin/shell", "/vtty", "/keyboard"); + redirect("/bin/shell", "/dev/vtty", "/dev/keyboard"); exit(1); } diff --git a/src/cmd/login/login.c b/src/cmd/login/login.c deleted file mode 100644 index 0f9e8b7..0000000 --- a/src/cmd/login/login.c +++ /dev/null @@ -1,89 +0,0 @@ -#include <camellia/flags.h> -#include <camellia/syscalls.h> -#include <ctype.h> -#include <errno.h> -#include <limits.h> -#include <stdbool.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <camellia/fs/misc.h> - -static const char *shell = "/bin/shell"; - -static void cutspace(char *s) { - for (; *s; s++) { - if (isspace(*s)) { - *s = '\0'; - break; - } - } -} - -static bool segcmp(const char *path, int idx, const char *s2) { - if (idx < 0) return false; - while (idx > 0) { - if (*path == '\0') return false; - if (*path == '/') idx--; - path++; - } - /* path is at the start of the selected segment */ - while (*s2 && *path++ == *s2++); - return (*path == '\0' || *path == '/') && *s2 == '\0'; -} - -static void drv(const char *user) { - char *buf = malloc(PATH_MAX); - for (;;) { - struct ufs_request req; - hid_t reqh = ufs_wait(buf, PATH_MAX, &req); - if (reqh < 0) break; - switch (req.op) { - case VFSOP_OPEN: - if (segcmp(buf, 1, "Users") && segcmp(buf, 2, user)) { // /Users/$user/** - forward_open(reqh, buf, req.len, req.flags); - } else if (segcmp(buf, 1, "Users") && segcmp(buf, 3, "private")) { // /Users/*/private/** - _sys_fs_respond(reqh, NULL, -EACCES, 0); - } else if (!OPEN_WRITEABLE(req.flags)) { - forward_open(reqh, buf, req.len, req.flags); - } else { - _sys_fs_respond(reqh, NULL, -EACCES, 0); - } - break; - - default: - _sys_fs_respond(reqh, NULL, -1, 0); - break; - } - } - free(buf); -} - -static void trylogin(const char *user) { - if (strcmp(user, "root") != 0) { - char buf[128]; - snprintf(buf, sizeof buf, "/Users/%s/", user); - if (chdir(buf) < 0) { - printf("no such user: %s\n", user); - return; - } - MOUNT_AT("/") { drv(user); } - } - - execv(shell, NULL); - fprintf(stderr, "login: couldn't launch %s\n", shell); - exit(1); -} - -int main(void) { - char user[64]; - printf("\nCamellia\n"); - for (;;) { - printf("login: "); - fgets(user, sizeof user, stdin); - if (ferror(stdin)) return -1; - - cutspace(user); - if (user[0]) trylogin(user); - } -} |