static virNetMessagePtr virKeepAliveMessage(virKeepAlivePtr ka, int proc) { virNetMessagePtr msg; const char *procstr = NULL; switch (proc) { case KEEPALIVE_PROC_PING: procstr = "request"; break; case KEEPALIVE_PROC_PONG: procstr = "response"; break; default: VIR_WARN("Refusing to send unknown keepalive message: %d", proc); return NULL; } if (!(msg = virNetMessageNew(false))) goto error; msg->header.prog = KEEPALIVE_PROGRAM; msg->header.vers = KEEPALIVE_PROTOCOL_VERSION; msg->header.type = VIR_NET_MESSAGE; msg->header.proc = proc; if (virNetMessageEncodeHeader(msg) < 0 || virNetMessageEncodePayloadEmpty(msg) < 0) { virNetMessageFree(msg); goto error; } VIR_DEBUG("Sending keepalive %s to client %p", procstr, ka->client); PROBE(RPC_KEEPALIVE_SEND, "ka=%p client=%p prog=%d vers=%d proc=%d", ka, ka->client, msg->header.prog, msg->header.vers, msg->header.proc); return msg; error: VIR_WARN("Failed to generate keepalive %s", procstr); VIR_FREE(msg); return NULL; }
int virNetServerProgramSendStreamData(virNetServerProgramPtr prog, virNetServerClientPtr client, virNetMessagePtr msg, int procedure, unsigned int serial, const char *data, size_t len) { VIR_DEBUG("client=%p msg=%p data=%p len=%zu", client, msg, data, len); /* Return header. We're reusing same message object, so * only need to tweak type/status fields */ msg->header.prog = prog->program; msg->header.vers = prog->version; msg->header.proc = procedure; msg->header.type = VIR_NET_STREAM; msg->header.serial = serial; /* * NB * data != NULL + len > 0 => VIR_NET_CONTINUE (Sending back data) * data != NULL + len == 0 => VIR_NET_CONTINUE (Sending read EOF) * data == NULL => VIR_NET_OK (Sending finish handshake confirmation) */ msg->header.status = data ? VIR_NET_CONTINUE : VIR_NET_OK; if (virNetMessageEncodeHeader(msg) < 0) return -1; if (data && len) { if (virNetMessageEncodePayloadRaw(msg, data, len) < 0) return -1; } else { if (virNetMessageEncodePayloadEmpty(msg) < 0) return -1; } VIR_DEBUG("Total %zu", msg->bufferLength); return virNetServerClientSendMessage(client, msg); }