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

Martin Kletzander posted 23 patches 8 years, 10 months ago
[libvirt] [PATCH 12/23] virfile: Add helpers for reading simple values
Posted by Martin Kletzander 8 years, 10 months ago
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@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

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 12/23] virfile: Add helpers for reading simple values
Posted by Michal Privoznik 8 years, 10 months ago
On 24.03.2017 20:00, Martin Kletzander wrote:
> 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@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;
> +}

I'd expect some comment for these. Esp. on retvals.

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list