From fe2767219e22eda853cb1ad30c44c49afc1bed66 Mon Sep 17 00:00:00 2001
From: dzwdz
Date: Thu, 10 Aug 2023 00:07:35 +0200
Subject: user/fs: no longer inject MOUNT_ATs by default

arguably the wrong choice from an usability standpoint, but the right choice
from a performance standpoint.
there's definitely a nicer way to do this
---
 src/user/app/init/init.c                | 11 ++++++++---
 src/user/app/shell/shell.c              |  3 +++
 src/user/bootstrap/main.c               | 12 ++++++++++--
 src/user/lib/fs/misc.c                  | 11 ++---------
 src/user/lib/include/camellia/fs/misc.h |  4 ++--
 5 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/src/user/app/init/init.c b/src/user/app/init/init.c
index 61fb27b..ca50699 100644
--- a/src/user/app/init/init.c
+++ b/src/user/app/init/init.c
@@ -45,9 +45,14 @@ int main(void) {
 
 	MOUNT_AT("/") {
 		fs_dirinject2((const char*[]){
-			"/fake/b/c",
-			"/fake/c",
-			"/faker",
+			"/keyboard/",
+			"/usr/",
+			"/bin/",
+			"/Users/",
+			"/tmp/",
+			"/vtty",
+			"/net/",
+			"/initctl",
 			NULL
 		});
 	}
diff --git a/src/user/app/shell/shell.c b/src/user/app/shell/shell.c
index e9293bc..65f08b6 100644
--- a/src/user/app/shell/shell.c
+++ b/src/user/app/shell/shell.c
@@ -41,6 +41,9 @@ void run_args(int argc, char **argv, struct redir *redir) {
 			fprintf(stderr, "mount: not enough arguments\n");
 			return;
 		}
+		MOUNT_AT("/") {
+			fs_dirinject(argv[1]);
+		}
 		MOUNT_AT(argv[1]) {
 			run_args(argc - 2, argv + 2, redir);
 			exit(1);
diff --git a/src/user/bootstrap/main.c b/src/user/bootstrap/main.c
index 348486c..d27da39 100644
--- a/src/user/bootstrap/main.c
+++ b/src/user/bootstrap/main.c
@@ -18,8 +18,16 @@ int main(void) {
 	setprogname("bootstrap");
 
 	_sys_mount(HANDLE_PROCFS, "/proc/", strlen("/proc/"));
-	MOUNT_AT("/") { fs_dirinject("/proc/"); }
-	MOUNT_AT("/init/") { tar_driver(&_initrd); }
+	MOUNT_AT("/") {
+		fs_dirinject2((const char*[]) {
+			"/proc/",
+			"/init/",
+			NULL
+		});
+	}
+	MOUNT_AT("/init/") {
+		tar_driver(&_initrd);
+	}
 
 	const char *initpath = "bin/amd64/init";
 	char *initargv[] = {"init", NULL};
diff --git a/src/user/lib/fs/misc.c b/src/user/lib/fs/misc.c
index 2a39e9a..a23f05f 100644
--- a/src/user/lib/fs/misc.c
+++ b/src/user/lib/fs/misc.c
@@ -154,20 +154,13 @@ hid_t ufs_wait(char *buf, size_t len, struct ufs_request *req) {
 	return reqh;
 }
 
-bool mount_at_pred(const char *path) {
+bool mount_at(const char *path) {
 	// TODO preprocess path - simplify & ensure trailing slash
 	if (!fork2_n_mount(path)) {
 		/* child -> go into the for body */
 		_klogf("%s: impl", path);
-		setproctitle("i'%s'", path);
+		setproctitle("%s", path);
 		return true;
 	}
-
-	if (strcmp("/", path) && !fork2_n_mount("/")) {
-		_klogf("%s: dir", path);
-		setproctitle("d'%s'", path);
-		fs_dirinject(path);
-		exit(1);
-	}
 	return false; /* continue after the for loop */
 }
diff --git a/src/user/lib/include/camellia/fs/misc.h b/src/user/lib/include/camellia/fs/misc.h
index 92679e9..0b2a018 100644
--- a/src/user/lib/include/camellia/fs/misc.h
+++ b/src/user/lib/include/camellia/fs/misc.h
@@ -13,7 +13,7 @@ void fs_union(const char **list);
 void fs_dirinject(const char *path);
 void fs_dirinject2(const char *injects[]);
 
-bool mount_at_pred(const char *path);
+bool mount_at(const char *path);
 
 // TODO separate fs drivers and wrappers around syscalls
 
@@ -21,4 +21,4 @@ bool mount_at_pred(const char *path);
 hid_t ufs_wait(char *buf, size_t len, struct ufs_request *req);
 
 /** Mounts something and injects its path into the fs */
-#define MOUNT_AT(path) for (; mount_at_pred(path); exit(1))
+#define MOUNT_AT(path) for (; mount_at(path); exit(1))
-- 
cgit v1.2.3