virNetClientSendNonBlock;
virNetClientSendWithReply;
virNetClientSendWithReplyStream;
+virNetClientSetCloseCallback;
virNetClientSetSASLSession;
virNetClientSetTLSSession;
virKeepAlivePtr keepalive;
bool wantClose;
int closeReason;
+
+ virNetClientCloseFunc closeCb;
+ void *closeOpaque;
+ virFreeCallback closeFf;
};
}
+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);
return;
}
+ if (client->closeFf)
+ client->closeFf(client->closeOpaque);
+
for (i = 0 ; i < client->nprograms ; i++)
virNetClientProgramFree(client->programs[i]);
VIR_FREE(client->programs);
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--;
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;
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);