diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index e876970..ae93bd1 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -42,6 +42,21 @@ int is_hvm(struct libxl_ctx *ctx, uint32_t domid) return !!(info.flags & XEN_DOMINF_hvm_guest); } +int get_shutdown_reason(struct libxl_ctx *ctx, uint32_t domid) +{ + xc_domaininfo_t info; + int ret; + + ret = xc_domain_getinfolist(ctx->xch, domid, 1, &info); + if (ret != 1) + return -1; + if (info.domain != domid) + return -1; + if (!(info.flags & XEN_DOMINF_shutdown)) + return -1; + return dominfo_get_shutdown_reason(&info); +} + int build_pre(struct libxl_ctx *ctx, uint32_t domid, libxl_domain_build_info *info, libxl_domain_build_state *state) { diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 3519eac..294d7a7 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -124,6 +124,9 @@ char **libxl_xs_directory(struct libxl_ctx *ctx, xs_transaction_t t, char *path, /* from xl_dom */ int is_hvm(struct libxl_ctx *ctx, uint32_t domid); +int get_shutdown_reason(struct libxl_ctx *ctx, uint32_t domid); +#define dominfo_get_shutdown_reason(info) (((info)->flags >> XEN_DOMINF_shutdownshift) & XEN_DOMINF_shutdownmask) + int build_pre(struct libxl_ctx *ctx, uint32_t domid, libxl_domain_build_info *info, libxl_domain_build_state *state); int build_post(struct libxl_ctx *ctx, uint32_t domid,