mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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:
1 parent
75f9160762
commit
869aeb7f02
3 files changed
+35
-43
No files matched your search
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||