From afdf014f4ff16fcf55647cfbbd0d9d74d355ec82 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Fri, 23 Sep 2011 08:47:59 +0200 Subject: [PATCH] Introduce virConnectIsAlive API This API can be used to check if the socket associated with virConnectPtr is still open or it was closed (probably because keepalive protocol timed out). If there the connection is local (i.e., no socket is associated with the connection, it is trivially always alive. --- include/libvirt/libvirt.h.in | 1 + src/driver.h | 3 +++ src/libvirt.c | 36 ++++++++++++++++++++++++++++++++++++ src/libvirt_public.syms | 1 + 4 files changed, 41 insertions(+) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 89c42d5ad..0787f1824 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -2655,6 +2655,7 @@ int virInterfaceIsActive(virInterfacePtr iface); int virConnectIsEncrypted(virConnectPtr conn); int virConnectIsSecure(virConnectPtr conn); +int virConnectIsAlive(virConnectPtr conn); /* * CPU specification API diff --git a/src/driver.h b/src/driver.h index 479796093..9e78257e3 100644 --- a/src/driver.h +++ b/src/driver.h @@ -508,6 +508,8 @@ typedef int (*virDrvConnectIsEncrypted)(virConnectPtr conn); typedef int (*virDrvConnectIsSecure)(virConnectPtr conn); +typedef int + (*virDrvConnectIsAlive)(virConnectPtr conn); typedef int (*virDrvDomainIsActive)(virDomainPtr dom); typedef int @@ -904,6 +906,7 @@ struct _virDriver { virDrvDomainBlockJobSetSpeed domainBlockJobSetSpeed; virDrvDomainBlockPull domainBlockPull; virDrvSetKeepAlive setKeepAlive; + virDrvConnectIsAlive isAlive; }; typedef int diff --git a/src/libvirt.c b/src/libvirt.c index ff14f235c..b428fe63a 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -17246,3 +17246,39 @@ error: virDispatchError(conn); return -1; } + +/** + * virConnectIsAlive: + * @conn: pointer to the connection object + * + * Determine if the connection to the hypervisor is still alive + * + * A connection will be classed as alive if it is either local, or running + * over a channel (TCP or UNIX socket) which is not closed. + * + * Returns 1 if alive, 0 if dead, -1 on error + */ +int virConnectIsAlive(virConnectPtr conn) +{ + VIR_DEBUG("conn=%p", conn); + + virResetLastError(); + + if (!VIR_IS_CONNECT(conn)) { + virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__); + virDispatchError(NULL); + return -1; + } + if (conn->driver->isAlive) { + int ret; + ret = conn->driver->isAlive(conn); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__); +error: + virDispatchError(conn); + return -1; +} diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 2331f7621..6ba1526b2 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -500,6 +500,7 @@ LIBVIRT_0.9.7 { LIBVIRT_0.9.8 { global: + virConnectIsAlive; virConnectSetKeepAlive; } LIBVIRT_0.9.7; -- 2.39.5