aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/rpc/virnetserverclient.c')
-rw-r--r--src/rpc/virnetserverclient.c88
1 files changed, 43 insertions, 45 deletions
diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c
index 6ae4e2520..f3eb61adf 100644
--- a/src/rpc/virnetserverclient.c
+++ b/src/rpc/virnetserverclient.c
@@ -103,13 +103,14 @@ struct _virNetServerClient
virNetServerClientCloseFunc privateDataCloseFunc;
virKeepAlivePtr keepalive;
- int keepaliveFilter;
};
static void virNetServerClientDispatchEvent(virNetSocketPtr sock, int events, void *opaque);
static void virNetServerClientUpdateEvent(virNetServerClientPtr client);
static void virNetServerClientDispatchRead(virNetServerClientPtr client);
+static int virNetServerClientSendMessageLocked(virNetServerClientPtr client,
+ virNetMessagePtr msg);
static void virNetServerClientLock(virNetServerClientPtr client)
{
@@ -364,7 +365,6 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
client->readonly = readonly;
client->tlsCtxt = tls;
client->nrequests_max = nrequests_max;
- client->keepaliveFilter = -1;
client->sockTimer = virEventAddTimeout(-1, virNetServerClientSockTimerFunc,
client, NULL);
@@ -644,9 +644,6 @@ void virNetServerClientClose(virNetServerClientPtr client)
return;
}
- if (client->keepaliveFilter >= 0)
- virNetServerClientRemoveFilterLocked(client, client->keepaliveFilter);
-
if (client->keepalive) {
virKeepAliveStop(client->keepalive);
ka = client->keepalive;
@@ -844,6 +841,7 @@ readmore:
} else {
/* Grab the completed message */
virNetMessagePtr msg = client->rx;
+ virNetMessagePtr response = NULL;
virNetServerClientFilterPtr filter;
size_t i;
@@ -894,23 +892,35 @@ readmore:
msg->header.prog, msg->header.vers, msg->header.proc,
msg->header.type, msg->header.status, msg->header.serial);
+ if (virKeepAliveCheckMessage(client->keepalive, msg, &response)) {
+ virNetMessageFree(msg);
+ client->nrequests--;
+ msg = NULL;
+
+ if (response &&
+ virNetServerClientSendMessageLocked(client, response) < 0)
+ virNetMessageFree(response);
+ }
+
/* Maybe send off for queue against a filter */
- filter = client->filters;
- while (filter) {
- int ret = filter->func(client, msg, filter->opaque);
- if (ret < 0) {
- virNetMessageFree(msg);
- msg = NULL;
- if (ret < 0)
- client->wantClose = true;
- break;
- }
- if (ret > 0) {
- msg = NULL;
- break;
- }
+ if (msg) {
+ filter = client->filters;
+ while (filter) {
+ int ret = filter->func(client, msg, filter->opaque);
+ if (ret < 0) {
+ virNetMessageFree(msg);
+ msg = NULL;
+ if (ret < 0)
+ client->wantClose = true;
+ break;
+ }
+ if (ret > 0) {
+ msg = NULL;
+ break;
+ }
- filter = filter->next;
+ filter = filter->next;
+ }
}
/* Send off to for normal dispatch to workers */
@@ -1117,16 +1127,15 @@ virNetServerClientDispatchEvent(virNetSocketPtr sock, int events, void *opaque)
}
-int virNetServerClientSendMessage(virNetServerClientPtr client,
- virNetMessagePtr msg)
+static int
+virNetServerClientSendMessageLocked(virNetServerClientPtr client,
+ virNetMessagePtr msg)
{
int ret = -1;
VIR_DEBUG("msg=%p proc=%d len=%zu offset=%zu",
msg, msg->header.proc,
msg->bufferLength, msg->bufferOffset);
- virNetServerClientLock(client);
-
msg->donefds = 0;
if (client->sock && !client->wantClose) {
PROBE(RPC_SERVER_CLIENT_MSG_TX_QUEUE,
@@ -1140,6 +1149,16 @@ int virNetServerClientSendMessage(virNetServerClientPtr client,
ret = 0;
}
+ return ret;
+}
+
+int virNetServerClientSendMessage(virNetServerClientPtr client,
+ virNetMessagePtr msg)
+{
+ int ret;
+
+ virNetServerClientLock(client);
+ ret = virNetServerClientSendMessageLocked(client, msg);
virNetServerClientUnlock(client);
return ret;
@@ -1176,20 +1195,6 @@ virNetServerClientFreeCB(void *opaque)
virNetServerClientFree(opaque);
}
-static int
-virNetServerClientKeepAliveFilter(virNetServerClientPtr client,
- virNetMessagePtr msg,
- void *opaque ATTRIBUTE_UNUSED)
-{
- if (virKeepAliveCheckMessage(client->keepalive, msg)) {
- virNetMessageFree(msg);
- client->nrequests--;
- return 1;
- }
-
- return 0;
-}
-
int
virNetServerClientInitKeepAlive(virNetServerClientPtr client,
int interval,
@@ -1208,13 +1213,6 @@ virNetServerClientInitKeepAlive(virNetServerClientPtr client,
/* keepalive object has a reference to client */
client->refs++;
- client->keepaliveFilter =
- virNetServerClientAddFilterLocked(client,
- virNetServerClientKeepAliveFilter,
- NULL);
- if (client->keepaliveFilter < 0)
- goto cleanup;
-
client->keepalive = ka;
ka = NULL;