summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/path.h4
-rw-r--r--lib/path.c29
2 files changed, 33 insertions, 0 deletions
diff --git a/include/path.h b/include/path.h
index ebdb58d05..76c18e103 100644
--- a/include/path.h
+++ b/include/path.h
@@ -74,6 +74,10 @@ int ul_path_read_string(struct path_cxt *pc, char **str, const char *path);
int ul_path_readf_string(struct path_cxt *pc, char **str, const char *path, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));
+int ul_path_read_buffer(struct path_cxt *pc, char *buf, size_t bufsz, const char *path);
+int ul_path_readf_buffer(struct path_cxt *pc, char *buf, size_t bufsz, const char *path, ...)
+ __attribute__ ((__format__ (__printf__, 4, 5)));
+
int ul_path_scanf(struct path_cxt *pc, const char *path, const char *fmt, ...);
int ul_path_scanff(struct path_cxt *pc, const char *path, va_list ap, const char *fmt, ...)
__attribute__ ((__format__ (__scanf__, 4, 5)));
diff --git a/lib/path.c b/lib/path.c
index 63f19af9a..76b672a7f 100644
--- a/lib/path.c
+++ b/lib/path.c
@@ -565,6 +565,35 @@ int ul_path_readf_string(struct path_cxt *pc, char **str, const char *path, ...)
return ul_path_read_string(pc, str, p);
}
+int ul_path_read_buffer(struct path_cxt *pc, char *buf, size_t bufsz, const char *path)
+{
+ int rc = ul_path_read(pc, buf, bufsz - 1, path);
+ if (rc < 0)
+ return rc;;
+
+ /* Remove tailing newline (usuall in sysfs) */
+ if (rc > 0 && *(buf + rc - 1) == '\n')
+ --rc;
+
+ buf[rc] = '\0';
+ return rc;
+}
+
+int ul_path_readf_buffer(struct path_cxt *pc, char *buf, size_t bufsz, const char *path, ...)
+{
+ const char *p;
+ va_list ap;
+
+ va_start(ap, path);
+ p = ul_path_mkpath(pc, path, ap);
+ va_end(ap);
+
+ if (!p)
+ return -EINVAL;
+
+ return ul_path_read_buffer(pc, buf, bufsz, p);
+}
+
int ul_path_scanf(struct path_cxt *pc, const char *path, const char *fmt, ...)
{
FILE *f;