X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=inittab.c;h=6dde11af1a7ec9a1744b6fbd73e627f7061a840a;hp=7f76a1ecb4de0d835f55cf076917e97b275f7766;hb=3c771f9e4ba46d3e39334cb20eab98221043f1e2;hpb=e63051d9843ddbafb1fabfd97d60e853bdeac129 diff --git a/inittab.c b/inittab.c index 7f76a1e..6dde11a 100644 --- a/inittab.c +++ b/inittab.c @@ -12,8 +12,10 @@ * GNU General Public License for more details. */ +#define _GNU_SOURCE #include #include +#include #include #include @@ -37,7 +39,7 @@ #define MAX_ARGS 8 struct init_action; -const char *console; +char *console = NULL; struct init_handler { const char *name; @@ -64,48 +66,39 @@ static char *ask = "/sbin/askfirst"; static LIST_HEAD(actions); -static int dev_open(const char *dev) +static int dev_exist(const char *dev) { - int fd = -1; + int dfd, fd; - if (dev) { - chdir("/dev"); - fd = open( dev, O_RDWR); - chdir("/"); - } + dfd = open("/dev", O_PATH|O_DIRECTORY); - return fd; -} + if (dfd < 0) + return 0; -static int dev_exist(const char *dev) -{ - int res; + fd = openat(dfd, dev, O_RDONLY); + close(dfd); - res = dev_open(dev); - if (res != -1) { - close(res); - } - - return (res != -1); + if (fd < 0) + return 0; + + close(fd); + return 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); - } + p = setsid(); + + if (patch_stdio(a->id)) + ERROR("Failed to setup i/o redirection\n"); + + 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); @@ -144,7 +137,10 @@ static void runrc(struct init_action *a) ERROR("valid format is rcS \n"); return; } - rcS(a->argv[1], a->argv[2], rcdone); + + /* proceed even if no init or shutdown scripts run */ + if (rcS(a->argv[1], a->argv[2], rcdone)) + rcdone(NULL); } static void askfirst(struct init_action *a) @@ -172,19 +168,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;