X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=inittab.c;h=f8f0218f219b01023de4270483cf09eda134a3e8;hp=d7bb35ba8d7578b58370f6e15359b820348eb7fb;hb=e275c3823b203c965bc114db7a6df927f220c79c;hpb=44803f0b48e6b0bbc56b1f9f8c2ea9c8e1003302 diff --git a/inittab.c b/inittab.c index d7bb35b..f8f0218 100644 --- a/inittab.c +++ b/inittab.c @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -69,9 +70,11 @@ static int dev_open(const char *dev) int fd = -1; if (dev) { - chdir("/dev"); - fd = open( dev, O_RDWR); - chdir("/"); + if (chdir("/dev")) + ERROR("failed to change dir to /dev\n"); + fd = open(dev, O_RDWR); + if (chdir("/")) + ERROR("failed to change dir to /\n"); } return fd; @@ -82,9 +85,8 @@ static int dev_exist(const char *dev) int res; res = dev_open(dev); - if (res != -1) { + if (res != -1) close(res); - } return (res != -1); } @@ -96,16 +98,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); @@ -144,7 +151,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) @@ -176,18 +186,23 @@ static void askconsole(struct init_action *a) split = strchr(tty, ','); if (split != NULL) *split = '\0'; - } - if (!dev_exist(tty)) { - DEBUG(4, "skipping %s\n", tty); - return; + if (!dev_exist(tty)) { + DEBUG(4, "skipping %s\n", tty); + return; + } + + console = strdup(tty); + a->id = strdup(tty); + } + else { + console = NULL; + a->id = NULL; } - console = strdup(tty); 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;