summary refs log tree commit diff
path: root/sbin/init
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2025-04-07 10:50:14 +0300
committerWlodekM <[email protected]>2025-04-07 10:50:14 +0300
commit1e1073235796c838d5e1a3255f88ec97575e3582 (patch)
treef377e2692366d599e678ff4d0c69ce2d02febced /sbin/init
parent8bb127447f3a182e9278ab58e5285d398e47f77e (diff)
uh
Diffstat (limited to 'sbin/init')
-rw-r--r--sbin/init/init.c26
-rw-r--r--sbin/init/sinit.c96
2 files changed, 122 insertions, 0 deletions
diff --git a/sbin/init/init.c b/sbin/init/init.c
new file mode 100644
index 0000000..168d011
--- /dev/null
+++ b/sbin/init/init.c
@@ -0,0 +1,26 @@
+#include <unistd.h>
+#include <signal.h>
+
+int main() {
+	sigset_t set;
+	int status;
+    write(1, "nyaOS init process started\n", 28);
+	sigfillset(&set);
+	sigprocmask(SIG_BLOCK, &set, 0);
+    if (fork()) pause();
+    //TODO - eventually add device scan
+    if (!fork()) execve("/sbin/devscan", 0, 0);
+
+    sigprocmask(SIG_UNBLOCK, &set, 0);
+
+    // setsid();
+    setpgid(0, 0);
+    
+    write(1, "press RETURN to\n\n", 17);
+    char a[2] = {0};
+    read(0, a, 1);
+    // make tty1
+    execve("/sbin/fdmaker", 0, 0);
+    // execve("/sbin/devscan", 0, 0);
+    // execve("/sbin/fdmaker", 0, 0);
+}
\ No newline at end of file
diff --git a/sbin/init/sinit.c b/sbin/init/sinit.c
new file mode 100644
index 0000000..b29f880
--- /dev/null
+++ b/sbin/init/sinit.c
@@ -0,0 +1,96 @@
+/* See LICENSE file for copyright and license details. */
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define LEN(x)	(sizeof (x) / sizeof *(x))
+#define TIMEO	30
+
+static void sigpoweroff(void);
+static void sigreap(void);
+static void sigreboot(void);
+static void spawn(char *const []);
+
+static struct {
+	int sig;
+	void (*handler)(void);
+} sigmap[] = {
+	{ SIGUSR1, sigpoweroff },
+	{ SIGCHLD, sigreap     },
+	{ SIGALRM, sigreap     },
+	{ SIGINT,  sigreboot   },
+};
+
+/* See LICENSE file for copyright and license details. */
+
+static char *const rcinitcmd[]     = { "/bin/zsh", NULL };
+static char *const rcrebootcmd[]   = { "/bin/rc.shutdown", "reboot", NULL };
+static char *const rcpoweroffcmd[] = { "/bin/rc.shutdown", "poweroff", NULL };
+
+
+static sigset_t set;
+
+int
+main(void)
+{
+	int sig;
+	size_t i;
+
+	if (getpid() != 1)
+		return 1;
+	chdir("/");
+	sigfillset(&set);
+	sigprocmask(SIG_BLOCK, &set, NULL);
+	spawn(rcinitcmd);
+	while (1) {
+		alarm(TIMEO);
+		sigwait(&set, &sig);
+		for (i = 0; i < LEN(sigmap); i++) {
+			if (sigmap[i].sig == sig) {
+				sigmap[i].handler();
+				break;
+			}
+		}
+	}
+	/* not reachable */
+	return 0;
+}
+
+static void
+sigpoweroff(void)
+{
+	spawn(rcpoweroffcmd);
+}
+
+static void
+sigreap(void)
+{
+	while (waitpid(-1, NULL, WNOHANG) > 0)
+		;
+	alarm(TIMEO);
+}
+
+static void
+sigreboot(void)
+{
+	spawn(rcrebootcmd);
+}
+
+static void
+spawn(char *const argv[])
+{
+	switch (fork()) {
+	case 0:
+		sigprocmask(SIG_UNBLOCK, &set, NULL);
+		setsid();
+		execvp(argv[0], argv);
+		perror("execvp");
+		_exit(1);
+	case -1:
+		perror("fork");
+	}
+}