diff options
author | Karel Zak | 2018-05-17 16:25:47 +0200 |
---|---|---|
committer | Karel Zak | 2018-06-21 13:07:46 +0200 |
commit | fcc4517cfd788b3743b6c0145a0395e9a6f8b1b5 (patch) | |
tree | b6855e735ca386f1c1ff1af7d34694688ebb036b /lib | |
parent | rfkill: don't use lib/path (diff) | |
download | kernel-qcow2-util-linux-fcc4517cfd788b3743b6c0145a0395e9a6f8b1b5.tar.gz kernel-qcow2-util-linux-fcc4517cfd788b3743b6c0145a0395e9a6f8b1b5.tar.xz kernel-qcow2-util-linux-fcc4517cfd788b3743b6c0145a0395e9a6f8b1b5.zip |
lib/path: make ul_path_read_ usable with NULL handler
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/path.c | 33 |
1 files changed, 22 insertions, 11 deletions
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 <kzak@redhat.com> [February 2018] */ #include <stdarg.h> @@ -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; } |