From ab129f65963dce3ac5cdc4174d3faa645da35bd8 Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 26 Jul 2023 00:21:07 -0300 Subject: [PATCH] init: run /etc/rc on boot --- distro-files/etc/rc | 7 ++++++- tools/init/main.c | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/distro-files/etc/rc b/distro-files/etc/rc index eeee083c..f2044a14 100644 --- a/distro-files/etc/rc +++ b/distro-files/etc/rc @@ -1 +1,6 @@ -mkdir /tmp +#!/usr/bin/bash +mkdir -p /dev +mount /dev devfs + +mkdir -p /tmp +mount /tmp tmpfs diff --git a/tools/init/main.c b/tools/init/main.c index de41f56d..0485c155 100644 --- a/tools/init/main.c +++ b/tools/init/main.c @@ -7,6 +7,7 @@ int main() { printf("init: Welcome to Astral!\n"); + // set up initial environmental variables struct passwd* pw = getpwuid(getuid()); if (pw == NULL) { perror("init: failed to open /etc/passwd"); @@ -23,24 +24,49 @@ int main() { setenv("PATH", "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin", 1); setenv("TERM", "linux", 1); - printf("init: running /usr/bin/bash\n"); - + // run rc to initialize environment (mount filesystems, etc) + printf("init: running /etc/rc\n"); pid_t pid = fork(); if (pid == -1) { - perror("init: fork failed:"); + perror("init: fork failed"); + return EXIT_FAILURE; + } + + if (pid == 0) { + execl("/usr/bin/bash", "/usr/bin/bash", "/etc/rc", NULL); + perror("init: exec /usr/bin/bash failed"); + return EXIT_FAILURE; + } + + int status = 0; + if (waitpid(pid, &status, 0) == -1) { + perror("init: waitpid failed"); + return EXIT_FAILURE; + } + + if (WEXITSTATUS(status)) { + printf("/etc/rc returned failure status %d\n", WEXITSTATUS(status)); + return EXIT_FAILURE; + } + + // start user shell + printf("init: running /usr/bin/bash\n"); + pid = fork(); + if (pid == -1) { + perror("init: fork failed"); return EXIT_FAILURE; } if (pid == 0) { execl("/usr/bin/bash", "/usr/bin/bash", "-l", NULL); - perror("init: execl /usr/bin/bash failed:"); + perror("init: execl /usr/bin/bash failed"); return EXIT_FAILURE; } for (;;) { int status; if (waitpid(-1, &status, 0) == -1) { - perror("init: waitpid failed:"); + perror("init: waitpid failed"); return EXIT_FAILURE; } }