|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 6/6] tools: Introduce a xc_xenver_buildid() wrapper
... which converts binary content to hex automatically.
Update libxl to match. No API/ABI change.
This removes a latent bug for cases when the buildid is longer than 4092
bytes.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Wei Liu <wl@xxxxxxx>
CC: Anthony PERARD <anthony.perard@xxxxxxxxxx>
CC: Juergen Gross <jgross@xxxxxxxx>
---
tools/include/xenctrl.h | 1 +
tools/libs/ctrl/xc_version.c | 33 +++++++++++++++++++++++++++++++++
tools/libs/light/libxl.c | 44 +-------------------------------------------
3 files changed, 35 insertions(+), 43 deletions(-)
diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h
index fd80a509197d..48296930b892 100644
--- a/tools/include/xenctrl.h
+++ b/tools/include/xenctrl.h
@@ -1612,6 +1612,7 @@ char *xc_xenver_extraversion(xc_interface *xch);
char *xc_xenver_capabilities(xc_interface *xch);
char *xc_xenver_changeset(xc_interface *xch);
char *xc_xenver_commandline(xc_interface *xch);
+char *xc_xenver_buildid(xc_interface *xch);
int xc_flask_op(xc_interface *xch, xen_flask_op_t *op);
diff --git a/tools/libs/ctrl/xc_version.c b/tools/libs/ctrl/xc_version.c
index 02f6e9551b57..54d1b9296696 100644
--- a/tools/libs/ctrl/xc_version.c
+++ b/tools/libs/ctrl/xc_version.c
@@ -171,3 +171,36 @@ char *xc_xenver_commandline(xc_interface *xch)
{
return varbuf_simple_string(xch, XENVER_commandline2);
}
+
+static void str2hex(char *dst, const unsigned char *src, size_t n)
+{
+ static const unsigned char hex[] = "0123456789abcdef";
+
+ for ( ; n; n-- )
+ {
+ unsigned char c = *src++;
+
+ *dst++ = hex[c >> 4];
+ *dst++ = hex[c & 0xf];
+ }
+}
+
+char *xc_xenver_buildid(xc_interface *xch)
+{
+ xen_varbuf_t *hbuf = varbuf_op(xch, XENVER_build_id);
+ char *res;
+
+ if ( !hbuf )
+ return NULL;
+
+ res = malloc((hbuf->len * 2) + 1);
+ if ( res )
+ {
+ str2hex(res, hbuf->buf, hbuf->len);
+ res[hbuf->len * 2] = '\0';
+ }
+
+ xencall_free_buffer(xch->xcall, hbuf);
+
+ return res;
+}
diff --git a/tools/libs/light/libxl.c b/tools/libs/light/libxl.c
index 3f906a47148b..5512f444aca2 100644
--- a/tools/libs/light/libxl.c
+++ b/tools/libs/light/libxl.c
@@ -545,38 +545,6 @@ libxl_numainfo *libxl_get_numainfo(libxl_ctx *ctx, int *nr)
return ret;
}
-static int libxl__xc_version_wrap(libxl__gc *gc, libxl_version_info *info,
- xen_build_id_t *build)
-{
- int r;
-
- r = xc_version(CTX->xch, XENVER_build_id, build);
- switch (r) {
- case -EPERM:
- case -ENODATA:
- case 0:
- info->build_id = libxl__strdup(NOGC, "");
- break;
-
- case -ENOBUFS:
- break;
-
- default:
- if (r > 0) {
- unsigned int i;
-
- info->build_id = libxl__zalloc(NOGC, (r * 2) + 1);
-
- for (i = 0; i < r ; i++)
- snprintf(&info->build_id[i * 2], 3, "%02hhx", build->buf[i]);
-
- r = 0;
- }
- break;
- }
- return r;
-}
-
const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx)
{
GC_INIT(ctx);
@@ -586,7 +554,6 @@ const libxl_version_info* libxl_get_version_info(libxl_ctx
*ctx)
xen_build_id_t build_id;
} u;
long xen_version;
- int r;
libxl_version_info *info = &ctx->version_info;
if (info->xen_version_extra != NULL)
@@ -613,17 +580,8 @@ const libxl_version_info* libxl_get_version_info(libxl_ctx
*ctx)
info->pagesize = xc_version(ctx->xch, XENVER_pagesize, NULL);
info->commandline = xc_xenver_commandline(ctx->xch);
+ info->build_id = xc_xenver_buildid(ctx->xch);
- u.build_id.len = sizeof(u) - sizeof(u.build_id);
- r = libxl__xc_version_wrap(gc, info, &u.build_id);
- if (r == -ENOBUFS) {
- xen_build_id_t *build_id;
-
- build_id = libxl__zalloc(gc, info->pagesize);
- build_id->len = info->pagesize - sizeof(*build_id);
- r = libxl__xc_version_wrap(gc, info, build_id);
- if (r) LOGEV(ERROR, r, "getting build_id");
- }
out:
GC_FREE;
return info;
--
2.11.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |