diff options
Diffstat (limited to 'sbin/init')
-rw-r--r-- | sbin/init/init.c | 26 | ||||
-rw-r--r-- | sbin/init/sinit.c | 96 |
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"); + } +} |