diff options
Diffstat (limited to 'package/miniinit/src/miniinit.c')
-rw-r--r-- | package/miniinit/src/miniinit.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/package/miniinit/src/miniinit.c b/package/miniinit/src/miniinit.c new file mode 100644 index 000000000..69ad095c6 --- /dev/null +++ b/package/miniinit/src/miniinit.c @@ -0,0 +1,44 @@ +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/wait.h> +#include <unistd.h> + +int main() +{ + pid_t pid; + + printf("Started OpenADK miniinit\n"); + putenv("TERM=vt102"); + + // Redirect stdio to /dev/console + close(0); + close(1); + close(2); + open("/dev/console", O_RDWR); // stdin + dup(0); // stdout + dup(0); // stderr + + pid = vfork(); + if (pid == 0) { + setsid(); //new session + putenv("HOME=/"); + putenv("PATH=/sbin:/usr/sbin:/bin:/usr/bin"); + putenv("SHELL=/bin/sh"); + putenv("USER=root"); + // Child: start a shell (e.g., /bin/sh) + execl("/bin/sh", "/bin/sh", "-l", NULL); + perror("execl"); + exit(1); + } else if (pid > 0) { + // Parent: wait for child to exit + int status; + waitpid(pid, &status, 0); + printf("Shell exited, shutting down\n"); + } else if (pid < 0) { + printf("vfork failed"); + sleep(1); + return 0; + } + _exit(0); +} |