diff options
-rw-r--r-- | inittab.c | 73 | ||||
-rw-r--r-- | utils/askfirst.c | 28 |
2 files changed, 54 insertions, 47 deletions
@@ -37,7 +37,7 @@ #define MAX_ARGS 8 struct init_action; -const char *console; +char *console = NULL; struct init_handler { const char *name; @@ -64,10 +64,48 @@ static char *ask = "/sbin/askfirst"; static LIST_HEAD(actions); +static int dev_open(const char *dev) +{ + int fd = -1; + + if (dev) { + chdir("/dev"); + fd = open( dev, O_RDWR); + chdir("/"); + } + + return fd; +} + +static int dev_exist(const char *dev) +{ + int res; + + res = dev_open(dev); + if (res != -1) { + close(res); + } + + return (res != -1); +} + static void fork_worker(struct init_action *a) { + int fd; + pid_t p; + a->proc.pid = fork(); if (!a->proc.pid) { + p = setsid( ); + fd = dev_open(a->id); + if (fd != -1) + { + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + tcsetpgrp(fd, p); + close(fd); + } execvp(a->argv[0], a->argv); ERROR("Failed to execute %s\n", a->argv[0]); exit(-1); @@ -111,22 +149,17 @@ static void runrc(struct init_action *a) static void askfirst(struct init_action *a) { - struct stat s; int i; - chdir("/dev"); - i = stat(a->id, &s); - chdir("/"); - if (i || (console && !strcmp(console, a->id))) { + if (!dev_exist(a->id) || (console && !strcmp(console, a->id))) { DEBUG(4, "Skipping %s\n", a->id); return; } a->tout.cb = respawn; - for (i = MAX_ARGS - 2; i >= 2; i--) - a->argv[i] = a->argv[i - 2]; + for (i = MAX_ARGS - 1; i >= 1; i--) + a->argv[i] = a->argv[i - 1]; a->argv[0] = ask; - a->argv[1] = a->id; a->respawn = 500; a->proc.cb = child_exit; @@ -135,29 +168,27 @@ static void askfirst(struct init_action *a) static void askconsole(struct init_action *a) { - struct stat s; char line[256], *tty, *split; int i; tty = get_cmdline_val("console", line, sizeof(line)); - split=strchr(tty, ','); - if (split != NULL) - split = '\0'; - - chdir("/dev"); - i = stat(tty, &s); - chdir("/"); - if (i) { + if (tty != NULL) { + split = strchr(tty, ','); + if (split != NULL) + *split = '\0'; + } + + if (!dev_exist(tty)) { DEBUG(4, "skipping %s\n", tty); return; } console = strdup(tty); a->tout.cb = respawn; - for (i = MAX_ARGS - 2; i >= 2; i--) - a->argv[i] = a->argv[i - 2]; + for (i = MAX_ARGS - 1; i >= 1; i--) + a->argv[i] = a->argv[i - 1]; + a->id = strdup(tty); a->argv[0] = ask; - a->argv[1] = strdup(tty); a->respawn = 500; a->proc.cb = child_exit; diff --git a/utils/askfirst.c b/utils/askfirst.c index 6ad77aa..e78823c 100644 --- a/utils/askfirst.c +++ b/utils/askfirst.c @@ -19,34 +19,10 @@ #include <unistd.h> #include <fcntl.h> -static int redirect_output(const char *dev) -{ - pid_t p = setsid(); - int fd; - - chdir("/dev"); - fd = open(dev, O_RDWR); - chdir("/"); - - if (fd < 0) - return -1; - - dup2(fd, STDIN_FILENO); - dup2(fd, STDOUT_FILENO); - dup2(fd, STDERR_FILENO); - tcsetpgrp(fd, p); - close(fd); - - return 0; -} - int main(int argc, char **argv) { int c; - if (redirect_output(argv[1])) - fprintf(stderr, "%s: Failed to open %s\n", argv[0], argv[1]); - printf("Please press Enter to activate this console.\n"); do { c = getchar(); @@ -55,8 +31,8 @@ int main(int argc, char **argv) } while (c != 0xA); - execvp(argv[2], &argv[2]); - printf("%s: Failed to execute %s\n", argv[0], argv[2]); + execvp(argv[1], &argv[1]); + printf("Failed to execute %s\n", argv[0]); return -1; } |