From 8f53c184ea06bb1f060ce9ad30bc24893ff9c950 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Wed, 9 Mar 2011 17:03:34 +0000 Subject: [PATCH] libxl: introduce flexarray_append_pair Introduce flexarray_append_pair: a simple syntactic sugar to add a pair of pointers to a flexarray, very useful when adding pairs of strings to xenstore. Replace flexarray_vappend calls (and one pair of flexarray_append) with flexarray_append_pair calls when dealing with flexarrays that are going to be used with libxl__xs_kvs_of_flexarray: NULL is a valid pointer value in these cases while flexarray_vappend uses NULL as vargs terminator, so the old code is buggy. Signed-off-by: Stefano Stabellini Acked-by: Ian Jackson Committed-by: Ian Jackson --- tools/libxl/flexarray.c | 8 ++++++++ tools/libxl/flexarray.h | 1 + tools/libxl/libxl.c | 31 +++++++++++++++---------------- tools/libxl/libxl_pci.c | 23 +++++++++++------------ 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/tools/libxl/flexarray.c b/tools/libxl/flexarray.c index 724eabd52f..c89c23e159 100644 --- a/tools/libxl/flexarray.c +++ b/tools/libxl/flexarray.c @@ -69,6 +69,14 @@ int flexarray_append(flexarray_t *array, void *ptr) return flexarray_set(array, array->count, ptr); } +int flexarray_append_pair(flexarray_t *array, void *ptr1, void *ptr2) +{ + int rc = flexarray_append(array, ptr1); + if (!rc) + rc = flexarray_append(array, ptr2); + return rc; +} + int flexarray_vappend(flexarray_t *array, ...) { va_list va; diff --git a/tools/libxl/flexarray.h b/tools/libxl/flexarray.h index 30b8a1766b..350fbf4a9c 100644 --- a/tools/libxl/flexarray.h +++ b/tools/libxl/flexarray.h @@ -28,6 +28,7 @@ _hidden void flexarray_free(flexarray_t *array); _hidden int flexarray_grow(flexarray_t *array, int extents); _hidden int flexarray_set(flexarray_t *array, unsigned int index, void *ptr); _hidden int flexarray_append(flexarray_t *array, void *ptr); +_hidden int flexarray_append_pair(flexarray_t *array, void *ptr1, void *ptr2); _hidden int flexarray_vappend(flexarray_t *array, ...); _hidden int flexarray_get(flexarray_t *array, int index, void **ptr); diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index d0b2f74912..6df2f78be7 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1887,27 +1887,26 @@ int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb) device.domid = vfb->domid; device.kind = DEVICE_VFB; - flexarray_vappend(back, "frontend-id", libxl__sprintf(&gc, "%d", vfb->domid), NULL); - flexarray_vappend(back, "online", "1", NULL); - flexarray_vappend(back, "state", libxl__sprintf(&gc, "%d", 1), NULL); - flexarray_vappend(back, "domain", libxl__domid_to_name(&gc, domid), NULL); - flexarray_vappend(back, "vnc", libxl__sprintf(&gc, "%d", vfb->vnc), NULL); - flexarray_vappend(back, "vnclisten", vfb->vnclisten, NULL); - flexarray_append(back, "vncpasswd"); - flexarray_append(back, vfb->vncpasswd); - flexarray_vappend(back, "vncdisplay", libxl__sprintf(&gc, "%d", vfb->vncdisplay), NULL); - flexarray_vappend(back, "vncunused", libxl__sprintf(&gc, "%d", vfb->vncunused), NULL); - flexarray_vappend(back, "sdl", libxl__sprintf(&gc, "%d", vfb->sdl), NULL); - flexarray_vappend(back, "opengl", libxl__sprintf(&gc, "%d", vfb->opengl), NULL); + flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", vfb->domid)); + flexarray_append_pair(back, "online", "1"); + flexarray_append_pair(back, "state", libxl__sprintf(&gc, "%d", 1)); + flexarray_append_pair(back, "domain", libxl__domid_to_name(&gc, domid)); + flexarray_append_pair(back, "vnc", libxl__sprintf(&gc, "%d", vfb->vnc)); + flexarray_append_pair(back, "vnclisten", vfb->vnclisten); + flexarray_append_pair(back, "vncpasswd", vfb->vncpasswd); + flexarray_append_pair(back, "vncdisplay", libxl__sprintf(&gc, "%d", vfb->vncdisplay)); + flexarray_append_pair(back, "vncunused", libxl__sprintf(&gc, "%d", vfb->vncunused)); + flexarray_append_pair(back, "sdl", libxl__sprintf(&gc, "%d", vfb->sdl)); + flexarray_append_pair(back, "opengl", libxl__sprintf(&gc, "%d", vfb->opengl)); if (vfb->xauthority) { - flexarray_vappend(back, "xauthority", vfb->xauthority, NULL); + flexarray_append_pair(back, "xauthority", vfb->xauthority); } if (vfb->display) { - flexarray_vappend(back, "display", vfb->display, NULL); + flexarray_append_pair(back, "display", vfb->display); } - flexarray_vappend(front, "backend-id", libxl__sprintf(&gc, "%d", vfb->backend_domid), NULL); - flexarray_vappend(front, "state", libxl__sprintf(&gc, "%d", 1), NULL); + flexarray_append_pair(front, "backend-id", libxl__sprintf(&gc, "%d", vfb->backend_domid)); + flexarray_append_pair(front, "state", libxl__sprintf(&gc, "%d", 1)); libxl__device_generic_add(ctx, &device, libxl__xs_kvs_of_flexarray(&gc, back, back->count), diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index 6a9cdba02b..56ec063888 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -228,10 +228,10 @@ static void libxl_create_pci_backend_device(libxl__gc *gc, flexarray_t *back, in flexarray_append(back, libxl__sprintf(gc, "dev-%d", num)); flexarray_append(back, libxl__sprintf(gc, PCI_BDF, pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func)); if (pcidev->vdevfn) - flexarray_vappend(back, libxl__sprintf(gc, "vdevfn-%d", num), libxl__sprintf(gc, "%x", pcidev->vdevfn), NULL); + flexarray_append_pair(back, libxl__sprintf(gc, "vdevfn-%d", num), libxl__sprintf(gc, "%x", pcidev->vdevfn)); flexarray_append(back, libxl__sprintf(gc, "opts-%d", num)); flexarray_append(back, libxl__sprintf(gc, "msitranslate=%d,power_mgmt=%d", pcidev->msitranslate, pcidev->power_mgmt)); - flexarray_vappend(back, libxl__sprintf(gc, "state-%d", num), libxl__sprintf(gc, "%d", 1), NULL); + flexarray_append_pair(back, libxl__sprintf(gc, "state-%d", num), libxl__sprintf(gc, "%d", 1)); } static int libxl_create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int num) @@ -261,18 +261,17 @@ static int libxl_create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_ device.domid = domid; device.kind = DEVICE_PCI; - flexarray_vappend(back, "frontend-id", libxl__sprintf(gc, "%d", domid), - "online", "1", "state", libxl__sprintf(gc, "%d", 1), - "domain", libxl__domid_to_name(gc, domid), NULL); + flexarray_append_pair(back, "frontend-id", libxl__sprintf(gc, "%d", domid)); + flexarray_append_pair(back, "online", "1"); + flexarray_append_pair(back, "state", libxl__sprintf(gc, "%d", 1)); + flexarray_append_pair(back, "domain", libxl__domid_to_name(gc, domid)); for (i = 0; i < num; i++, pcidev++) libxl_create_pci_backend_device(gc, back, i, pcidev); - flexarray_vappend(back, "num_devs", libxl__sprintf(gc, "%d", num), NULL); - - flexarray_vappend(front, - "backend-id", libxl__sprintf(gc, "%d", 0), - "state", libxl__sprintf(gc, "%d", 1), NULL); + flexarray_append_pair(back, "num_devs", libxl__sprintf(gc, "%d", num)); + flexarray_append_pair(front, "backend-id", libxl__sprintf(gc, "%d", 0)); + flexarray_append_pair(front, "state", libxl__sprintf(gc, "%d", 1)); libxl__device_generic_add(ctx, &device, libxl__xs_kvs_of_flexarray(gc, back, back->count), @@ -311,9 +310,9 @@ static int libxl_device_pci_add_xenstore(libxl__gc *gc, uint32_t domid, libxl_de LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Adding new pci device to xenstore"); num = atoi(num_devs); libxl_create_pci_backend_device(gc, back, num, pcidev); - flexarray_vappend(back, "num_devs", libxl__sprintf(gc, "%d", num + 1), NULL); + flexarray_append_pair(back, "num_devs", libxl__sprintf(gc, "%d", num + 1)); if (!starting) - flexarray_vappend(back, "state", libxl__sprintf(gc, "%d", 7), NULL); + flexarray_append_pair(back, "state", libxl__sprintf(gc, "%d", 7)); retry_transaction: t = xs_transaction_start(ctx->xsh); -- 2.39.5