[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] tools: Introduce a xc_xenver_buildid() wrapper
commit 869aeb7f0253cdcf55b85b5a2196e6332c2d4d7a Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Tue Jan 17 12:52:01 2023 +0000 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Fri Dec 20 22:44:42 2024 +0000 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 libxl bug for cases when the buildid is longer than 4092 bytes. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Acked-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> --- 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 3aeff3f0e9..5bb41c9c53 100644 --- a/tools/include/xenctrl.h +++ b/tools/include/xenctrl.h @@ -1581,6 +1581,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 02f6e9551b..54d1b92966 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 04f037f3c1..a1fe16274d 100644 --- a/tools/libs/light/libxl.c +++ b/tools/libs/light/libxl.c @@ -546,38 +546,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); @@ -587,7 +555,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) @@ -614,17 +581,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; -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |