From: Karel Zak Date: Thu, 17 May 2018 14:25:47 +0000 (+0200) Subject: lib/path: make ul_path_read_ usable with NULL handler X-Git-Tag: v2.33-rc1~186 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fcc4517cfd788b3743b6c0145a0395e9a6f8b1b5;p=thirdparty%2Futil-linux.git lib/path: make ul_path_read_ usable with NULL handler Signed-off-by: Karel Zak --- diff --git a/lib/path.c b/lib/path.c index 76b672a7f9..b1e4d21f7d 100644 --- a/lib/path.c +++ b/lib/path.c @@ -2,9 +2,15 @@ * Simple functions to access files. Paths can be globally prefixed to read * data from an alternative source (e.g. a /proc dump for regression tests). * + * The paths is possible to format by printf-like way for functions with "f" + * postfix in the name (e.g. readf, openf, ... ul_path_readf_u64()). + * + * The ul_path_read_* API is possible to use without path_cxt handler. In this + * case is not possible to use global prefix and printf-like formatting. + * * No copyright is claimed. This code is in the public domain; do with * it what you wish. - + * * Written by Karel Zak [February 2018] */ #include @@ -273,20 +279,25 @@ int ul_path_accessf(struct path_cxt *pc, int mode, const char *path, ...) int ul_path_open(struct path_cxt *pc, int flags, const char *path) { - int dir, fd; - - dir = ul_path_get_dirfd(pc); - if (dir < 0) - return dir; + int fd; - fd = openat(dir, path, flags); + if (!pc) { + fd = open(path, flags); + DBG(CXT, ul_debug("opening '%s'", path)); + } else { + int dir = ul_path_get_dirfd(pc); + if (dir < 0) + return dir; - if (fd < 0 && errno == ENOENT - && pc->redirect_on_enoent - && pc->redirect_on_enoent(pc, path, &dir) == 0) fd = openat(dir, path, flags); - DBG(CXT, ul_debugobj(pc, "opening '%s'", path)); + if (fd < 0 && errno == ENOENT + && pc->redirect_on_enoent + && pc->redirect_on_enoent(pc, path, &dir) == 0) + fd = openat(dir, path, flags); + + DBG(CXT, ul_debugobj(pc, "opening '%s'", path)); + } return fd; }