[libvirt] [PATCH 4/9] Ensure empty payload is written upon stream completion

Daniel P. Berrange berrange at redhat.com
Tue Jun 28 17:01:54 UTC 2011


On stream completion it is neccessary to send back a
message with an empty payload. The message header was
not being filled out correctly, since we were not writing
any payload. Add a method for encoding an empty payload
which updates the message headers correctly.

* src/rpc/virnetmessage.c, src/rpc/virnetmessage.h: Add
  a virNetMessageEncodePayloadEmpty method
* src/rpc/virnetserverprogram.c: Write empty payload on
  stream completion
---
 src/rpc/virnetmessage.c       |   25 +++++++++++++++++++++++++
 src/rpc/virnetmessage.h       |    2 ++
 src/rpc/virnetserverprogram.c |    5 ++++-
 3 files changed, 31 insertions(+), 1 deletions(-)

diff --git a/src/rpc/virnetmessage.c b/src/rpc/virnetmessage.c
index 62cdbc3..a7a25b1 100644
--- a/src/rpc/virnetmessage.c
+++ b/src/rpc/virnetmessage.c
@@ -334,6 +334,31 @@ error:
 }
 
 
+int virNetMessageEncodePayloadEmpty(virNetMessagePtr msg)
+{
+    XDR xdr;
+    unsigned int msglen;
+
+    /* Re-encode the length word. */
+    VIR_DEBUG("Encode length as %zu", msg->bufferOffset);
+    xdrmem_create(&xdr, msg->buffer, VIR_NET_MESSAGE_HEADER_XDR_LEN, XDR_ENCODE);
+    msglen = msg->bufferOffset;
+    if (!xdr_u_int(&xdr, &msglen)) {
+        virNetError(VIR_ERR_RPC, "%s", _("Unable to encode message length"));
+        goto error;
+    }
+    xdr_destroy(&xdr);
+
+    msg->bufferLength = msg->bufferOffset;
+    msg->bufferOffset = 0;
+    return 0;
+
+error:
+    xdr_destroy(&xdr);
+    return -1;
+}
+
+
 void virNetMessageSaveError(virNetMessageErrorPtr rerr)
 {
     /* This func may be called several times & the first
diff --git a/src/rpc/virnetmessage.h b/src/rpc/virnetmessage.h
index 9215112..2aae3f6 100644
--- a/src/rpc/virnetmessage.h
+++ b/src/rpc/virnetmessage.h
@@ -78,6 +78,8 @@ int virNetMessageEncodePayloadRaw(virNetMessagePtr msg,
                                   const char *buf,
                                   size_t len)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+int virNetMessageEncodePayloadEmpty(virNetMessagePtr msg)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
 
 void virNetMessageSaveError(virNetMessageErrorPtr rerr)
     ATTRIBUTE_NONNULL(1);
diff --git a/src/rpc/virnetserverprogram.c b/src/rpc/virnetserverprogram.c
index 0d1577a..4afed64 100644
--- a/src/rpc/virnetserverprogram.c
+++ b/src/rpc/virnetserverprogram.c
@@ -433,8 +433,11 @@ int virNetServerProgramSendStreamData(virNetServerProgramPtr prog,
         if (virNetMessageEncodePayloadRaw(msg, data, len) < 0)
             return -1;
 
-        VIR_DEBUG("Total %zu", msg->bufferOffset);
+    } else {
+        if (virNetMessageEncodePayloadEmpty(msg) < 0)
+            return -1;
     }
+    VIR_DEBUG("Total %zu", msg->bufferOffset);
 
     return virNetServerClientSendMessage(client, msg);
 }
-- 
1.7.4.4




More information about the libvir-list mailing list