This introduces new API virDomainShutdownFlags to allow domain destroying with flags, as the existing API virDomainShutdown misses flags. The set of flags is defined in virDomainShutdownFlagsValues enum, which is currently commented, because it is empty. Calling this API with no flags set (@flags == 0) is equivalent calling virDomainShutdown. --- include/libvirt/libvirt.h.in | 6 ++++ src/driver.h | 4 +++ src/libvirt.c | 54 ++++++++++++++++++++++++++++++++++++++++++ src/libvirt_public.syms | 1 + 4 files changed, 65 insertions(+), 0 deletions(-) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 0b7e35f..8785761 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -920,6 +920,10 @@ virConnectPtr virDomainGetConnect (virDomainPtr domain); * typedef enum { * } virDomainDestroyFlagsValues; */ +/* + * typedef enum{ + * } virDomainShutdownFlagsValues; + */ virDomainPtr virDomainCreateXML (virConnectPtr conn, const char *xmlDesc, unsigned int flags); @@ -933,6 +937,8 @@ virDomainPtr virDomainLookupByUUIDString (virConnectPtr conn, const char *uuid); int virDomainShutdown (virDomainPtr domain); +int virDomainShutdownFlags (virDomainPtr domain, + unsigned int flags); int virDomainReboot (virDomainPtr domain, unsigned int flags); int virDomainDestroy (virDomainPtr domain); diff --git a/src/driver.h b/src/driver.h index 4df5496..e6b057c 100644 --- a/src/driver.h +++ b/src/driver.h @@ -120,6 +120,9 @@ typedef int typedef int (*virDrvDomainShutdown) (virDomainPtr domain); typedef int + (*virDrvDomainShutdownFlags) (virDomainPtr domain, + unsigned int flags); +typedef int (*virDrvDomainReboot) (virDomainPtr domain, unsigned int flags); typedef int @@ -712,6 +715,7 @@ struct _virDriver { virDrvDomainSuspend domainSuspend; virDrvDomainResume domainResume; virDrvDomainShutdown domainShutdown; + virDrvDomainShutdownFlags domainShutdownFlags; virDrvDomainReboot domainReboot; virDrvDomainDestroy domainDestroy; virDrvDomainDestroyFlags domainDestroyFlags; diff --git a/src/libvirt.c b/src/libvirt.c index 7fb1bc1..a826c7b 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -2756,6 +2756,60 @@ error: } /** + * virDomainShutdownFlags: + * @domain: a domain object + * @flags: an OR'ed set of virDomainShutdownFlagsValues + * + * Shutdown a domain, the domain object is still usable there after but + * the domain OS is being stopped. Note that the guest OS may ignore the + * request. + * + * TODO: should we add an option for reboot, knowing it may not be doable + * in the general case ? + * + * Calling this function with no @flags set (equal to zero) + * is equivalent to calling virDomainShutdown. + * + * Returns 0 in case of success and -1 in case of failure. + */ +int +virDomainShutdownFlags(virDomainPtr domain, + unsigned int flags) +{ + virConnectPtr conn; + + VIR_DOMAIN_DEBUG(domain); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_DOMAIN(domain)) { + virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); + virDispatchError(NULL); + return -1; + } + if (domain->conn->flags & VIR_CONNECT_RO) { + virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__); + goto error; + } + + conn = domain->conn; + + if (conn->driver->domainShutdownFlags) { + int ret; + ret = conn->driver->domainShutdownFlags(domain, flags); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + virDispatchError(domain->conn); + return -1; +} + +/** * virDomainReboot: * @domain: a domain object * @flags: extra flags for the reboot operation, not used yet diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 9336df4..a8447d9 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -472,6 +472,7 @@ LIBVIRT_0.9.4 { virDomainSaveFlags; virDomainUndefineFlags; virDomainDestroyFlags; + virDomainShutdownFlags; } LIBVIRT_0.9.3; # .... define new API here using predicted next version number .... -- 1.7.5.rc3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list