diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a90a1b7687..7b502aa31d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1120,6 +1120,7 @@ virBitmapSetBit; virBitmapSize; virBitmapString; virBitmapToData; +virBitmapToDataBuf; # util/virbuffer.h diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c index bf905aba4d..9abc8073dc 100644 --- a/src/util/virbitmap.c +++ b/src/util/virbitmap.c @@ -492,25 +492,44 @@ virBitmapPtr virBitmapNewData(void *data, int len) * * Convert a bitmap to a chunk of data containing bits information. * Data consists of sequential bytes, with lower bytes containing - * lower bits. + * lower bits. This function allocates @data. * * Returns 0 on success, -1 otherwise. */ int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen) { int len; - unsigned long *l; - size_t i, j; - unsigned char *bytes; len = (bitmap->max_bit + CHAR_BIT - 1) / CHAR_BIT; if (VIR_ALLOC_N(*data, len) < 0) return -1; - bytes = *data; *dataLen = len; + virBitmapToDataBuf(bitmap, *data, *dataLen); + + return 0; +} + +/** + * virBitmapToDataBuf: + * @bytes: pointer to memory to fill + * @len: len of @bytes in byte + * + * Convert a bitmap to a chunk of data containing bits information. + * Data consists of sequential bytes, with lower bytes containing + * lower bits. + */ +void virBitmapToDataBuf(virBitmapPtr bitmap, + unsigned char *bytes, + size_t len) +{ + unsigned long *l; + size_t i, j; + + memset(bytes, 0, len); + /* htole64 is not provided by gnulib, so we do the conversion by hand */ l = bitmap->map; for (i = j = 0; i < len; i++, j++) { @@ -520,8 +539,6 @@ int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen) } bytes[i] = *l >> (j * CHAR_BIT); } - - return 0; } /** diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h index d326c6a6b0..47488de47c 100644 --- a/src/util/virbitmap.h +++ b/src/util/virbitmap.h @@ -88,6 +88,9 @@ virBitmapPtr virBitmapNewCopy(virBitmapPtr src) ATTRIBUTE_NONNULL(1); virBitmapPtr virBitmapNewData(void *data, int len) ATTRIBUTE_NONNULL(1); int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); + +void virBitmapToDataBuf(virBitmapPtr bitmap, unsigned char *data, size_t len) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2);