From f2c77756933f22981c1202c039e7f7e24d7247f3 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Tue, 17 May 2016 17:42:10 +0200 Subject: [PATCH] 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 --- inittab.c | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) 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) -- 2.11.0