]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/path: make ul_path_read_ usable with NULL handler
authorKarel Zak <kzak@redhat.com>
Thu, 17 May 2018 14:25:47 +0000 (16:25 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 21 Jun 2018 11:07:46 +0000 (13:07 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
lib/path.c

index 76b672a7f90eef3d2b29ef0ead90ce0c93c0c630..b1e4d21f7d79c504bffc62fcd1d10232ccb785b0 100644 (file)
@@ -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;
 }