Add callback to virNetClient to be invoked on connection close

Allow detection of socket close in virNetClient via a callback
function, triggered on any condition that causes the socket to
be closed.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2012-07-18 17:10:22 +01:00
parent e5a1bee07a
commit 0f7f4b160b
3 changed files with 41 additions and 4 deletions

View File

@ -1319,6 +1319,7 @@ virNetClientSendNoReply;
virNetClientSendNonBlock;
virNetClientSendWithReply;
virNetClientSendWithReplyStream;
virNetClientSetCloseCallback;
virNetClientSetSASLSession;
virNetClientSetTLSSession;

View File

@ -102,6 +102,10 @@ struct _virNetClient {
virKeepAlivePtr keepalive;
bool wantClose;
int closeReason;
virNetClientCloseFunc closeCb;
void *closeOpaque;
virFreeCallback closeFf;
};
@ -125,6 +129,19 @@ static void virNetClientUnlock(virNetClientPtr client)
}
void virNetClientSetCloseCallback(virNetClientPtr client,
virNetClientCloseFunc cb,
void *opaque,
virFreeCallback ff)
{
virNetClientLock(client);
client->closeCb = cb;
client->closeOpaque = opaque;
client->closeFf = ff;
virNetClientUnlock(client);
}
static void virNetClientIncomingEvent(virNetSocketPtr sock,
int events,
void *opaque);
@ -463,6 +480,9 @@ void virNetClientFree(virNetClientPtr client)
return;
}
if (client->closeFf)
client->closeFf(client->closeOpaque);
for (i = 0 ; i < client->nprograms ; i++)
virNetClientProgramFree(client->programs[i]);
VIR_FREE(client->programs);
@ -519,12 +539,19 @@ virNetClientCloseLocked(virNetClientPtr client)
client->keepalive = NULL;
client->wantClose = false;
if (ka) {
if (ka || client->closeCb) {
virNetClientCloseFunc closeCb = client->closeCb;
void *closeOpaque = client->closeOpaque;
int closeReason = client->closeReason;
client->refs++;
virNetClientUnlock(client);
virKeepAliveStop(ka);
virKeepAliveFree(ka);
if (ka) {
virKeepAliveStop(ka);
virKeepAliveFree(ka);
}
if (closeCb)
closeCb(client, closeReason, closeOpaque);
virNetClientLock(client);
client->refs--;
@ -534,7 +561,7 @@ virNetClientCloseLocked(virNetClientPtr client)
static void virNetClientCloseInternal(virNetClientPtr client,
int reason)
{
VIR_DEBUG("client=%p", client);
VIR_DEBUG("client=%p wantclose=%d", client, client ? client->wantClose : false);
if (!client)
return;

View File

@ -51,6 +51,15 @@ virNetClientPtr virNetClientNewSSH(const char *nodename,
virNetClientPtr virNetClientNewExternal(const char **cmdargv);
typedef void (*virNetClientCloseFunc)(virNetClientPtr client,
int reason,
void *opaque);
void virNetClientSetCloseCallback(virNetClientPtr client,
virNetClientCloseFunc cb,
void *opaque,
virFreeCallback ff);
void virNetClientRef(virNetClientPtr client);
int virNetClientGetFD(virNetClientPtr client);