mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
virfile: Add helpers for reading simple values
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>
This commit is contained in:
parent
5b5fee00fd
commit
9fdd077de7
@ -1629,6 +1629,9 @@ virFileReadBufQuiet;
|
||||
virFileReadHeaderFD;
|
||||
virFileReadLimFD;
|
||||
virFileReadLink;
|
||||
virFileReadValueBitmap;
|
||||
virFileReadValueInt;
|
||||
virFileReadValueUint;
|
||||
virFileRelLinkPointsTo;
|
||||
virFileRemove;
|
||||
virFileRemoveLastComponent;
|
||||
|
@ -65,6 +65,7 @@
|
||||
#endif
|
||||
|
||||
#include "configmake.h"
|
||||
#include "intprops.h"
|
||||
#include "viralloc.h"
|
||||
#include "vircommand.h"
|
||||
#include "virerror.h"
|
||||
@ -3794,3 +3795,116 @@ virFileComparePaths(const char *p1, const char *p2)
|
||||
VIR_FREE(res2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virFileReadValueInt:
|
||||
* @path: file to read from
|
||||
* @value: pointer to int to be filled in with the value
|
||||
*
|
||||
* Read int from @path and put it into @value.
|
||||
*
|
||||
* Return -2 for non-existing file, -1 on other errors and 0 if everything went
|
||||
* fine.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virFileReadValueUint:
|
||||
* @path: file to read from
|
||||
* @value: pointer to unsigned int to be filled in with the value
|
||||
*
|
||||
* Read int from @path and put it into @value.
|
||||
*
|
||||
* Return -2 for non-existing file, -1 on other errors and 0 if everything went
|
||||
* fine.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* virFileReadValueBitmap:
|
||||
* @path: file to read from
|
||||
* @value: double pointer to virBitmap to be allocated and filled in with the
|
||||
* value
|
||||
*
|
||||
* Read int from @path and put it into @value.
|
||||
*
|
||||
* Return -2 for non-existing file, -1 on other errors and 0 if everything went
|
||||
* fine.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user