/* * @client: a locked client object * * Invoked by the main loop when filtering incoming messages. * * Returns 1 if the message was processed, 0 if skipped, * -1 on fatal client error */ static int daemonStreamFilter(virNetServerClientPtr client ATTRIBUTE_UNUSED, virNetMessagePtr msg, void *opaque) { daemonClientStream *stream = opaque; int ret = 0; virMutexLock(&stream->priv->lock); if (msg->header.type != VIR_NET_STREAM) goto cleanup; if (!virNetServerProgramMatches(stream->prog, msg)) goto cleanup; if (msg->header.proc != stream->procedure || msg->header.serial != stream->serial) goto cleanup; VIR_DEBUG("Incoming client=%p, rx=%p, serial=%d, proc=%d, status=%d", client, stream->rx, msg->header.proc, msg->header.serial, msg->header.status); virNetMessageQueuePush(&stream->rx, msg); daemonStreamUpdateEvents(stream); ret = 1; cleanup: virMutexUnlock(&stream->priv->lock); return ret; }
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); msg->donefds = 0; if (client->sock && !client->wantClose) { PROBE(RPC_SERVER_CLIENT_MSG_TX_QUEUE, "client=%p len=%zu prog=%u vers=%u proc=%u type=%u status=%u serial=%u", client, msg->bufferLength, msg->header.prog, msg->header.vers, msg->header.proc, msg->header.type, msg->header.status, msg->header.serial); virNetMessageQueuePush(&client->tx, msg); virNetServerClientUpdateEvent(client); ret = 0; } return ret; }