X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=inittab.c;h=011d7a67e644841ed5ed7cb95e4f88c385b6cceb;hb=98dc89149231c5268de38fc98590f9267aa9d05b;hp=622601ab3e316bebe421a53f7b3fd942bf1eb21d;hpb=38dd221a41ca93155b0427be4f5d536173dbd111;p=project%2Fprocd.git diff --git a/inittab.c b/inittab.c index 622601a..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,30 +70,23 @@ 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; - - if (dev) { - 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"); - } + int dfd, fd; - return fd; -} + dfd = open("/dev", O_PATH|O_DIRECTORY); -static int dev_exist(const char *dev) -{ - int res; + if (dfd < 0) + return 0; + + 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) @@ -230,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, } };