summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorKarel Zak2018-05-17 16:25:47 +0200
committerKarel Zak2018-06-21 13:07:46 +0200
commitfcc4517cfd788b3743b6c0145a0395e9a6f8b1b5 (patch)
treeb6855e735ca386f1c1ff1af7d34694688ebb036b /lib
parentrfkill: don't use lib/path (diff)
downloadkernel-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.c33
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;
}