@@ -1598,6 +1598,7 @@ int xc_version(xc_interface *xch, int cmd, void *arg);
* free().
*/
char *xc_xenver_extraversion(xc_interface *xch);
+char *xc_xenver_capabilities(xc_interface *xch);
int xc_flask_op(xc_interface *xch, xen_flask_op_t *op);
@@ -156,3 +156,8 @@ char *xc_xenver_extraversion(xc_interface *xch)
{
return varbuf_simple_string(xch, XENVER_extraversion2);
}
+
+char *xc_xenver_capabilities(xc_interface *xch)
+{
+ return varbuf_simple_string(xch, XENVER_capabilities2);
+}
@@ -584,7 +584,6 @@ const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx)
union {
xen_compile_info_t xen_cc;
xen_changeset_info_t xen_chgset;
- xen_capabilities_info_t xen_caps;
xen_platform_parameters_t p_parms;
xen_commandline_t xen_commandline;
xen_build_id_t build_id;
@@ -608,8 +607,7 @@ const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx)
info->compile_domain = libxl__strdup(NOGC, u.xen_cc.compile_domain);
info->compile_date = libxl__strdup(NOGC, u.xen_cc.compile_date);
- xc_version(ctx->xch, XENVER_capabilities, &u.xen_caps);
- info->capabilities = libxl__strdup(NOGC, u.xen_caps);
+ info->capabilities = xc_xenver_capabilities(ctx->xch);
xc_version(ctx->xch, XENVER_changeset, &u.xen_chgset);
info->changeset = libxl__strdup(NOGC, u.xen_chgset);
@@ -1062,9 +1062,23 @@ CAMLprim value stub_xc_version_changeset(value xch_val)
CAMLprim value stub_xc_version_capabilities(value xch_val)
{
- xen_capabilities_info_t ci;
+ CAMLparam1(xch_val);
+ CAMLlocal1(result);
+ xc_interface *xch = xch_of_val(xch_val);
+ char *capabilities;
+
+ caml_enter_blocking_section();
+ capabilities = xc_xenver_capabilities(xch);
+ caml_leave_blocking_section();
- return xc_version_single_string(xch_val, XENVER_capabilities, &ci);
+ if (!capabilities)
+ failwith_xc(xch);
+
+ result = caml_copy_string(capabilities);
+
+ free(capabilities);
+
+ CAMLreturn(result);
}