From fcc4517cfd788b3743b6c0145a0395e9a6f8b1b5 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 17 May 2018 16:25:47 +0200 Subject: lib/path: make ul_path_read_ usable with NULL handler Signed-off-by: Karel Zak --- lib/path.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'lib') diff --git a/lib/path.c b/lib/path.c index 76b672a7f..b1e4d21f7 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; } -- cgit v1.2.3-55-g7522