return -1;
}
- virNetClientLock(client);
-
if (!client->sock || client->wantClose) {
virNetError(VIR_ERR_INTERNAL_ERROR, "%s",
_("client socket is closed"));
cleanup:
if (ret != 1)
VIR_FREE(call);
- virNetClientUnlock(client);
return ret;
}
int virNetClientSendWithReply(virNetClientPtr client,
virNetMessagePtr msg)
{
- int ret = virNetClientSendInternal(client, msg, true, false);
+ int ret;
+ virNetClientLock(client);
+ ret = virNetClientSendInternal(client, msg, true, false);
+ virNetClientUnlock(client);
if (ret < 0)
return -1;
return 0;
int virNetClientSendNoReply(virNetClientPtr client,
virNetMessagePtr msg)
{
- int ret = virNetClientSendInternal(client, msg, false, false);
+ int ret;
+ virNetClientLock(client);
+ ret = virNetClientSendInternal(client, msg, false, false);
+ virNetClientUnlock(client);
if (ret < 0)
return -1;
return 0;
int virNetClientSendNonBlock(virNetClientPtr client,
virNetMessagePtr msg)
{
- return virNetClientSendInternal(client, msg, false, true);
+ int ret;
+ virNetClientLock(client);
+ ret = virNetClientSendInternal(client, msg, false, true);
+ virNetClientUnlock(client);
+ return ret;
+}
+
+/*
+ * @msg: a message allocated on heap or stack
+ *
+ * Send a message synchronously, and wait for the reply synchronously
+ *
+ * The caller is responsible for free'ing @msg if it was allocated
+ * on the heap
+ *
+ * Returns 0 on success, -1 on failure
+ */
+int virNetClientSendWithReplyStream(virNetClientPtr client,
+ virNetMessagePtr msg,
+ virNetClientStreamPtr st)
+{
+ int ret;
+ virNetClientLock(client);
+ /* Other thread might have already received
+ * stream EOF so we don't want sent anything.
+ * Server won't respond anyway.
+ */
+ if (virNetClientStreamEOF(st)) {
+ virNetClientUnlock(client);
+ return 0;
+ }
+
+ ret = virNetClientSendInternal(client, msg, true, false);
+ virNetClientUnlock(client);
+ if (ret < 0)
+ return -1;
+ return 0;
}