diff options
| author | Jo-Philipp Wich | 2016-05-17 15:42:10 +0000 |
|---|---|---|
| committer | John Crispin | 2016-05-17 08:40:40 +0000 |
| commit | f2c77756933f22981c1202c039e7f7e24d7247f3 (patch) | |
| tree | 026dfa02deb64d862f1ffbe361d43b5616689ea5 | |
| parent | 8c24d75f610f85397273c5332657ba77e85b4323 (diff) | |
| download | procd-f2c77756933f22981c1202c039e7f7e24d7247f3.tar.gz | |
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 <jo@mein.io>
| -rw-r--r-- | inittab.c | 31 |
1 files changed, 12 insertions, 19 deletions
@@ -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) |