[libvirt] [PATCH 12/23] virfile: Add helpers for reading simple values

Martin Kletzander mkletzan at redhat.com
Fri Mar 24 19:00:00 UTC 2017


These helpers are doing just a read and covert the value, but they
properly size the read limit, handle additional whitespace characters,
and unify error reporting.

Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
---
 src/libvirt_private.syms |  3 ++
 src/util/virfile.c       | 83 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/util/virfile.h       |  6 ++++
 3 files changed, 92 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index ddeca239bb9c..27fbca589faa 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1626,6 +1626,9 @@ virFileReadBufQuiet;
 virFileReadHeaderFD;
 virFileReadLimFD;
 virFileReadLink;
+virFileReadValueBitmap;
+virFileReadValueInt;
+virFileReadValueUint;
 virFileRelLinkPointsTo;
 virFileRemove;
 virFileRemoveLastComponent;
diff --git a/src/util/virfile.c b/src/util/virfile.c
index 41cdca953b28..e0e6f3c91581 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -65,6 +65,7 @@
 #endif

 #include "configmake.h"
+#include "intprops.h"
 #include "viralloc.h"
 #include "vircommand.h"
 #include "virerror.h"
@@ -3794,3 +3795,85 @@ virFileComparePaths(const char *p1, const char *p2)
     VIR_FREE(res2);
     return ret;
 }
+
+
+int
+virFileReadValueInt(const char *path, int *value)
+{
+    char *str = NULL;
+    char *endp = NULL;
+
+    if (!virFileExists(path))
+        return -2;
+
+    if (virFileReadAll(path, INT_STRLEN_BOUND(*value), &str) < 0)
+        return -1;
+
+    if (virStrToLong_i(str, &endp, 10, value) < 0 ||
+        (endp && !c_isspace(*endp))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Invalid integer value '%s' in file '%s'"),
+                       str, path);
+        return -1;
+    }
+
+    VIR_FREE(str);
+
+    return 0;
+}
+
+
+int
+virFileReadValueUint(const char *path, unsigned int *value)
+{
+    char *str = NULL;
+    char *endp = NULL;
+
+    if (!virFileExists(path))
+        return -2;
+
+    if (virFileReadAll(path, INT_STRLEN_BOUND(*value), &str) < 0)
+        return -1;
+
+    if (virStrToLong_uip(str, &endp, 10, value) < 0 ||
+        (endp && !c_isspace(*endp))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Invalid unsigned integer value '%s' in file '%s'"),
+                       str, path);
+        return -1;
+    }
+
+    VIR_FREE(str);
+
+    return 0;
+}
+
+int
+virFileReadValueBitmap(const char *path,
+                       int maxlen,
+                       virBitmapPtr *value)
+{
+    char *buf = NULL;
+    int ret = -1;
+    char *tmp = NULL;
+
+    if (!virFileExists(path))
+        return -2;
+
+    if (virFileReadAll(path, maxlen, &buf) < 0)
+        goto cleanup;
+
+    /* trim optinoal newline at the end */
+    tmp = buf + strlen(buf) - 1;
+    if (*tmp == '\n')
+        *tmp = '\0';
+
+    *value = virBitmapParseUnlimited(buf);
+    if (!*value)
+        goto cleanup;
+
+    ret = 0;
+ cleanup:
+    VIR_FREE(buf);
+    return ret;
+}
diff --git a/src/util/virfile.h b/src/util/virfile.h
index b29feeeb1d87..ba1c57c06a8e 100644
--- a/src/util/virfile.h
+++ b/src/util/virfile.h
@@ -30,6 +30,7 @@
 # include <dirent.h>

 # include "internal.h"
+# include "virbitmap.h"
 # include "virstoragefile.h"

 typedef enum {
@@ -334,4 +335,9 @@ int virFileCopyACLs(const char *src,
                     const char *dst);

 int virFileComparePaths(const char *p1, const char *p2);
+
+int virFileReadValueInt(const char *path, int *value);
+int virFileReadValueUint(const char *path, unsigned int *value);
+int virFileReadValueBitmap(const char *path, int maxlen, virBitmapPtr *value);
+
 #endif /* __VIR_FILE_H */
-- 
2.12.0




More information about the libvir-list mailing list