X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=inittab.c;h=011d7a67e644841ed5ed7cb95e4f88c385b6cceb;hp=623103de640b1e7609933a175fce3dfed716e715;hb=9cec4e6a94a6456bbb3deb14688c690217e4190c;hpb=e10fca6b88a8b57fe5a9e80dfd941ae6d98cb970 diff --git a/inittab.c b/inittab.c index 623103d..011d7a6 100644 --- a/inittab.c +++ b/inittab.c @@ -12,6 +12,7 @@ * GNU General Public License for more details. */ +#define _GNU_SOURCE #include #include #include @@ -30,6 +31,10 @@ #include "procd.h" #include "rcS.h" +#ifndef O_PATH +#define O_PATH 010000000 +#endif + #define TAG_ID 0 #define TAG_RUNLVL 1 #define TAG_ACTION 2 @@ -65,49 +70,35 @@ 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); - } + if (fd < 0) + return 0; - return (res != -1); + 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); - if (fd > STDERR_FILENO) - close(fd); - } + if (patch_stdio(a->id)) + ERROR("Failed to setup i/o redirection\n"); ioctl(STDIN_FILENO, TIOCSCTTY, 1); tcsetpgrp(STDIN_FILENO, p); @@ -150,7 +141,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) @@ -234,6 +228,14 @@ static struct init_handler handlers[] = { .name = "respawn", .cb = rcrespawn, .multi = 1, + }, { + .name = "askconsolelate", + .cb = askconsole, + .multi = 1, + }, { + .name = "respawnlate", + .cb = rcrespawn, + .multi = 1, } };