From: Jo-Philipp Wich Date: Tue, 17 May 2016 15:42:10 +0000 (+0200) Subject: inittab: use more robust dev_exist() implementation X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=commitdiff_plain;h=f2c77756933f22981c1202c039e7f7e24d7247f3 inittab: use more robust dev_exist() implementation Rework the dev_exist() function to use openat() in order to resolve the device file relative to the "/dev" directory. Drop the now unused dev_open() function. Signed-off-by: Jo-Philipp Wich --- diff --git a/inittab.c b/inittab.c index 622601a..528396e 100644 --- a/inittab.c +++ b/inittab.c @@ -65,30 +65,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)