[libvirt] [PATCH 4/4] command: ease use with virBuffer

Eric Blake eblake at redhat.com
Fri Dec 10 21:40:12 UTC 2010


On 12/10/2010 12:58 PM, Laine Stump wrote:
> On 12/10/2010 02:18 PM, Eric Blake wrote:
>> * src/util/command.h (virCommandAddArgBuffer)
>> (virCommandAddEnvBuffer): New prototypes.
>> * src/util/command.c (virCommandAddArgBuffer)
>> (virCommandAddEnvBuffer): Implement them.
>> * src/libvirt_private.syms (command.h): Export them.
>> * src/qemu/qemu_conf.c (qemudBuildCommandLine): Use them, plugging
>> a memory leak on rbd_hosts in the process.
>> ---
>>
> 
> BTW, I'm really loving the ability to just forget about error checking
> until after all the args are added. It really cuts down on the lines of
> code, as well as making it easier to follow what's really happening.

Me too!

> 
>>   src/libvirt_private.syms |    2 ++
>>   src/qemu/qemu_conf.c     |   46
>> +++++++++-------------------------------------
>>   src/util/command.c       |   43
>> +++++++++++++++++++++++++++++++++++++++++++
>>   src/util/command.h       |   17 +++++++++++++++++
>>   4 files changed, 71 insertions(+), 37 deletions(-)
> 
> ACK. The new APIs and their uses all look fine to me.

Actually, I noticed a minor problem.  I squashed 3 and 4 together, then
squashed this in, then pushed:

diff --git i/src/util/command.c w/src/util/command.c
index 90c0d3a..f9d475e 100644
--- i/src/util/command.c
+++ w/src/util/command.c
@@ -316,13 +316,16 @@ virCommandAddEnvString(virCommandPtr cmd, const
char *str)

 /*
  * Convert a buffer containing preformatted name=value into an
- * environment variable of the child
+ * environment variable of the child.
+ * Correctly transfers memory errors or contents from buf to cmd.
  */
 void
 virCommandAddEnvBuffer(virCommandPtr cmd, virBufferPtr buf)
 {
-    if (!cmd || cmd->has_error)
+    if (!cmd || cmd->has_error) {
+        virBufferFreeAndReset(buf);
         return;
+    }

     /* env plus trailing NULL. */
     if (virBufferError(buf) ||
@@ -403,13 +406,16 @@ virCommandAddArg(virCommandPtr cmd, const char *val)


 /*
- * Convert a buffer into a command line argument to the child
+ * Convert a buffer into a command line argument to the child.
+ * Correctly transfers memory errors or contents from buf to cmd.
  */
 void
 virCommandAddArgBuffer(virCommandPtr cmd, virBufferPtr buf)
 {
-    if (!cmd || cmd->has_error)
+    if (!cmd || cmd->has_error) {
+        virBufferFreeAndReset(buf);
         return;
+    }

     /* Arg plus trailing NULL. */
     if (virBufferError(buf) ||


-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20101210/93ed5f27/attachment-0001.sig>


More information about the libvir-list mailing list