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@citrix.com>
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
Andrew Cooper committed 2024-12-20 22:44:42 +00:00
1 parent 75f9160762
commit 869aeb7f02
3 files changed
+35 -43

No files matched your search

+1
View File
@@ -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);
+33
View File
@@ -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;
}
+1 -43
View File
@@ -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;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.