X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=inittab.c;h=623103de640b1e7609933a175fce3dfed716e715;hp=7f76a1ecb4de0d835f55cf076917e97b275f7766;hb=0cf744c720c9ed01c2dae25f338d4e96b9db95e3;hpb=e63051d9843ddbafb1fabfd97d60e853bdeac129 diff --git a/inittab.c b/inittab.c index 7f76a1e..623103d 100644 --- a/inittab.c +++ b/inittab.c @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -37,7 +38,7 @@ #define MAX_ARGS 8 struct init_action; -const char *console; +char *console = NULL; struct init_handler { const char *name; @@ -85,7 +86,7 @@ static int dev_exist(const char *dev) if (res != -1) { close(res); } - + return (res != -1); } @@ -96,16 +97,21 @@ static void fork_worker(struct init_action *a) a->proc.pid = fork(); if (!a->proc.pid) { - p = setsid( ); + 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); + if (fd > STDERR_FILENO) + close(fd); } + + ioctl(STDIN_FILENO, TIOCSCTTY, 1); + tcsetpgrp(STDIN_FILENO, p); + execvp(a->argv[0], a->argv); ERROR("Failed to execute %s\n", a->argv[0]); exit(-1); @@ -172,19 +178,27 @@ static void askconsole(struct init_action *a) int i; tty = get_cmdline_val("console", line, sizeof(line)); - split=strchr(tty, ','); - if (split != NULL) - split = '\0'; - - if (!dev_exist(tty)) { - DEBUG(4, "skipping %s\n", tty); - return; + 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->id = strdup(tty); + } + else { + console = NULL; + a->id = NULL; } a->tout.cb = respawn; for (i = MAX_ARGS - 1; i >= 1; i--) a->argv[i] = a->argv[i - 1]; - a->id = strdup(tty); a->argv[0] = ask; a->respawn = 500;