On Mon, Apr 28, 2008 at 08:19:20AM -0400, Daniel Veillard wrote: > On Mon, Apr 28, 2008 at 01:13:00PM +0100, Daniel P. Berrange wrote: > > On Mon, Apr 28, 2008 at 03:17:33AM -0400, Daniel Veillard wrote: > > > I would prefer to relax the 'non-public' point and let the compiler > > > compute the size in some ways rather than hardcode based on a word size > > > indication which may not take into account specific alignment problems > > > on some platforms. > > > > One other option I considered is to just define the struct in the public > > header with meaningless field names > > > > struct _virBuffer { > > char a; > > char *a; > > > unsigned int b; > > unsinged int c; > > }; > > > > The real version is re-declared with proper names in buf.c, so this will > > at least discourage its use which is probably good enough. > > Fine by me. Here's the updated patch... src/buf.c | 241 ++++++++++++++++------------- src/buf.h | 35 ++-- src/capabilities.c | 187 ++++++++-------------- src/conf.c | 77 ++++----- src/libvirt_sym.version | 2 src/lxc_conf.c | 104 +++--------- src/qemu_conf.c | 391 ++++++++++++++++++------------------------------ src/qparams.c | 15 + src/storage_conf.c | 227 ++++++++++----------------- src/test.c | 74 ++++----- src/virsh.c | 158 ++++++++----------- src/xend_internal.c | 126 ++++++--------- src/xm_internal.c | 184 ++++++++++------------ src/xml.c | 101 +++++------- src/xmlrpc.c | 22 +- src/xmlrpc.h | 5 tests/xmlrpctest.c | 81 ++++----- 17 files changed, 883 insertions(+), 1147 deletions(-) Daniel. Index: src/buf.c =================================================================== RCS file: /data/cvs/libvirt/src/buf.c,v retrieving revision 1.15 diff -u -p -r1.15 buf.c --- src/buf.c 10 Apr 2008 16:54:54 -0000 1.15 +++ src/buf.c 28 Apr 2008 13:52:15 -0000 @@ -18,8 +18,37 @@ #include <stdarg.h> #include <ctype.h> +#define __VIR_BUFFER_C__ + #include "buf.h" + +/* If adding more fields, ensure to edit buf.h to match + the number of fields */ +struct _virBuffer { + unsigned int size; + unsigned int use; + unsigned int error; + char *content; +}; + +/** + * virBufferFail + * @buf: the buffer + * + * Mark the buffer has having failed a memory allocation, + * freeing the content and setting the error flag. + */ +static void +virBufferNoMemory(const virBufferPtr buf) +{ + free(buf->content); + buf->content = NULL; + buf->size = 0; + buf->use = 0; + buf->error = 1; +} + /** * virBufferGrow: * @buf: the buffer @@ -27,7 +56,7 @@ * * Grow the available space of a buffer to at least @len bytes. * - * Returns the new available space or -1 in case of error + * Returns zero on success or -1 on error */ static int virBufferGrow(virBufferPtr buf, unsigned int len) @@ -35,18 +64,22 @@ virBufferGrow(virBufferPtr buf, unsigned int size; char *newbuf; - if (buf == NULL) - return (-1); - if (len + buf->use < buf->size) - return (0); + if (buf->error) + return -1; + + if ((len + buf->use) < buf->size) + return 0; size = buf->use + len + 1000; newbuf = realloc(buf->content, size); - if (newbuf == NULL) return -1; + if (newbuf == NULL) { + virBufferNoMemory(buf); + return -1; + } buf->content = newbuf; buf->size = size; - return (buf->size - buf->use); + return 0; } /** @@ -58,33 +91,29 @@ virBufferGrow(virBufferPtr buf, unsigned * Add a string range to an XML buffer. if len == -1, the length of * str is recomputed to the full string. * - * Returns 0 successful, -1 in case of internal or API error. */ -int -__virBufferAdd(virBufferPtr buf, const char *str, int len) +void +__virBufferAdd(const virBufferPtr buf, const char *str, int len) { unsigned int needSize; - if ((str == NULL) || (buf == NULL)) { - return -1; - } - if (len == 0) - return 0; + if ((str == NULL) || (buf == NULL) || (len == 0)) + return; + + if (buf->error) + return; if (len < 0) len = strlen(str); needSize = buf->use + len + 2; - if (needSize > buf->size) { - if (!virBufferGrow(buf, needSize - buf->use)) { - return (-1); - } - } + if (needSize > buf->size && + virBufferGrow(buf, needSize - buf->use) < 0) + return; memcpy (&buf->content[buf->use], str, len); buf->use += len; - buf->content[buf->use] = 0; - return (0); + buf->content[buf->use] = '\0'; } /** @@ -94,89 +123,85 @@ __virBufferAdd(virBufferPtr buf, const c * * Add a single character 'c' to a buffer. * - * Returns 0 if successful, -1 in the case of error. */ -int +void __virBufferAddChar (virBufferPtr buf, char c) { unsigned int needSize; if (buf == NULL) - return -1; + return; + + if (buf->error) + return; needSize = buf->use + 2; - if (needSize > buf->size) - if (!virBufferGrow (buf, needSize - buf->use)) - return -1; + if (needSize > buf->size && + virBufferGrow (buf, needSize - buf->use) < 0) + return; buf->content[buf->use++] = c; - buf->content[buf->use] = 0; - - return 0; + buf->content[buf->use] = '\0'; } /** - * virBufferNew: - * @size: creation size in bytes + * virBufferContentAndReset: + * @buf: Buffer * - * Creates a new buffer + * Get the content from the buffer and free (only) the buffer structure. + * The caller owns the returned string & should free it when no longer + * required. The buffer object is reset to its initial state. * - * Returns a pointer to the buffer or NULL in case of error + * Returns the buffer content or NULL in case of error. */ -virBufferPtr -virBufferNew(unsigned int size) +char * +__virBufferContentAndReset(const virBufferPtr buf) { - virBufferPtr buf; + char *str; + if (buf == NULL) + return NULL; - if (!(buf = malloc(sizeof(*buf)))) return NULL; - if (size && (buf->content = malloc(size))==NULL) { - free(buf); + if (buf->error) { + memset(buf, 0, sizeof(*buf)); return NULL; } - buf->size = size; - buf->use = 0; - return buf; + str = buf->content; + memset(buf, 0, sizeof(*buf)); + return str; } /** - * virBufferFree: - * @buf: the buffer to deallocate + * virBufferError: + * @buf: the buffer * - * Free the set of resources used by a buffer. + * Check to see if the buffer is in an error state due + * to failed memory allocation + * + * Return true if in error, 0 if normal */ - -void -virBufferFree(virBufferPtr buf) +int +__virBufferError(const virBufferPtr buf) { - if (buf) { - free(buf->content); - free(buf); - } + if (buf == NULL) + return 1; + + return buf->error; } /** - * virBufferContentAndFree: - * @buf: Buffer + * virBufferUse: + * @buf: the usage of the string in the buffer * - * Get the content from the buffer and free (only) the buffer structure. - * - * Returns the buffer content or NULL in case of error. + * Return the string usage in bytes */ -char * -virBufferContentAndFree (virBufferPtr buf) +unsigned int +virBufferUse(const virBufferPtr buf) { - char *content; - if (buf == NULL) - return(NULL); - - content = buf->content; - if (content != NULL) - content[buf->use] = 0; + return 0; - free (buf); - return(content); + return buf->use; } /** @@ -186,22 +211,22 @@ virBufferContentAndFree (virBufferPtr bu * @...: the variable list of arguments * * Do a formatted print to an XML buffer. - * - * Returns 0 successful, -1 in case of internal or API error. */ -int -__virBufferVSprintf(virBufferPtr buf, const char *format, ...) +void +__virBufferVSprintf(const virBufferPtr buf, const char *format, ...) { int size, count, grow_size; va_list locarg, argptr; - if ((format == NULL) || (buf == NULL)) { - return (-1); - } + if ((format == NULL) || (buf == NULL)) + return; + + if (buf->error) + return; if (buf->size == 0 && virBufferGrow(buf, 100) < 0) - return -1; + return; size = buf->size - buf->use - 1; va_start(argptr, format); @@ -210,17 +235,17 @@ __virBufferVSprintf(virBufferPtr buf, co locarg)) < 0) || (count >= size - 1)) { buf->content[buf->use] = 0; va_end(locarg); + grow_size = (count > 1000) ? count : 1000; - if (virBufferGrow(buf, grow_size) < 0) { - return (-1); - } + if (virBufferGrow(buf, grow_size) < 0) + return; + size = buf->size - buf->use - 1; va_copy(locarg, argptr); } va_end(locarg); buf->use += count; - buf->content[buf->use] = 0; - return (0); + buf->content[buf->use] = '\0'; } /** @@ -231,25 +256,27 @@ __virBufferVSprintf(virBufferPtr buf, co * * Do a formatted print with a single string to an XML buffer. The string * is escaped to avoid generating a not well-formed XML instance. - * - * Returns 0 successful, -1 in case of internal or API error. */ -int -virBufferEscapeString(virBufferPtr buf, const char *format, const char *str) +void +virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str) { int size, count, len, grow_size; char *escaped, *out; const char *cur; - if ((format == NULL) || (buf == NULL) || (str == NULL)) { - return (-1); - } + if ((format == NULL) || (buf == NULL) || (str == NULL)) + return; + + if (buf->error) + return; len = strlen(str); escaped = malloc(5 * len + 1); if (escaped == NULL) { - return (-1); + virBufferNoMemory(buf); + return; } + cur = str; out = escaped; while (*cur != 0) { @@ -290,14 +317,13 @@ virBufferEscapeString(virBufferPtr buf, grow_size = (count > 1000) ? count : 1000; if (virBufferGrow(buf, grow_size) < 0) { free(escaped); - return (-1); + return; } size = buf->size - buf->use - 1; } buf->use += count; - buf->content[buf->use] = 0; + buf->content[buf->use] = '\0'; free(escaped); - return (0); } /** @@ -308,10 +334,8 @@ virBufferEscapeString(virBufferPtr buf, * Append the string to the buffer. The string will be URI-encoded * during the append (ie any non alpha-numeric characters are replaced * with '%xx' hex sequences). - * - * Returns 0 successful, -1 in case of internal or API error. */ -int +void virBufferURIEncodeString (virBufferPtr buf, const char *str) { int grow_size = 0; @@ -319,6 +343,12 @@ virBufferURIEncodeString (virBufferPtr b unsigned char uc; const char *hex = "0123456789abcdef"; + if ((buf == NULL) || (str == NULL)) + return; + + if (buf->error) + return; + for (p = str; *p; ++p) { /* This may not work on EBCDIC. */ if ((*p >= 'a' && *p <= 'z') || @@ -329,8 +359,8 @@ virBufferURIEncodeString (virBufferPtr b grow_size += 3; /* %ab */ } - if (virBufferGrow (buf, grow_size) == -1) - return -1; + if (virBufferGrow (buf, grow_size) < 0) + return; for (p = str; *p; ++p) { /* This may not work on EBCDIC. */ @@ -347,7 +377,6 @@ virBufferURIEncodeString (virBufferPtr b } buf->content[buf->use] = '\0'; - return 0; } /** @@ -356,15 +385,16 @@ virBufferURIEncodeString (virBufferPtr b * @...: the variable list of strings, the last argument must be NULL * * Concatenate strings to an XML buffer. - * - * Returns 0 successful, -1 in case of internal or API error. */ -int +void virBufferStrcat(virBufferPtr buf, ...) { va_list ap; char *str; + if (buf->error) + return; + va_start(ap, buf); while ((str = va_arg(ap, char *)) != NULL) { @@ -372,13 +402,12 @@ virBufferStrcat(virBufferPtr buf, ...) unsigned int needSize = buf->use + len + 2; if (needSize > buf->size) { - if (!virBufferGrow(buf, needSize - buf->use)) - return -1; + if (virBufferGrow(buf, needSize - buf->use) < 0) + return; } memcpy(&buf->content[buf->use], str, len); buf->use += len; buf->content[buf->use] = 0; } va_end(ap); - return 0; } Index: src/buf.h =================================================================== RCS file: /data/cvs/libvirt/src/buf.h,v retrieving revision 1.5 diff -u -p -r1.5 buf.h --- src/buf.h 20 Feb 2008 15:29:13 -0000 1.5 +++ src/buf.h 28 Apr 2008 13:52:15 -0000 @@ -20,22 +20,30 @@ */ typedef struct _virBuffer virBuffer; typedef virBuffer *virBufferPtr; + +#ifndef __VIR_BUFFER_C__ +#define VIR_BUFFER_INITIALIZER { 0, 0, 0, NULL } + +/* This struct must be kept in syn with the real struct + in the buf.c impl file */ struct _virBuffer { - char *content; /* The buffer content UTF8 */ - unsigned int use; /* The buffer size used */ - unsigned int size; /* The buffer size */ + unsigned int a; + unsigned int b; + unsigned int c; + char *d; }; +#endif -virBufferPtr virBufferNew(unsigned int size); -void virBufferFree(virBufferPtr buf); -char *virBufferContentAndFree(virBufferPtr buf); -int __virBufferAdd(virBufferPtr buf, const char *str, int len); -int __virBufferAddChar(virBufferPtr buf, char c); -int __virBufferVSprintf(virBufferPtr buf, const char *format, ...) +char *__virBufferContentAndReset(const virBufferPtr buf); +int __virBufferError(const virBufferPtr buf); +unsigned int virBufferUse(const virBufferPtr buf); +void __virBufferAdd(const virBufferPtr buf, const char *str, int len); +void __virBufferAddChar(const virBufferPtr buf, char c); +void __virBufferVSprintf(const virBufferPtr buf, const char *format, ...) ATTRIBUTE_FORMAT(printf, 2, 3); -int virBufferStrcat(virBufferPtr buf, ...); -int virBufferEscapeString(virBufferPtr buf, const char *format, const char *str); -int virBufferURIEncodeString (virBufferPtr buf, const char *str); +void virBufferStrcat(const virBufferPtr buf, ...); +void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str); +void virBufferURIEncodeString (const virBufferPtr buf, const char *str); #define virBufferAddLit(buf_, literal_string_) \ __virBufferAdd (buf_, "" literal_string_ "", sizeof literal_string_ - 1) @@ -44,4 +52,7 @@ int virBufferURIEncodeString (virBufferP #define virBufferAddChar(b,c) __virBufferAddChar((b),(c)) #define virBufferVSprintf(b,f,...) __virBufferVSprintf((b),(f), __VA_ARGS__) +#define virBufferContentAndReset(b) __virBufferContentAndReset((b)) +#define virBufferError(b) __virBufferError((b)) + #endif /* __VIR_BUFFER_H__ */ Index: src/capabilities.c =================================================================== RCS file: /data/cvs/libvirt/src/capabilities.c,v retrieving revision 1.6 diff -u -p -r1.6 capabilities.c --- src/capabilities.c 10 Apr 2008 16:53:29 -0000 1.6 +++ src/capabilities.c 28 Apr 2008 13:52:16 -0000 @@ -521,172 +521,127 @@ virCapabilitiesDefaultGuestEmulator(virC char * virCapabilitiesFormatXML(virCapsPtr caps) { - virBuffer xml = { NULL, 0, 0 }; + virBuffer xml = VIR_BUFFER_INITIALIZER; int i, j, k; - if (virBufferAddLit(&xml, "<capabilities>\n\n") < 0) - goto no_memory; - if (virBufferAddLit(&xml, " <host>\n") < 0) - goto no_memory; - if (virBufferAddLit(&xml, " <cpu>\n") < 0) - goto no_memory; - if (virBufferVSprintf(&xml, " <arch>%s</arch>\n", - caps->host.arch) < 0) - goto no_memory; + virBufferAddLit(&xml, "<capabilities>\n\n"); + virBufferAddLit(&xml, " <host>\n"); + virBufferAddLit(&xml, " <cpu>\n"); + virBufferVSprintf(&xml, " <arch>%s</arch>\n", + caps->host.arch); if (caps->host.nfeatures) { - if (virBufferAddLit(&xml, " <features>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " <features>\n"); for (i = 0 ; i < caps->host.nfeatures ; i++) { - if (virBufferVSprintf(&xml, " <%s/>\n", - caps->host.features[i]) <0) - goto no_memory; + virBufferVSprintf(&xml, " <%s/>\n", + caps->host.features[i]); } - if (virBufferAddLit(&xml, " </features>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " </features>\n"); } - if (virBufferAddLit(&xml, " </cpu>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " </cpu>\n"); if (caps->host.offlineMigrate) { - if (virBufferAddLit(&xml, " <migration_features>\n") < 0) - goto no_memory; - if (caps->host.liveMigrate && - virBufferAddLit(&xml, " <live/>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " <migration_features>\n"); + if (caps->host.liveMigrate) + virBufferAddLit(&xml, " <live/>\n"); if (caps->host.nmigrateTrans) { - if (virBufferAddLit(&xml, " <uri_transports>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " <uri_transports>\n"); for (i = 0 ; i < caps->host.nmigrateTrans ; i++) { - if (virBufferVSprintf(&xml, " <uri_transport>%s</uri_transport>\n", - caps->host.migrateTrans[i]) < 0) - goto no_memory; + virBufferVSprintf(&xml, " <uri_transport>%s</uri_transport>\n", + caps->host.migrateTrans[i]); } - if (virBufferAddLit(&xml, " </uri_transports>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " </uri_transports>\n"); } - if (virBufferAddLit(&xml, " </migration_features>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " </migration_features>\n"); } if (caps->host.nnumaCell) { - if (virBufferAddLit(&xml, " <topology>\n") < 0) - goto no_memory; - if (virBufferVSprintf(&xml, " <cells num='%d'>\n", - caps->host.nnumaCell) < 0) - goto no_memory; + virBufferAddLit(&xml, " <topology>\n"); + virBufferVSprintf(&xml, " <cells num='%d'>\n", + caps->host.nnumaCell); for (i = 0 ; i < caps->host.nnumaCell ; i++) { - if (virBufferVSprintf(&xml, " <cell id='%d'>\n", - caps->host.numaCell[i]->num) < 0) - goto no_memory; - if (virBufferVSprintf(&xml, " <cpus num='%d'>\n", - caps->host.numaCell[i]->ncpus) < 0) - goto no_memory; + virBufferVSprintf(&xml, " <cell id='%d'>\n", + caps->host.numaCell[i]->num); + virBufferVSprintf(&xml, " <cpus num='%d'>\n", + caps->host.numaCell[i]->ncpus); for (j = 0 ; j < caps->host.numaCell[i]->ncpus ; j++) - if (virBufferVSprintf(&xml, " <cpu id='%d'/>\n", - caps->host.numaCell[i]->cpus[j]) < 0) - goto no_memory; - if (virBufferAddLit(&xml, " </cpus>\n") < 0) - goto no_memory; - if (virBufferAddLit(&xml, " </cell>\n") < 0) - goto no_memory; - } - if (virBufferAddLit(&xml, " </cells>\n") < 0) - goto no_memory; - if (virBufferAddLit(&xml, " </topology>\n") < 0) - goto no_memory; + virBufferVSprintf(&xml, " <cpu id='%d'/>\n", + caps->host.numaCell[i]->cpus[j]); + virBufferAddLit(&xml, " </cpus>\n"); + virBufferAddLit(&xml, " </cell>\n"); + } + virBufferAddLit(&xml, " </cells>\n"); + virBufferAddLit(&xml, " </topology>\n"); } - if (virBufferAddLit(&xml, " </host>\n\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " </host>\n\n"); for (i = 0 ; i < caps->nguests ; i++) { - if (virBufferAddLit(&xml, " <guest>\n") < 0) - goto no_memory; - if (virBufferVSprintf(&xml, " <os_type>%s</os_type>\n", - caps->guests[i]->ostype) < 0) - goto no_memory; - if (virBufferVSprintf(&xml, " <arch name='%s'>\n", - caps->guests[i]->arch.name) < 0) - goto no_memory; - if (virBufferVSprintf(&xml, " <wordsize>%d</wordsize>\n", - caps->guests[i]->arch.wordsize) < 0) - goto no_memory; - if (caps->guests[i]->arch.defaultInfo.emulator && + virBufferAddLit(&xml, " <guest>\n"); + virBufferVSprintf(&xml, " <os_type>%s</os_type>\n", + caps->guests[i]->ostype); + virBufferVSprintf(&xml, " <arch name='%s'>\n", + caps->guests[i]->arch.name); + virBufferVSprintf(&xml, " <wordsize>%d</wordsize>\n", + caps->guests[i]->arch.wordsize); + if (caps->guests[i]->arch.defaultInfo.emulator) virBufferVSprintf(&xml, " <emulator>%s</emulator>\n", - caps->guests[i]->arch.defaultInfo.emulator) < 0) - goto no_memory; - if (caps->guests[i]->arch.defaultInfo.loader && - virBufferVSprintf(&xml, " <loader>%s</loader>\n", - caps->guests[i]->arch.defaultInfo.loader) < 0) - goto no_memory; + caps->guests[i]->arch.defaultInfo.emulator); + if (caps->guests[i]->arch.defaultInfo.loader) + virBufferVSprintf(&xml, " <loader>%s</loader>\n", + caps->guests[i]->arch.defaultInfo.loader); for (j = 0 ; j < caps->guests[i]->arch.defaultInfo.nmachines ; j++) { - if (virBufferVSprintf(&xml, " <machine>%s</machine>\n", - caps->guests[i]->arch.defaultInfo.machines[j]) < 0) - goto no_memory; + virBufferVSprintf(&xml, " <machine>%s</machine>\n", + caps->guests[i]->arch.defaultInfo.machines[j]); } for (j = 0 ; j < caps->guests[i]->arch.ndomains ; j++) { - if (virBufferVSprintf(&xml, " <domain type='%s'>\n", - caps->guests[i]->arch.domains[j]->type) < 0) - goto no_memory; - if (caps->guests[i]->arch.domains[j]->info.emulator && + virBufferVSprintf(&xml, " <domain type='%s'>\n", + caps->guests[i]->arch.domains[j]->type); + if (caps->guests[i]->arch.domains[j]->info.emulator) virBufferVSprintf(&xml, " <emulator>%s</emulator>\n", - caps->guests[i]->arch.domains[j]->info.emulator) < 0) - goto no_memory; - if (caps->guests[i]->arch.domains[j]->info.loader && + caps->guests[i]->arch.domains[j]->info.emulator); + if (caps->guests[i]->arch.domains[j]->info.loader) virBufferVSprintf(&xml, " <loader>%s</loader>\n", - caps->guests[i]->arch.domains[j]->info.loader) < 0) - goto no_memory; + caps->guests[i]->arch.domains[j]->info.loader); for (k = 0 ; k < caps->guests[i]->arch.domains[j]->info.nmachines ; k++) { - if (virBufferVSprintf(&xml, " <machine>%s</machine>\n", - caps->guests[i]->arch.domains[j]->info.machines[k]) < 0) - goto no_memory; + virBufferVSprintf(&xml, " <machine>%s</machine>\n", + caps->guests[i]->arch.domains[j]->info.machines[k]); } - if (virBufferAddLit(&xml, " </domain>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " </domain>\n"); } - if (virBufferAddLit(&xml, " </arch>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " </arch>\n"); if (caps->guests[i]->nfeatures) { - if (virBufferAddLit(&xml, " <features>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " <features>\n"); for (j = 0 ; j < caps->guests[i]->nfeatures ; j++) { if (STREQ(caps->guests[i]->features[j]->name, "pae") || STREQ(caps->guests[i]->features[j]->name, "nonpae") || STREQ(caps->guests[i]->features[j]->name, "ia64_be")) { - if (virBufferVSprintf(&xml, " <%s/>\n", - caps->guests[i]->features[j]->name) < 0) - goto no_memory; + virBufferVSprintf(&xml, " <%s/>\n", + caps->guests[i]->features[j]->name); } else { - if (virBufferVSprintf(&xml, " <%s default='%s' toggle='%s'/>\n", - caps->guests[i]->features[j]->name, - caps->guests[i]->features[j]->defaultOn ? "on" : "off", - caps->guests[i]->features[j]->toggle ? "yes" : "no") < 0) - goto no_memory; + virBufferVSprintf(&xml, " <%s default='%s' toggle='%s'/>\n", + caps->guests[i]->features[j]->name, + caps->guests[i]->features[j]->defaultOn ? "on" : "off", + caps->guests[i]->features[j]->toggle ? "yes" : "no"); } } - if (virBufferAddLit(&xml, " </features>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " </features>\n"); } - - if (virBufferAddLit(&xml, " </guest>\n\n") < 0) - goto no_memory; + virBufferAddLit(&xml, " </guest>\n\n"); } - if (virBufferAddLit(&xml, "</capabilities>\n") < 0) - goto no_memory; + virBufferAddLit(&xml, "</capabilities>\n"); - return xml.content; + if (virBufferError(&xml)) + return NULL; - no_memory: - free(xml.content); - return NULL; + return virBufferContentAndReset(&xml); } Index: src/conf.c =================================================================== RCS file: /data/cvs/libvirt/src/conf.c,v retrieving revision 1.25 diff -u -p -r1.25 conf.c --- src/conf.c 10 Apr 2008 16:54:54 -0000 1.25 +++ src/conf.c 28 Apr 2008 13:52:16 -0000 @@ -877,43 +877,45 @@ __virConfSetValue (virConfPtr conf, int __virConfWriteFile(const char *filename, virConfPtr conf) { - virBufferPtr buf; + virBuffer buf = VIR_BUFFER_INITIALIZER; virConfEntryPtr cur; int ret; int fd; + char *content; + unsigned int use; if (conf == NULL) return(-1); - buf = virBufferNew(500); - if (buf == NULL) { - virConfError(NULL, VIR_ERR_NO_MEMORY, _("failed to allocate buffer"), 0); - return(-1); - } - cur = conf->entries; while (cur != NULL) { - virConfSaveEntry(buf, cur); + virConfSaveEntry(&buf, cur); cur = cur->next; } + if (virBufferError(&buf)) { + virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocate buffer"), 0); + return -1; + } + fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR ); if (fd < 0) { virConfError(NULL, VIR_ERR_WRITE_FAILED, _("failed to open file"), 0); - ret = -1; - goto error; + free(virBufferContentAndReset(&buf)); + return -1; } - ret = safewrite(fd, buf->content, buf->use); + use = virBufferUse(&buf); + content = virBufferContentAndReset(&buf); + ret = safewrite(fd, content, use); + free(content); close(fd); - if (ret != (int) buf->use) { + if (ret != (int)use) { virConfError(NULL, VIR_ERR_WRITE_FAILED, _("failed to save content"), 0); - ret = -1; - goto error; + return -1; } -error: - virBufferFree(buf); - return(ret); + + return ret; } /** @@ -932,34 +934,35 @@ error: int __virConfWriteMem(char *memory, int *len, virConfPtr conf) { - virBufferPtr buf; + virBuffer buf = VIR_BUFFER_INITIALIZER; virConfEntryPtr cur; - int ret; + char *content; + unsigned int use; if ((memory == NULL) || (len == NULL) || (*len <= 0) || (conf == NULL)) return(-1); - buf = virBufferNew(500); - if (buf == NULL) { - virConfError(NULL, VIR_ERR_NO_MEMORY, _("failed to allocate buffer"), 0); - return(-1); - } - cur = conf->entries; while (cur != NULL) { - virConfSaveEntry(buf, cur); + virConfSaveEntry(&buf, cur); cur = cur->next; } - if ((int) buf->use >= *len) { - *len = buf->use; - ret = -1; - goto error; - } - memcpy(memory, buf->content, buf->use); - ret = buf->use; - *len = buf->use; -error: - virBufferFree(buf); - return(ret); + if (virBufferError(&buf)) { + virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocate buffer"), 0); + return -1; + } + + use = virBufferUse(&buf); + content = virBufferContentAndReset(&buf); + + if ((int)use >= *len) { + *len = (int)use; + free(content); + return -1; + } + memcpy(memory, content, use); + free(content); + *len = use; + return use; } Index: src/libvirt_sym.version =================================================================== RCS file: /data/cvs/libvirt/src/libvirt_sym.version,v retrieving revision 1.38 diff -u -p -r1.38 libvirt_sym.version --- src/libvirt_sym.version 28 Feb 2008 17:06:32 -0000 1.38 +++ src/libvirt_sym.version 28 Apr 2008 13:52:17 -0000 @@ -184,6 +184,8 @@ __virBufferVSprintf; __virBufferAdd; __virBufferAddChar; + __virBufferContentAndReset; + __virBufferError; __virMacAddrCompare; Index: src/lxc_conf.c =================================================================== RCS file: /data/cvs/libvirt/src/lxc_conf.c,v retrieving revision 1.8 diff -u -p -r1.8 lxc_conf.c --- src/lxc_conf.c 10 Apr 2008 16:54:54 -0000 1.8 +++ src/lxc_conf.c 28 Apr 2008 13:52:18 -0000 @@ -688,99 +688,49 @@ char *lxcGenerateXML(virConnectPtr conn, lxc_vm_t *vm, lxc_vm_def_t *def) { - virBufferPtr buf = 0; + virBuffer buf = VIR_BUFFER_INITIALIZER; unsigned char *uuid; char uuidstr[VIR_UUID_STRING_BUFLEN]; lxc_mount_t *mount; - buf = virBufferNew(LXC_MAX_XML_LENGTH); - if (!buf) { - goto no_memory; - } - - if (lxcIsActiveVM(vm)) { - if (virBufferVSprintf(buf, "<domain type='%s' id='%d'>\n", - LXC_DOMAIN_TYPE, vm->def->id) < 0) { - goto no_memory; - } - } else { - if (virBufferVSprintf(buf, "<domain type='%s'>\n", - LXC_DOMAIN_TYPE) < 0) { - goto no_memory; - } - } + if (lxcIsActiveVM(vm)) + virBufferVSprintf(&buf, "<domain type='%s' id='%d'>\n", + LXC_DOMAIN_TYPE, vm->def->id); + else + virBufferVSprintf(&buf, "<domain type='%s'>\n", + LXC_DOMAIN_TYPE); - if (virBufferVSprintf(buf, " <name>%s</name>\n", def->name) < 0) { - goto no_memory; - } + virBufferVSprintf(&buf, " <name>%s</name>\n", def->name); uuid = def->uuid; virUUIDFormat(uuid, uuidstr); - if (virBufferVSprintf(buf, " <uuid>%s</uuid>\n", uuidstr) < 0) { - goto no_memory; - } - - if (virBufferAddLit(buf, " <os>\n") < 0) { - goto no_memory; - } - - if (virBufferVSprintf(buf, " <init>%s</init>\n", def->init) < 0) { - goto no_memory; - } - - if (virBufferAddLit(buf, " </os>\n") < 0) { - goto no_memory; - } - - if (virBufferVSprintf(buf, " <memory>%d</memory>\n", def->maxMemory) < 0) { - goto no_memory; - } - - if (virBufferAddLit(buf, " <devices>\n") < 0) { - goto no_memory; - } + virBufferVSprintf(&buf, " <uuid>%s</uuid>\n", uuidstr); + virBufferAddLit(&buf, " <os>\n"); + virBufferVSprintf(&buf, " <init>%s</init>\n", def->init); + virBufferAddLit(&buf, " </os>\n"); + virBufferVSprintf(&buf, " <memory>%d</memory>\n", def->maxMemory); + virBufferAddLit(&buf, " <devices>\n"); /* loop adding mounts */ for (mount = def->mounts; mount; mount = mount->next) { - if (virBufferAddLit(buf, " <filesystem type='mount'>\n") < 0) { - goto no_memory; - } - - if (virBufferVSprintf(buf, " <source dir='%s'/>\n", - mount->source) < 0) { - goto no_memory; - } - - if (virBufferVSprintf(buf, " <target dir='%s'/>\n", - mount->target) < 0) { - goto no_memory; - } - - if (virBufferAddLit(buf, " </filesystem>\n") < 0) { - goto no_memory; - } - - } - - if (virBufferVSprintf(buf, " <console tty='%s'/>\n", def->tty) < 0) { - goto no_memory; + virBufferAddLit(&buf, " <filesystem type='mount'>\n"); + virBufferVSprintf(&buf, " <source dir='%s'/>\n", + mount->source); + virBufferVSprintf(&buf, " <target dir='%s'/>\n", + mount->target); + virBufferAddLit(&buf, " </filesystem>\n"); } - if (virBufferAddLit(buf, " </devices>\n") < 0) { - goto no_memory; - } + virBufferVSprintf(&buf, " <console tty='%s'/>\n", def->tty); + virBufferAddLit(&buf, " </devices>\n"); + virBufferAddLit(&buf, "</domain>\n"); - if (virBufferAddLit(buf, "</domain>\n") < 0) { - goto no_memory; + if (virBufferError(&buf)) { + lxcError(conn, NULL, VIR_ERR_NO_MEMORY,_("allocate buffer")); + return NULL; } - return virBufferContentAndFree(buf); - -no_memory: - lxcError(conn, NULL, VIR_ERR_NO_MEMORY, "generateXml"); - virBufferFree(buf); - - return NULL; + return virBufferContentAndReset(&buf); } void lxcFreeVMDef(lxc_vm_def_t *vmdef) Index: src/qemu_conf.c =================================================================== RCS file: /data/cvs/libvirt/src/qemu_conf.c,v retrieving revision 1.49 diff -u -p -r1.49 qemu_conf.c --- src/qemu_conf.c 25 Apr 2008 20:46:13 -0000 1.49 +++ src/qemu_conf.c 28 Apr 2008 13:52:20 -0000 @@ -3359,14 +3359,12 @@ static int qemudGenerateXMLChar(virBuffe if (STREQ(type, "console") && dev->srcType == QEMUD_CHR_SRC_TYPE_PTY && dev->srcData.file.path[0] != '\0') { - if (virBufferVSprintf(buf, " <%s type='%s' tty='%s'>\n", - type, types[dev->srcType], - dev->srcData.file.path) < 0) - return -1; + virBufferVSprintf(buf, " <%s type='%s' tty='%s'>\n", + type, types[dev->srcType], + dev->srcData.file.path); } else { - if (virBufferVSprintf(buf, " <%s type='%s'>\n", - type, types[dev->srcType]) < 0) - return -1; + virBufferVSprintf(buf, " <%s type='%s'>\n", + type, types[dev->srcType]); } switch (dev->srcType) { @@ -3382,74 +3380,62 @@ static int qemudGenerateXMLChar(virBuffe case QEMUD_CHR_SRC_TYPE_PIPE: if (dev->srcType != QEMUD_CHR_SRC_TYPE_PTY || dev->srcData.file.path[0]) { - if (virBufferVSprintf(buf, " <source path='%s'/>\n", - dev->srcData.file.path) < 0) - return -1; + virBufferVSprintf(buf, " <source path='%s'/>\n", + dev->srcData.file.path); } break; case QEMUD_CHR_SRC_TYPE_UDP: if (dev->srcData.udp.bindService[0] != '\0' && dev->srcData.udp.bindHost[0] != '\0') { - if (virBufferVSprintf(buf, " <source mode='bind' host='%s' service='%s'/>\n", - dev->srcData.udp.bindHost, - dev->srcData.udp.bindService) < 0) - return -1; + virBufferVSprintf(buf, " <source mode='bind' host='%s' service='%s'/>\n", + dev->srcData.udp.bindHost, + dev->srcData.udp.bindService); } else if (dev->srcData.udp.bindHost[0] !='\0') { - if (virBufferVSprintf(buf, " <source mode='bind' host='%s'/>\n", - dev->srcData.udp.bindHost) < 0) - return -1; + virBufferVSprintf(buf, " <source mode='bind' host='%s'/>\n", + dev->srcData.udp.bindHost); } else if (dev->srcData.udp.bindService[0] != '\0') { - if (virBufferVSprintf(buf, " <source mode='bind' service='%s'/>\n", - dev->srcData.udp.bindService) < 0) - return -1; + virBufferVSprintf(buf, " <source mode='bind' service='%s'/>\n", + dev->srcData.udp.bindService); } if (dev->srcData.udp.connectService[0] != '\0' && dev->srcData.udp.connectHost[0] != '\0') { - if (virBufferVSprintf(buf, " <source mode='connect' host='%s' service='%s'/>\n", - dev->srcData.udp.connectHost, - dev->srcData.udp.connectService) < 0) - return -1; + virBufferVSprintf(buf, " <source mode='connect' host='%s' service='%s'/>\n", + dev->srcData.udp.connectHost, + dev->srcData.udp.connectService); } else if (dev->srcData.udp.connectHost[0] != '\0') { - if (virBufferVSprintf(buf, " <source mode='connect' host='%s'/>\n", - dev->srcData.udp.connectHost) < 0) - return -1; + virBufferVSprintf(buf, " <source mode='connect' host='%s'/>\n", + dev->srcData.udp.connectHost); } else if (dev->srcData.udp.connectService[0] != '\0') { - if (virBufferVSprintf(buf, " <source mode='connect' service='%s'/>\n", - dev->srcData.udp.connectService) < 0) - return -1; + virBufferVSprintf(buf, " <source mode='connect' service='%s'/>\n", + dev->srcData.udp.connectService); } break; case QEMUD_CHR_SRC_TYPE_TCP: - if (virBufferVSprintf(buf, " <source mode='%s' host='%s' service='%s'/>\n", - dev->srcData.tcp.listen ? "bind" : "connect", - dev->srcData.tcp.host, - dev->srcData.tcp.service) < 0) - return -1; - if (virBufferVSprintf(buf, " <protocol type='%s'/>\n", - dev->srcData.tcp.protocol == QEMUD_CHR_SRC_TCP_PROTOCOL_TELNET - ? "telnet" : "raw") < 0) - return -1; + virBufferVSprintf(buf, " <source mode='%s' host='%s' service='%s'/>\n", + dev->srcData.tcp.listen ? "bind" : "connect", + dev->srcData.tcp.host, + dev->srcData.tcp.service); + virBufferVSprintf(buf, " <protocol type='%s'/>\n", + dev->srcData.tcp.protocol == QEMUD_CHR_SRC_TCP_PROTOCOL_TELNET + ? "telnet" : "raw"); break; case QEMUD_CHR_SRC_TYPE_UNIX: - if (virBufferVSprintf(buf, " <source mode='%s' path='%s'/>\n", - dev->srcData.nix.listen ? "bind" : "connect", - dev->srcData.nix.path) < 0) - return -1; + virBufferVSprintf(buf, " <source mode='%s' path='%s'/>\n", + dev->srcData.nix.listen ? "bind" : "connect", + dev->srcData.nix.path); break; } - if (virBufferVSprintf(buf, " <target port='%d'/>\n", - dev->dstPort) < 0) - return -1; + virBufferVSprintf(buf, " <target port='%d'/>\n", + dev->dstPort); - if (virBufferVSprintf(buf, " </%s>\n", - type) < 0) - return -1; + virBufferVSprintf(buf, " </%s>\n", + type); return 0; } @@ -3461,7 +3447,7 @@ char *qemudGenerateXML(virConnectPtr con struct qemud_vm *vm, struct qemud_vm_def *def, int live) { - virBufferPtr buf = 0; + virBuffer buf = VIR_BUFFER_INITIALIZER; unsigned char *uuid; char uuidstr[VIR_UUID_STRING_BUFLEN]; const struct qemud_vm_disk_def *disk; @@ -3471,10 +3457,6 @@ char *qemudGenerateXML(virConnectPtr con const char *type = NULL; int n; - buf = virBufferNew (QEMUD_MAX_XML_LEN); - if (!buf) - goto no_memory; - switch (def->virtType) { case QEMUD_VIRT_QEMU: type = "qemu"; @@ -3492,49 +3474,34 @@ char *qemudGenerateXML(virConnectPtr con goto cleanup; } - if (qemudIsActiveVM(vm) && live) { - if (virBufferVSprintf(buf, "<domain type='%s' id='%d'>\n", type, vm->id) < 0) - goto no_memory; - } else { - if (virBufferVSprintf(buf, "<domain type='%s'>\n", type) < 0) - goto no_memory; - } + if (qemudIsActiveVM(vm) && live) + virBufferVSprintf(&buf, "<domain type='%s' id='%d'>\n", type, vm->id); + else + virBufferVSprintf(&buf, "<domain type='%s'>\n", type); - if (virBufferVSprintf(buf, " <name>%s</name>\n", def->name) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <name>%s</name>\n", def->name); uuid = def->uuid; virUUIDFormat(uuid, uuidstr); - if (virBufferVSprintf(buf, " <uuid>%s</uuid>\n", uuidstr) < 0) - goto no_memory; - if (virBufferVSprintf(buf, " <memory>%lu</memory>\n", def->maxmem) < 0) - goto no_memory; - if (virBufferVSprintf(buf, " <currentMemory>%lu</currentMemory>\n", def->memory) < 0) - goto no_memory; - if (virBufferVSprintf(buf, " <vcpu>%d</vcpu>\n", def->vcpus) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <uuid>%s</uuid>\n", uuidstr); - if (virBufferAddLit(buf, " <os>\n") < 0) - goto no_memory; - - if (def->virtType == QEMUD_VIRT_QEMU) { - if (virBufferVSprintf(buf, " <type arch='%s' machine='%s'>%s</type>\n", - def->os.arch, def->os.machine, def->os.type) < 0) - goto no_memory; - } else { - if (virBufferVSprintf(buf, " <type>%s</type>\n", def->os.type) < 0) - goto no_memory; - } + virBufferVSprintf(&buf, " <memory>%lu</memory>\n", def->maxmem); + virBufferVSprintf(&buf, " <currentMemory>%lu</currentMemory>\n", def->memory); + virBufferVSprintf(&buf, " <vcpu>%d</vcpu>\n", def->vcpus); + virBufferAddLit(&buf, " <os>\n"); + + if (def->virtType == QEMUD_VIRT_QEMU) + virBufferVSprintf(&buf, " <type arch='%s' machine='%s'>%s</type>\n", + def->os.arch, def->os.machine, def->os.type); + else + virBufferVSprintf(&buf, " <type>%s</type>\n", def->os.type); if (def->os.kernel[0]) - if (virBufferVSprintf(buf, " <kernel>%s</kernel>\n", def->os.kernel) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <kernel>%s</kernel>\n", def->os.kernel); if (def->os.initrd[0]) - if (virBufferVSprintf(buf, " <initrd>%s</initrd>\n", def->os.initrd) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <initrd>%s</initrd>\n", def->os.initrd); if (def->os.cmdline[0]) - if (virBufferVSprintf(buf, " <cmdline>%s</cmdline>\n", def->os.cmdline) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <cmdline>%s</cmdline>\n", def->os.cmdline); for (n = 0 ; n < def->os.nBootDevs ; n++) { const char *boottype = "hd"; @@ -3552,41 +3519,29 @@ char *qemudGenerateXML(virConnectPtr con boottype = "network"; break; } - if (virBufferVSprintf(buf, " <boot dev='%s'/>\n", boottype) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <boot dev='%s'/>\n", boottype); } - if (virBufferAddLit(buf, " </os>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " </os>\n"); if (def->features & QEMUD_FEATURE_ACPI) { - if (virBufferAddLit(buf, " <features>\n") < 0) - goto no_memory; - if (virBufferAddLit(buf, " <acpi/>\n") < 0) - goto no_memory; - if (virBufferAddLit(buf, " </features>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " <features>\n"); + virBufferAddLit(&buf, " <acpi/>\n"); + virBufferAddLit(&buf, " </features>\n"); } - virBufferVSprintf(buf, " <clock offset='%s'/>\n", def->localtime ? "localtime" : "utc"); + virBufferVSprintf(&buf, " <clock offset='%s'/>\n", def->localtime ? "localtime" : "utc"); - if (virBufferAddLit(buf, " <on_poweroff>destroy</on_poweroff>\n") < 0) - goto no_memory; - if (def->noReboot) { - if (virBufferAddLit(buf, " <on_reboot>destroy</on_reboot>\n") < 0) - goto no_memory; - } else { - if (virBufferAddLit(buf, " <on_reboot>restart</on_reboot>\n") < 0) - goto no_memory; - } - if (virBufferAddLit(buf, " <on_crash>destroy</on_crash>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " <on_poweroff>destroy</on_poweroff>\n"); + if (def->noReboot) + virBufferAddLit(&buf, " <on_reboot>destroy</on_reboot>\n"); + else + virBufferAddLit(&buf, " <on_reboot>restart</on_reboot>\n"); - if (virBufferAddLit(buf, " <devices>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " <on_crash>destroy</on_crash>\n"); + virBufferAddLit(&buf, " <devices>\n"); - if (virBufferVSprintf(buf, " <emulator>%s</emulator>\n", def->os.binary) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <emulator>%s</emulator>\n", def->os.binary); disk = def->disks; while (disk) { @@ -3603,24 +3558,19 @@ char *qemudGenerateXML(virConnectPtr con "cdrom", "floppy", }; - if (virBufferVSprintf(buf, " <disk type='%s' device='%s'>\n", - types[disk->type], devices[disk->device]) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <disk type='%s' device='%s'>\n", + types[disk->type], devices[disk->device]); if (disk->src[0]) - if (virBufferVSprintf(buf, " <source %s='%s'/>\n", - typeAttrs[disk->type], disk->src) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <source %s='%s'/>\n", + typeAttrs[disk->type], disk->src); - if (virBufferVSprintf(buf, " <target dev='%s'/>\n", disk->dst) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <target dev='%s'/>\n", disk->dst); if (disk->readonly) - if (virBufferAddLit(buf, " <readonly/>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " <readonly/>\n"); - if (virBufferAddLit(buf, " </disk>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " </disk>\n"); disk = disk->next; } @@ -3636,69 +3586,53 @@ char *qemudGenerateXML(virConnectPtr con "network", "bridge", }; - if (virBufferVSprintf(buf, " <interface type='%s'>\n", - types[net->type]) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <interface type='%s'>\n", + types[net->type]); - if (virBufferVSprintf(buf, " <mac address='%02x:%02x:%02x:%02x:%02x:%02x'/>\n", - net->mac[0], net->mac[1], net->mac[2], - net->mac[3], net->mac[4], net->mac[5]) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <mac address='%02x:%02x:%02x:%02x:%02x:%02x'/>\n", + net->mac[0], net->mac[1], net->mac[2], + net->mac[3], net->mac[4], net->mac[5]); switch (net->type) { case QEMUD_NET_NETWORK: - if (virBufferVSprintf(buf, " <source network='%s'/>\n", net->dst.network.name) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <source network='%s'/>\n", net->dst.network.name); - if (net->dst.network.ifname[0] != '\0') { - if (virBufferVSprintf(buf, " <target dev='%s'/>\n", net->dst.network.ifname) < 0) - goto no_memory; - } + if (net->dst.network.ifname[0] != '\0') + virBufferVSprintf(&buf, " <target dev='%s'/>\n", net->dst.network.ifname); break; case QEMUD_NET_ETHERNET: - if (net->dst.ethernet.ifname[0] != '\0') { - if (virBufferVSprintf(buf, " <target dev='%s'/>\n", net->dst.ethernet.ifname) < 0) - goto no_memory; - } - if (net->dst.ethernet.script[0] != '\0') { - if (virBufferVSprintf(buf, " <script path='%s'/>\n", net->dst.ethernet.script) < 0) - goto no_memory; - } + if (net->dst.ethernet.ifname[0] != '\0') + virBufferVSprintf(&buf, " <target dev='%s'/>\n", net->dst.ethernet.ifname); + if (net->dst.ethernet.script[0] != '\0') + virBufferVSprintf(&buf, " <script path='%s'/>\n", net->dst.ethernet.script); break; case QEMUD_NET_BRIDGE: - if (virBufferVSprintf(buf, " <source bridge='%s'/>\n", net->dst.bridge.brname) < 0) - goto no_memory; - if (net->dst.bridge.ifname[0] != '\0') { - if (virBufferVSprintf(buf, " <target dev='%s'/>\n", net->dst.bridge.ifname) < 0) - goto no_memory; - } + virBufferVSprintf(&buf, " <source bridge='%s'/>\n", net->dst.bridge.brname); + if (net->dst.bridge.ifname[0] != '\0') + virBufferVSprintf(&buf, " <target dev='%s'/>\n", net->dst.bridge.ifname); break; case QEMUD_NET_SERVER: case QEMUD_NET_CLIENT: case QEMUD_NET_MCAST: - if (net->dst.socket.address[0] != '\0') { - if (virBufferVSprintf(buf, " <source address='%s' port='%d'/>\n", - net->dst.socket.address, net->dst.socket.port) < 0) - goto no_memory; - } else { - if (virBufferVSprintf(buf, " <source port='%d'/>\n", - net->dst.socket.port) < 0) - goto no_memory; - } + if (net->dst.socket.address[0] != '\0') + virBufferVSprintf(&buf, " <source address='%s' port='%d'/>\n", + net->dst.socket.address, net->dst.socket.port); + else + virBufferVSprintf(&buf, " <source port='%d'/>\n", + net->dst.socket.port); } - if (virBufferAddLit(buf, " </interface>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " </interface>\n"); net = net->next; } chr = def->serials; while (chr) { - if (qemudGenerateXMLChar(buf, chr, "serial") < 0) + if (qemudGenerateXMLChar(&buf, chr, "serial") < 0) goto no_memory; chr = chr->next; @@ -3706,7 +3640,7 @@ char *qemudGenerateXML(virConnectPtr con chr = def->parallels; while (chr) { - if (qemudGenerateXMLChar(buf, chr, "parallel") < 0) + if (qemudGenerateXMLChar(&buf, chr, "parallel") < 0) goto no_memory; chr = chr->next; @@ -3714,49 +3648,41 @@ char *qemudGenerateXML(virConnectPtr con /* First serial device is the primary console */ if (def->nserials > 0 && - qemudGenerateXMLChar(buf, def->serials, "console") < 0) + qemudGenerateXMLChar(&buf, def->serials, "console") < 0) goto no_memory; input = def->inputs; while (input) { - if (input->bus != QEMU_INPUT_BUS_PS2 && - virBufferVSprintf(buf, " <input type='%s' bus='usb'/>\n", - input->type == QEMU_INPUT_TYPE_MOUSE ? "mouse" : "tablet") < 0) - goto no_memory; + if (input->bus != QEMU_INPUT_BUS_PS2) + virBufferVSprintf(&buf, " <input type='%s' bus='usb'/>\n", + input->type == QEMU_INPUT_TYPE_MOUSE ? "mouse" : "tablet"); input = input->next; } /* If graphics is enable, add implicit mouse */ if (def->graphicsType != QEMUD_GRAPHICS_NONE) - if (virBufferAddLit(buf, " <input type='mouse' bus='ps2'/>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " <input type='mouse' bus='ps2'/>\n"); switch (def->graphicsType) { case QEMUD_GRAPHICS_VNC: - if (virBufferAddLit(buf, " <graphics type='vnc'") < 0) - goto no_memory; + virBufferAddLit(&buf, " <graphics type='vnc'"); - if (def->vncPort && - virBufferVSprintf(buf, " port='%d'", - qemudIsActiveVM(vm) && live ? def->vncActivePort : def->vncPort) < 0) - goto no_memory; + if (def->vncPort) + virBufferVSprintf(&buf, " port='%d'", + qemudIsActiveVM(vm) && live ? def->vncActivePort : def->vncPort); - if (def->vncListen[0] && - virBufferVSprintf(buf, " listen='%s'", - def->vncListen) < 0) - goto no_memory; + if (def->vncListen[0]) + virBufferVSprintf(&buf, " listen='%s'", + def->vncListen); - if (def->keymap && - virBufferVSprintf(buf, " keymap='%s'", - def->keymap) < 0) - goto no_memory; + if (def->keymap) + virBufferVSprintf(&buf, " keymap='%s'", + def->keymap); - if (virBufferAddLit(buf, "/>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, "/>\n"); break; case QEMUD_GRAPHICS_SDL: - if (virBufferAddLit(buf, " <graphics type='sdl'/>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " <graphics type='sdl'/>\n"); break; case QEMUD_GRAPHICS_NONE: @@ -3764,20 +3690,19 @@ char *qemudGenerateXML(virConnectPtr con break; } - if (virBufferAddLit(buf, " </devices>\n") < 0) - goto no_memory; - + virBufferAddLit(&buf, " </devices>\n"); + virBufferAddLit(&buf, "</domain>\n"); - if (virBufferAddLit(buf, "</domain>\n") < 0) + if (virBufferError(&buf)) goto no_memory; - return virBufferContentAndFree (buf); + return virBufferContentAndReset(&buf); no_memory: qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, "%s", _("failed to generate XML: out of memory")); cleanup: - if (buf) virBufferFree (buf); + free(virBufferContentAndReset(&buf)); return NULL; } @@ -3786,89 +3711,73 @@ char *qemudGenerateNetworkXML(virConnect struct qemud_driver *driver ATTRIBUTE_UNUSED, struct qemud_network *network, struct qemud_network_def *def) { - virBufferPtr buf = 0; + virBuffer buf = VIR_BUFFER_INITIALIZER; unsigned char *uuid; char uuidstr[VIR_UUID_STRING_BUFLEN]; - buf = virBufferNew (QEMUD_MAX_XML_LEN); - if (!buf) - goto no_memory; + virBufferAddLit(&buf, "<network>\n"); - if (virBufferAddLit(buf, "<network>\n") < 0) - goto no_memory; - - if (virBufferVSprintf(buf, " <name>%s</name>\n", def->name) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <name>%s</name>\n", def->name); uuid = def->uuid; virUUIDFormat(uuid, uuidstr); - if (virBufferVSprintf(buf, " <uuid>%s</uuid>\n", uuidstr) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <uuid>%s</uuid>\n", uuidstr); if (def->forward) { if (def->forwardDev[0]) { - virBufferVSprintf(buf, " <forward dev='%s' mode='%s'/>\n", + virBufferVSprintf(&buf, " <forward dev='%s' mode='%s'/>\n", def->forwardDev, (def->forwardMode == QEMUD_NET_FORWARD_ROUTE ? "route" : "nat")); } else { - virBufferVSprintf(buf, " <forward mode='%s'/>\n", (def->forwardMode == QEMUD_NET_FORWARD_ROUTE ? "route" : "nat")); + virBufferVSprintf(&buf, " <forward mode='%s'/>\n", (def->forwardMode == QEMUD_NET_FORWARD_ROUTE ? "route" : "nat")); } } - virBufferAddLit(buf, " <bridge"); + virBufferAddLit(&buf, " <bridge"); if (qemudIsActiveNetwork(network)) { - if (virBufferVSprintf(buf, " name='%s'", network->bridge) < 0) - goto no_memory; + virBufferVSprintf(&buf, " name='%s'", network->bridge); } else if (def->bridge[0]) { - if (virBufferVSprintf(buf, " name='%s'", def->bridge) < 0) - goto no_memory; + virBufferVSprintf(&buf, " name='%s'", def->bridge); } - if (virBufferVSprintf(buf, " stp='%s' forwardDelay='%d' />\n", - def->disableSTP ? "off" : "on", - def->forwardDelay) < 0) - goto no_memory; + virBufferVSprintf(&buf, " stp='%s' forwardDelay='%d' />\n", + def->disableSTP ? "off" : "on", + def->forwardDelay); if (def->ipAddress[0] || def->netmask[0]) { - if (virBufferAddLit(buf, " <ip") < 0) - goto no_memory; + virBufferAddLit(&buf, " <ip"); - if (def->ipAddress[0] && - virBufferVSprintf(buf, " address='%s'", def->ipAddress) < 0) - goto no_memory; + if (def->ipAddress[0]) + virBufferVSprintf(&buf, " address='%s'", def->ipAddress); - if (def->netmask[0] && - virBufferVSprintf(buf, " netmask='%s'", def->netmask) < 0) - goto no_memory; + if (def->netmask[0]) + virBufferVSprintf(&buf, " netmask='%s'", def->netmask); - if (virBufferAddLit(buf, ">\n") < 0) - goto no_memory; + virBufferAddLit(&buf, ">\n"); if (def->ranges) { struct qemud_dhcp_range_def *range = def->ranges; - if (virBufferAddLit(buf, " <dhcp>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " <dhcp>\n"); while (range) { - if (virBufferVSprintf(buf, " <range start='%s' end='%s' />\n", - range->start, range->end) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <range start='%s' end='%s' />\n", + range->start, range->end); range = range->next; } - if (virBufferAddLit(buf, " </dhcp>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " </dhcp>\n"); } - if (virBufferAddLit(buf, " </ip>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " </ip>\n"); } - if (virBufferAddLit(buf, "</network>\n") < 0) + virBufferAddLit(&buf, "</network>\n"); + + if (virBufferError(&buf)) goto no_memory; - return virBufferContentAndFree (buf); + return virBufferContentAndReset(&buf); no_memory: qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, "%s", _("failed to generate XML: out of memory")); - if (buf) virBufferFree (buf); + free(virBufferContentAndReset(&buf)); return NULL; } Index: src/qparams.c =================================================================== RCS file: /data/cvs/libvirt/src/qparams.c,v retrieving revision 1.3 diff -u -p -r1.3 qparams.c --- src/qparams.c 10 Apr 2008 16:53:29 -0000 1.3 +++ src/qparams.c 28 Apr 2008 13:52:21 -0000 @@ -136,20 +136,23 @@ append_qparam (struct qparam_set *ps, char * qparam_get_query (const struct qparam_set *ps) { - virBufferPtr buf; + virBuffer buf = VIR_BUFFER_INITIALIZER; int i, amp = 0; - buf = virBufferNew (100); for (i = 0; i < ps->n; ++i) { if (!ps->p[i].ignore) { - if (amp) virBufferAddChar (buf, '&'); - virBufferStrcat (buf, ps->p[i].name, "=", NULL); - virBufferURIEncodeString (buf, ps->p[i].value); + if (amp) virBufferAddChar (&buf, '&'); + virBufferStrcat (&buf, ps->p[i].name, "=", NULL); + virBufferURIEncodeString (&buf, ps->p[i].value); amp = 1; } } - return virBufferContentAndFree (buf); + if (virBufferError(&buf)) { + return NULL; + } + + return virBufferContentAndReset(&buf); } void Index: src/storage_conf.c =================================================================== RCS file: /data/cvs/libvirt/src/storage_conf.c,v retrieving revision 1.5 diff -u -p -r1.5 storage_conf.c --- src/storage_conf.c 10 Apr 2008 16:53:29 -0000 1.5 +++ src/storage_conf.c 28 Apr 2008 13:52:21 -0000 @@ -414,7 +414,7 @@ char * virStoragePoolDefFormat(virConnectPtr conn, virStoragePoolDefPtr def) { virStorageBackendPoolOptionsPtr options; - virBufferPtr buf; + virBuffer buf = VIR_BUFFER_INITIALIZER; const char *type; char uuid[VIR_UUID_STRING_BUFLEN]; int i; @@ -423,126 +423,96 @@ virStoragePoolDefFormat(virConnectPtr co if (options == NULL) return NULL; - if ((buf = virBufferNew(8192)) == NULL) - goto no_memory; - type = virStorageBackendToString(def->type); if (!type) { virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("unexpected pool type")); goto cleanup; } - if (virBufferVSprintf(buf, "<pool type='%s'>\n", type) < 0) - goto no_memory; - - if (virBufferVSprintf(buf," <name>%s</name>\n", def->name) < 0) - goto no_memory; + virBufferVSprintf(&buf, "<pool type='%s'>\n", type); + virBufferVSprintf(&buf," <name>%s</name>\n", def->name); virUUIDFormat(def->uuid, uuid); - if (virBufferVSprintf(buf," <uuid>%s</uuid>\n", uuid) < 0) - goto no_memory; - - if (virBufferVSprintf(buf," <capacity>%llu</capacity>\n", - def->capacity) < 0) - goto no_memory; - if (virBufferVSprintf(buf," <allocation>%llu</allocation>\n", - def->allocation) < 0) - goto no_memory; - if (virBufferVSprintf(buf," <available>%llu</available>\n", - def->available) < 0) - goto no_memory; + virBufferVSprintf(&buf," <uuid>%s</uuid>\n", uuid); + virBufferVSprintf(&buf," <capacity>%llu</capacity>\n", + def->capacity); + virBufferVSprintf(&buf," <allocation>%llu</allocation>\n", + def->allocation); + virBufferVSprintf(&buf," <available>%llu</available>\n", + def->available); - if (virBufferAddLit(buf," <source>\n") < 0) - goto no_memory; + virBufferAddLit(&buf," <source>\n"); if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_HOST) && - def->source.host.name && - virBufferVSprintf(buf," <host name='%s'/>\n", def->source.host.name) < 0) - goto no_memory; + def->source.host.name) + virBufferVSprintf(&buf," <host name='%s'/>\n", def->source.host.name); + if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DEVICE) && def->source.ndevice) { for (i = 0 ; i < def->source.ndevice ; i++) { - if (virBufferVSprintf(buf," <device path='%s'>\n", def->source.devices[i].path) < 0) - goto no_memory; + virBufferVSprintf(&buf," <device path='%s'>\n", def->source.devices[i].path); if (def->source.devices[i].nfreeExtent) { int j; for (j = 0 ; j < def->source.devices[i].nfreeExtent ; j++) { - if (virBufferVSprintf(buf, " <freeExtent start='%llu' end='%llu'/>\n", - def->source.devices[i].freeExtents[j].start, - def->source.devices[i].freeExtents[j].end) < 0) - goto no_memory; + virBufferVSprintf(&buf, " <freeExtent start='%llu' end='%llu'/>\n", + def->source.devices[i].freeExtents[j].start, + def->source.devices[i].freeExtents[j].end); } } - if (virBufferAddLit(buf," </device>\n") < 0) - goto no_memory; + virBufferAddLit(&buf," </device>\n"); } } if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DIR) && - def->source.dir && - virBufferVSprintf(buf," <dir path='%s'/>\n", def->source.dir) < 0) - goto no_memory; + def->source.dir) + virBufferVSprintf(&buf," <dir path='%s'/>\n", def->source.dir); if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_ADAPTER) && - def->source.adapter && - virBufferVSprintf(buf," <adapter name='%s'/>\n", def->source.adapter) < 0) - goto no_memory; + def->source.adapter) + virBufferVSprintf(&buf," <adapter name='%s'/>\n", def->source.adapter); if (options->formatToString) { const char *format = (options->formatToString)(conn, def->source.format); if (!format) goto cleanup; - if (virBufferVSprintf(buf," <format type='%s'/>\n", format) < 0) - goto no_memory; + virBufferVSprintf(&buf," <format type='%s'/>\n", format); } - if (def->source.authType == VIR_STORAGE_POOL_AUTH_CHAP && - virBufferVSprintf(buf," <auth type='chap' login='%s' passwd='%s'>\n", + if (def->source.authType == VIR_STORAGE_POOL_AUTH_CHAP) + virBufferVSprintf(&buf," <auth type='chap' login='%s' passwd='%s'>\n", def->source.auth.chap.login, - def->source.auth.chap.passwd) < 0) - goto no_memory; - if (virBufferAddLit(buf," </source>\n") < 0) - goto no_memory; + def->source.auth.chap.passwd); + virBufferAddLit(&buf," </source>\n"); + virBufferAddLit(&buf," <target>\n"); + if (def->target.path) + virBufferVSprintf(&buf," <path>%s</path>\n", def->target.path); - if (virBufferAddLit(buf," <target>\n") < 0) - goto no_memory; + virBufferAddLit(&buf," <permissions>\n"); + virBufferVSprintf(&buf," <mode>0%o</mode>\n", + def->target.perms.mode); + virBufferVSprintf(&buf," <owner>%d</owner>\n", + def->target.perms.uid); + virBufferVSprintf(&buf," <group>%d</group>\n", + def->target.perms.gid); - if (def->target.path && - virBufferVSprintf(buf," <path>%s</path>\n", def->target.path) < 0) - goto no_memory; + if (def->target.perms.label) + virBufferVSprintf(&buf," <label>%s</label>\n", + def->target.perms.label); - if (virBufferAddLit(buf," <permissions>\n") < 0) - goto no_memory; - if (virBufferVSprintf(buf," <mode>0%o</mode>\n", - def->target.perms.mode) < 0) - goto no_memory; - if (virBufferVSprintf(buf," <owner>%d</owner>\n", - def->target.perms.uid) < 0) - goto no_memory; - if (virBufferVSprintf(buf," <group>%d</group>\n", - def->target.perms.gid) < 0) - goto no_memory; + virBufferAddLit(&buf," </permissions>\n"); + virBufferAddLit(&buf," </target>\n"); + virBufferAddLit(&buf,"</pool>\n"); - if (def->target.perms.label) { - if (virBufferVSprintf(buf," <label>%s</label>\n", - def->target.perms.label) < 0) - goto no_memory; - } - if (virBufferAddLit(buf," </permissions>\n") < 0) - goto no_memory; - if (virBufferAddLit(buf," </target>\n") < 0) + if (virBufferError(&buf)) goto no_memory; - if (virBufferAddLit(buf,"</pool>\n") < 0) - goto no_memory; - - return virBufferContentAndFree(buf); + return virBufferContentAndReset(&buf); no_memory: virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("xml")); cleanup: - virBufferFree(buf); + free(virBufferContentAndReset(&buf)); return NULL; } @@ -804,26 +774,17 @@ virStorageVolDefFormat(virConnectPtr con virStoragePoolDefPtr pool, virStorageVolDefPtr def) { virStorageBackendVolOptionsPtr options; - virBufferPtr buf = virBufferNew(8192); + virBuffer buf = VIR_BUFFER_INITIALIZER; options = virStorageBackendVolOptionsForType(pool->type); if (options == NULL) return NULL; - if (!buf) - goto no_memory; - - if (virBufferAddLit(buf, "<volume>\n") < 0) - goto no_memory; - - if (virBufferVSprintf(buf," <name>%s</name>\n", def->name) < 0) - goto no_memory; - - if (virBufferVSprintf(buf," <key>%s</key>\n", def->key) < 0) - goto no_memory; + virBufferAddLit(&buf, "<volume>\n"); + virBufferVSprintf(&buf," <name>%s</name>\n", def->name); + virBufferVSprintf(&buf," <key>%s</key>\n", def->key); + virBufferAddLit(&buf, " <source>\n"); - if (virBufferAddLit(buf, " <source>\n") < 0) - goto no_memory; if (def->source.nextent) { int i; const char *thispath = NULL; @@ -831,81 +792,67 @@ virStorageVolDefFormat(virConnectPtr con if (thispath == NULL || STRNEQ(thispath, def->source.extents[i].path)) { if (thispath != NULL) - if (virBufferAddLit(buf, " </device>\n") < 0) - goto no_memory; - if (virBufferVSprintf(buf, " <device path='%s'>\n", - def->source.extents[i].path) < 0) - goto no_memory; + virBufferAddLit(&buf, " </device>\n"); + + virBufferVSprintf(&buf, " <device path='%s'>\n", + def->source.extents[i].path); } - if (virBufferVSprintf(buf, - " <extent start='%llu' end='%llu'/>\n", - def->source.extents[i].start, - def->source.extents[i].end) < 0) - goto no_memory; + virBufferVSprintf(&buf, + " <extent start='%llu' end='%llu'/>\n", + def->source.extents[i].start, + def->source.extents[i].end); thispath = def->source.extents[i].path; } if (thispath != NULL) - if (virBufferAddLit(buf, " </device>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " </device>\n"); } - if (virBufferAddLit(buf, " </source>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " </source>\n"); - if (virBufferVSprintf(buf," <capacity>%llu</capacity>\n", - def->capacity) < 0) - goto no_memory; - if (virBufferVSprintf(buf," <allocation>%llu</allocation>\n", - def->allocation) < 0) - goto no_memory; + virBufferVSprintf(&buf," <capacity>%llu</capacity>\n", + def->capacity); + virBufferVSprintf(&buf," <allocation>%llu</allocation>\n", + def->allocation); - if (virBufferAddLit(buf, " <target>\n") < 0) - goto no_memory; + virBufferAddLit(&buf, " <target>\n"); - if (def->target.path && - virBufferVSprintf(buf," <path>%s</path>\n", def->target.path) < 0) - goto no_memory; + if (def->target.path) + virBufferVSprintf(&buf," <path>%s</path>\n", def->target.path); if (options->formatToString) { const char *format = (options->formatToString)(conn, def->target.format); if (!format) goto cleanup; - if (virBufferVSprintf(buf," <format type='%s'/>\n", format) < 0) - goto no_memory; + virBufferVSprintf(&buf," <format type='%s'/>\n", format); } - if (virBufferAddLit(buf," <permissions>\n") < 0) - goto no_memory; - if (virBufferVSprintf(buf," <mode>0%o</mode>\n", - def->target.perms.mode) < 0) - goto no_memory; - if (virBufferVSprintf(buf," <owner>%d</owner>\n", - def->target.perms.uid) < 0) - goto no_memory; - if (virBufferVSprintf(buf," <group>%d</group>\n", - def->target.perms.gid) < 0) - goto no_memory; + virBufferAddLit(&buf," <permissions>\n"); + virBufferVSprintf(&buf," <mode>0%o</mode>\n", + def->target.perms.mode); + virBufferVSprintf(&buf," <owner>%d</owner>\n", + def->target.perms.uid); + virBufferVSprintf(&buf," <group>%d</group>\n", + def->target.perms.gid); - if (def->target.perms.label && - virBufferVSprintf(buf," <label>%s</label>\n", - def->target.perms.label) < 0) - goto no_memory; - if (virBufferAddLit(buf," </permissions>\n") < 0) - goto no_memory; - if (virBufferAddLit(buf, " </target>\n") < 0) - goto no_memory; + if (def->target.perms.label) + virBufferVSprintf(&buf," <label>%s</label>\n", + def->target.perms.label); + + virBufferAddLit(&buf," </permissions>\n"); + virBufferAddLit(&buf, " </target>\n"); + virBufferAddLit(&buf,"</volume>\n"); - if (virBufferAddLit(buf,"</volume>\n") < 0) + if (virBufferError(&buf)) goto no_memory; - return virBufferContentAndFree(buf); + return virBufferContentAndReset(&buf); no_memory: virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("xml")); cleanup: - virBufferFree(buf); + free(virBufferContentAndReset(&buf)); return NULL; } Index: src/test.c =================================================================== RCS file: /data/cvs/libvirt/src/test.c,v retrieving revision 1.72 diff -u -p -r1.72 test.c --- src/test.c 10 Apr 2008 16:53:29 -0000 1.72 +++ src/test.c 28 Apr 2008 13:52:23 -0000 @@ -1523,34 +1523,30 @@ static int testSetVcpus(virDomainPtr dom static char *testDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED) { - virBufferPtr buf; - char *xml; + virBuffer buf = VIR_BUFFER_INITIALIZER; unsigned char *uuid; char uuidstr[VIR_UUID_STRING_BUFLEN]; GET_DOMAIN(domain, NULL); - if (!(buf = virBufferNew(4000))) { - testError(domain->conn, domain, NULL, VIR_ERR_NO_MEMORY, __FUNCTION__); - return (NULL); - } - - virBufferVSprintf(buf, "<domain type='test' id='%d'>\n", domain->id); - virBufferVSprintf(buf, " <name>%s</name>\n", domain->name); + virBufferVSprintf(&buf, "<domain type='test' id='%d'>\n", domain->id); + virBufferVSprintf(&buf, " <name>%s</name>\n", domain->name); uuid = domain->uuid; virUUIDFormat(uuid, uuidstr); - virBufferVSprintf(buf, " <uuid>%s</uuid>\n", uuidstr); - virBufferVSprintf(buf, " <memory>%lu</memory>\n", privdom->info.maxMem); - virBufferVSprintf(buf, " <vcpu>%d</vcpu>\n", privdom->info.nrVirtCpu); - virBufferVSprintf(buf, " <on_reboot>%s</on_reboot>\n", testRestartFlagToString(privdom->onReboot)); - virBufferVSprintf(buf, " <on_poweroff>%s</on_poweroff>\n", testRestartFlagToString(privdom->onPoweroff)); - virBufferVSprintf(buf, " <on_crash>%s</on_crash>\n", testRestartFlagToString(privdom->onCrash)); + virBufferVSprintf(&buf, " <uuid>%s</uuid>\n", uuidstr); + virBufferVSprintf(&buf, " <memory>%lu</memory>\n", privdom->info.maxMem); + virBufferVSprintf(&buf, " <vcpu>%d</vcpu>\n", privdom->info.nrVirtCpu); + virBufferVSprintf(&buf, " <on_reboot>%s</on_reboot>\n", testRestartFlagToString(privdom->onReboot)); + virBufferVSprintf(&buf, " <on_poweroff>%s</on_poweroff>\n", testRestartFlagToString(privdom->onPoweroff)); + virBufferVSprintf(&buf, " <on_crash>%s</on_crash>\n", testRestartFlagToString(privdom->onCrash)); - virBufferAddLit(buf, "</domain>\n"); + virBufferAddLit(&buf, "</domain>\n"); - xml = buf->content; - free(buf); + if (virBufferError(&buf)) { + testError(domain->conn, domain, NULL, VIR_ERR_NO_MEMORY, __FUNCTION__); + return NULL; + } - return (xml); + return virBufferContentAndReset(&buf); } static int testNumOfDefinedDomains(virConnectPtr conn) { @@ -1928,44 +1924,40 @@ static int testNetworkDestroy(virNetwork } static char *testNetworkDumpXML(virNetworkPtr network, int flags ATTRIBUTE_UNUSED) { - virBufferPtr buf; - char *xml; + virBuffer buf = VIR_BUFFER_INITIALIZER; unsigned char *uuid; char uuidstr[VIR_UUID_STRING_BUFLEN]; GET_NETWORK(network, NULL); - if (!(buf = virBufferNew(4000))) { - testError(network->conn, NULL, network, VIR_ERR_NO_MEMORY, __FUNCTION__); - return (NULL); - } - - virBufferAddLit(buf, "<network>\n"); - virBufferVSprintf(buf, " <name>%s</name>\n", network->name); + virBufferAddLit(&buf, "<network>\n"); + virBufferVSprintf(&buf, " <name>%s</name>\n", network->name); uuid = network->uuid; virUUIDFormat(uuid, uuidstr); - virBufferVSprintf(buf, " <uuid>%s</uuid>\n", uuidstr); - virBufferVSprintf(buf, " <bridge name='%s'/>\n", privnet->bridge); + virBufferVSprintf(&buf, " <uuid>%s</uuid>\n", uuidstr); + virBufferVSprintf(&buf, " <bridge name='%s'/>\n", privnet->bridge); if (privnet->forward) { if (privnet->forwardDev[0]) - virBufferVSprintf(buf, " <forward dev='%s'/>\n", privnet->forwardDev); + virBufferVSprintf(&buf, " <forward dev='%s'/>\n", privnet->forwardDev); else - virBufferAddLit(buf, " <forward/>\n"); + virBufferAddLit(&buf, " <forward/>\n"); } - virBufferVSprintf(buf, " <ip address='%s' netmask='%s'>\n", + virBufferVSprintf(&buf, " <ip address='%s' netmask='%s'>\n", privnet->ipAddress, privnet->ipNetmask); - virBufferAddLit(buf, " <dhcp>\n"); - virBufferVSprintf(buf, " <range start='%s' end='%s'/>\n", + virBufferAddLit(&buf, " <dhcp>\n"); + virBufferVSprintf(&buf, " <range start='%s' end='%s'/>\n", privnet->dhcpStart, privnet->dhcpEnd); - virBufferAddLit(buf, " </dhcp>\n"); - virBufferAddLit(buf, " </ip>\n"); + virBufferAddLit(&buf, " </dhcp>\n"); + virBufferAddLit(&buf, " </ip>\n"); - virBufferAddLit(buf, "</network>\n"); + virBufferAddLit(&buf, "</network>\n"); - xml = buf->content; - free(buf); + if (virBufferError(&buf)) { + testError(network->conn, NULL, network, VIR_ERR_NO_MEMORY, __FUNCTION__); + return NULL; + } - return (xml); + return virBufferContentAndReset(&buf); } static char *testNetworkGetBridgeName(virNetworkPtr network) { Index: src/virsh.c =================================================================== RCS file: /data/cvs/libvirt/src/virsh.c,v retrieving revision 1.147 diff -u -p -r1.147 virsh.c --- src/virsh.c 28 Apr 2008 09:09:52 -0000 1.147 +++ src/virsh.c 28 Apr 2008 13:52:27 -0000 @@ -2885,10 +2885,9 @@ cmdPoolCreateAs(vshControl * ctl, vshCmd { virStoragePoolPtr pool; int found; + char *xml; char *name, *type, *srcHost, *srcPath, *srcDev, *target; - virBuffer buf; - - memset(&buf, 0, sizeof(buf)); + virBuffer buf = VIR_BUFFER_INITIALIZER; if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) return FALSE; @@ -2905,39 +2904,36 @@ cmdPoolCreateAs(vshControl * ctl, vshCmd srcDev = vshCommandOptString(cmd, "source-dev", &found); target = vshCommandOptString(cmd, "target", &found); - if (virBufferVSprintf(&buf, "<pool type='%s'>\n", type) < 0) - goto cleanup; - if (virBufferVSprintf(&buf, " <name>%s</name>\n", name) < 0) - goto cleanup; + virBufferVSprintf(&buf, "<pool type='%s'>\n", type); + virBufferVSprintf(&buf, " <name>%s</name>\n", name); if (srcHost || srcPath || srcDev) { - if (virBufferAddLit(&buf, " <source>\n") < 0) - goto cleanup; - if (srcHost && - virBufferVSprintf(&buf, " <host name='%s'>\n", srcHost) < 0) - goto cleanup; - if (srcPath && - virBufferVSprintf(&buf, " <dir path='%s'/>\n", srcPath) < 0) - goto cleanup; - if (srcDev && - virBufferVSprintf(&buf, " <device path='%s'/>\n", srcDev) < 0) - goto cleanup; + virBufferAddLit(&buf, " <source>\n"); + if (srcHost) + virBufferVSprintf(&buf, " <host name='%s'>\n", srcHost); - if (virBufferAddLit(&buf, " </source>\n") < 0) - goto cleanup; + if (srcPath) + virBufferVSprintf(&buf, " <dir path='%s'/>\n", srcPath); + + if (srcDev) + virBufferVSprintf(&buf, " <device path='%s'/>\n", srcDev); + + virBufferAddLit(&buf, " </source>\n"); } if (target) { - if (virBufferAddLit(&buf, " <target>\n") < 0) - goto cleanup; - if (virBufferVSprintf(&buf, " <path>%s</path>\n", target) < 0) - goto cleanup; - if (virBufferAddLit(&buf, " </target>\n") < 0) - goto cleanup; + virBufferAddLit(&buf, " <target>\n"); + virBufferVSprintf(&buf, " <path>%s</path>\n", target); + virBufferAddLit(&buf, " </target>\n"); } - if (virBufferAddLit(&buf, "</pool>\n") < 0) - goto cleanup; + virBufferAddLit(&buf, "</pool>\n"); + + if (virBufferError(&buf)) { + vshPrint(ctl, "%s", _("Failed to allocate XML buffer")); + return FALSE; + } + xml = virBufferContentAndReset(&buf); - pool = virStoragePoolCreateXML(ctl->conn, buf.content, 0); - free (buf.content); + pool = virStoragePoolCreateXML(ctl->conn, xml, 0); + free (xml); if (pool != NULL) { vshPrint(ctl, _("Pool %s created\n"), name); @@ -2949,7 +2945,7 @@ cmdPoolCreateAs(vshControl * ctl, vshCmd } cleanup: - free(buf.content); + free(virBufferContentAndReset(&buf)); return FALSE; } @@ -3028,10 +3024,9 @@ cmdPoolDefineAs(vshControl * ctl, vshCmd { virStoragePoolPtr pool; int found; + char *xml; char *name, *type, *srcHost, *srcPath, *srcDev, *target; - virBuffer buf; - - memset(&buf, 0, sizeof(buf)); + virBuffer buf = VIR_BUFFER_INITIALIZER; if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) return FALSE; @@ -3048,39 +3043,35 @@ cmdPoolDefineAs(vshControl * ctl, vshCmd srcDev = vshCommandOptString(cmd, "source-dev", &found); target = vshCommandOptString(cmd, "target", &found); - if (virBufferVSprintf(&buf, "<pool type='%s'>\n", type) < 0) - goto cleanup; - if (virBufferVSprintf(&buf, " <name>%s</name>\n", name) < 0) - goto cleanup; + virBufferVSprintf(&buf, "<pool type='%s'>\n", type); + virBufferVSprintf(&buf, " <name>%s</name>\n", name); if (srcHost || srcPath || srcDev) { - if (virBufferAddLit(&buf, " <source>\n") < 0) - goto cleanup; - if (srcHost && - virBufferVSprintf(&buf, " <host>%s</host>\n", srcHost) < 0) - goto cleanup; - if (srcPath && - virBufferVSprintf(&buf, " <path>%s</path>\n", srcPath) < 0) - goto cleanup; - if (srcDev && - virBufferVSprintf(&buf, " <device>%s</device>\n", srcDev) < 0) - goto cleanup; + virBufferAddLit(&buf, " <source>\n"); + if (srcHost) + virBufferVSprintf(&buf, " <host>%s</host>\n", srcHost); + if (srcPath) + virBufferVSprintf(&buf, " <path>%s</path>\n", srcPath); + if (srcDev) + virBufferVSprintf(&buf, " <device>%s</device>\n", srcDev); - if (virBufferAddLit(&buf, " </source>\n") < 0) - goto cleanup; + virBufferAddLit(&buf, " </source>\n"); } if (target) { - if (virBufferAddLit(&buf, " <target>\n") < 0) - goto cleanup; - if (virBufferVSprintf(&buf, " <path>%s</path>\n", target) < 0) - goto cleanup; - if (virBufferAddLit(&buf, " </target>\n") < 0) - goto cleanup; + virBufferAddLit(&buf, " <target>\n"); + virBufferVSprintf(&buf, " <path>%s</path>\n", target); + virBufferAddLit(&buf, " </target>\n"); } - if (virBufferAddLit(&buf, "</pool>\n") < 0) - goto cleanup; + virBufferAddLit(&buf, "</pool>\n"); - pool = virStoragePoolDefineXML(ctl->conn, buf.content, 0); - free (buf.content); + + if (virBufferError(&buf)) { + vshPrint(ctl, "%s", _("Failed to allocate XML buffer")); + return FALSE; + } + xml = virBufferContentAndReset(&buf); + + pool = virStoragePoolDefineXML(ctl->conn, xml, 0); + free (xml); if (pool != NULL) { vshPrint(ctl, _("Pool %s defined\n"), name); @@ -3092,7 +3083,7 @@ cmdPoolDefineAs(vshControl * ctl, vshCmd } cleanup: - free(buf.content); + free(virBufferContentAndReset(&buf)); return FALSE; } @@ -3641,11 +3632,10 @@ cmdVolCreateAs(vshControl * ctl, vshCmd virStoragePoolPtr pool; virStorageVolPtr vol; int found; + char *xml; char *name, *capacityStr, *allocationStr, *format; unsigned long long capacity, allocation = 0; - virBuffer buf; - - memset(&buf, 0, sizeof(buf)); + virBuffer buf = VIR_BUFFER_INITIALIZER; if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) return FALSE; @@ -3671,30 +3661,28 @@ cmdVolCreateAs(vshControl * ctl, vshCmd format = vshCommandOptString(cmd, "format", &found); - if (virBufferAddLit(&buf, "<volume>\n") < 0) - goto cleanup; - if (virBufferVSprintf(&buf, " <name>%s</name>\n", name) < 0) - goto cleanup; - if (virBufferVSprintf(&buf, " <capacity>%llu</capacity>\n", capacity) < 0) - goto cleanup; - if (allocationStr && - virBufferVSprintf(&buf, " <allocation>%llu</allocation>\n", allocation) < 0) - goto cleanup; + virBufferAddLit(&buf, "<volume>\n"); + virBufferVSprintf(&buf, " <name>%s</name>\n", name); + virBufferVSprintf(&buf, " <capacity>%llu</capacity>\n", capacity); + if (allocationStr) + virBufferVSprintf(&buf, " <allocation>%llu</allocation>\n", allocation); if (format) { - if (virBufferAddLit(&buf, " <target>\n") < 0) - goto cleanup; + virBufferAddLit(&buf, " <target>\n"); if (format) - if (virBufferVSprintf(&buf, " <format type='%s'/>\n",format) < 0) - goto cleanup; - if (virBufferAddLit(&buf, " </target>\n") < 0) - goto cleanup; + virBufferVSprintf(&buf, " <format type='%s'/>\n",format); + virBufferAddLit(&buf, " </target>\n"); } - if (virBufferAddLit(&buf, "</volume>\n") < 0) - goto cleanup; + virBufferAddLit(&buf, "</volume>\n"); + - vol = virStorageVolCreateXML(pool, buf.content, 0); - free (buf.content); + if (virBufferError(&buf)) { + vshPrint(ctl, "%s", _("Failed to allocate XML buffer")); + return FALSE; + } + xml = virBufferContentAndReset(&buf); + vol = virStorageVolCreateXML(pool, xml, 0); + free (xml); virStoragePoolFree(pool); if (vol != NULL) { @@ -3707,7 +3695,7 @@ cmdVolCreateAs(vshControl * ctl, vshCmd } cleanup: - free(buf.content); + free(virBufferContentAndReset(&buf)); virStoragePoolFree(pool); return FALSE; } Index: src/xend_internal.c =================================================================== RCS file: /data/cvs/libvirt/src/xend_internal.c,v retrieving revision 1.181 diff -u -p -r1.181 xend_internal.c --- src/xend_internal.c 26 Apr 2008 14:22:02 -0000 1.181 +++ src/xend_internal.c 28 Apr 2008 13:52:30 -0000 @@ -608,16 +608,9 @@ xend_op_ext2(virConnectPtr xend, const c size_t n_error, const char *key, va_list ap) { const char *k = key, *v; - virBuffer buf; + virBuffer buf = VIR_BUFFER_INITIALIZER; int ret; - - buf.content = malloc(1000); - if (buf.content == NULL) { - virXendError(xend, VIR_ERR_NO_MEMORY, _("allocate new buffer")); - return -1; - } - buf.size = 1000; - buf.use = 0; + char *content; while (k) { v = va_arg(ap, const char *); @@ -631,8 +624,14 @@ xend_op_ext2(virConnectPtr xend, const c virBufferVSprintf(&buf, "%s", "&"); } - ret = http2unix(xend, xend_post(xend, path, buf.content, error, n_error)); - free(buf.content); + if (virBufferError(&buf)) { + virXendError(NULL, VIR_ERR_NO_MEMORY, _("allocate buffer")); + return -1; + } + + content = virBufferContentAndReset(&buf); + ret = http2unix(xend, xend_post(xend, path, content, error, n_error)); + free(content); return ret; } @@ -1437,13 +1436,11 @@ xend_parse_sexp_desc_char(virConnectPtr if (STREQ(devtype, "console") && STREQ(type, "pty") && tty != NULL) { - if (virBufferVSprintf(buf, " <%s type='%s' tty='%s'>\n", - devtype, type, tty) < 0) - goto no_memory; + virBufferVSprintf(buf, " <%s type='%s' tty='%s'>\n", + devtype, type, tty); } else { - if (virBufferVSprintf(buf, " <%s type='%s'>\n", - devtype, type) < 0) - goto no_memory; + virBufferVSprintf(buf, " <%s type='%s'>\n", + devtype, type); } if (STREQ(type, "null") || @@ -1451,15 +1448,13 @@ xend_parse_sexp_desc_char(virConnectPtr STREQ(type, "stdio")) { /* no source needed */ } else if (STREQ(type, "pty")) { - if (tty && + if (tty) virBufferVSprintf(buf, " <source path='%s'/>\n", - tty) < 0) - goto no_memory; + tty); } else if (STREQ(type, "file") || STREQ(type, "pipe")) { - if (virBufferVSprintf(buf, " <source path='%s'/>\n", - value) < 0) - goto no_memory; + virBufferVSprintf(buf, " <source path='%s'/>\n", + value); } else if (STREQ(type, "tcp")) { const char *offset = strchr(value, ':'); const char *offset2; @@ -1490,20 +1485,17 @@ xend_parse_sexp_desc_char(virConnectPtr protocol = telnet ? "telnet":"raw"; if (bindHost) { - if (virBufferVSprintf(buf, - " <source mode='%s' host='%s' service='%s'/>\n", - mode, bindHost, bindPort) < 0) - goto no_memory; + virBufferVSprintf(buf, + " <source mode='%s' host='%s' service='%s'/>\n", + mode, bindHost, bindPort); } else { - if (virBufferVSprintf(buf, - " <source mode='%s' service='%s'/>\n", - mode, bindPort) < 0) - goto no_memory; - } - if (virBufferVSprintf(buf, - " <protocol type='%s'/>\n", - protocol) < 0) - goto no_memory; + virBufferVSprintf(buf, + " <source mode='%s' service='%s'/>\n", + mode, bindPort); + } + virBufferVSprintf(buf, + " <protocol type='%s'/>\n", + protocol); } else if (STREQ(type, "udp")) { const char *offset = strchr(value, ':'); const char *offset2, *offset3; @@ -1543,28 +1535,24 @@ xend_parse_sexp_desc_char(virConnectPtr if (connectPort) { if (connectHost) { - if (virBufferVSprintf(buf, - " <source mode='connect' host='%s' service='%s'/>\n", - connectHost, connectPort) < 0) - goto no_memory; + virBufferVSprintf(buf, + " <source mode='connect' host='%s' service='%s'/>\n", + connectHost, connectPort); } else { - if (virBufferVSprintf(buf, - " <source mode='connect' service='%s'/>\n", - connectPort) < 0) - goto no_memory; + virBufferVSprintf(buf, + " <source mode='connect' service='%s'/>\n", + connectPort); } } if (bindPort) { if (bindHost) { - if (virBufferVSprintf(buf, - " <source mode='bind' host='%s' service='%s'/>\n", - bindHost, bindPort) < 0) - goto no_memory; + virBufferVSprintf(buf, + " <source mode='bind' host='%s' service='%s'/>\n", + bindHost, bindPort); } else { - if (virBufferVSprintf(buf, - " <source mode='bind' service='%s'/>\n", - bindPort) < 0) - goto no_memory; + virBufferVSprintf(buf, + " <source mode='bind' service='%s'/>\n", + bindPort); } } @@ -1582,18 +1570,15 @@ xend_parse_sexp_desc_char(virConnectPtr strstr(offset, ",listen") != NULL) dolisten = 1; - if (virBufferVSprintf(buf, " <source mode='%s' path='%s'/>\n", - dolisten ? "bind" : "connect", path) < 0) - goto no_memory; + virBufferVSprintf(buf, " <source mode='%s' path='%s'/>\n", + dolisten ? "bind" : "connect", path); } - if (virBufferVSprintf(buf, " <target port='%d'/>\n", - portNum) < 0) - goto no_memory; - - if (virBufferVSprintf(buf, " </%s>\n", - devtype) < 0) - goto no_memory; + virBufferVSprintf(buf, " <target port='%d'/>\n", + portNum); + + virBufferVSprintf(buf, " </%s>\n", + devtype); ret = 0; @@ -1635,7 +1620,7 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *cur, *node; const char *tmp; char *tty; - virBuffer buf; + virBuffer buf = VIR_BUFFER_INITIALIZER; int hvm = 0, bootloader = 0, vfb = 0; int domid = -1; int max_mem, cur_mem; @@ -1647,11 +1632,6 @@ xend_parse_sexp_desc(virConnectPtr conn, /* ERROR */ return (NULL); } - buf.content = malloc(4000); - if (buf.content == NULL) - return (NULL); - buf.size = 4000; - buf.use = 0; tmp = sexpr_node(root, "domain/domid"); if (tmp == NULL && xendConfigVersion < 3) { /* Old XenD, domid was mandatory */ @@ -2097,11 +2077,15 @@ xend_parse_sexp_desc(virConnectPtr conn, virBufferAddLit(&buf, " </devices>\n"); virBufferAddLit(&buf, "</domain>\n"); - buf.content[buf.use] = 0; - return (buf.content); + if (virBufferError(&buf)) { + virXendError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer")); + return NULL; + } + + return virBufferContentAndReset(&buf); error: - free(buf.content); + free(virBufferContentAndReset(&buf)); return (NULL); } Index: src/xm_internal.c =================================================================== RCS file: /data/cvs/libvirt/src/xm_internal.c,v retrieving revision 1.71 diff -u -p -r1.71 xm_internal.c --- src/xm_internal.c 26 Apr 2008 14:22:02 -0000 1.71 +++ src/xm_internal.c 28 Apr 2008 13:52:32 -0000 @@ -579,8 +579,7 @@ int xenXMDomainGetInfo(virDomainPtr doma * domain, suitable for later feeding for virDomainCreateLinux */ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) { - virBufferPtr buf; - char *xml; + virBuffer buf = VIR_BUFFER_INITIALIZER; const char *name; unsigned char uuid[VIR_UUID_BUFLEN]; char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -602,12 +601,10 @@ char *xenXMDomainFormatXML(virConnectPtr if (xenXMConfigGetUUID(conf, "uuid", uuid) < 0) return (NULL); - buf = virBufferNew(4096); - - virBufferAddLit(buf, "<domain type='xen'>\n"); - virBufferVSprintf(buf, " <name>%s</name>\n", name); + virBufferAddLit(&buf, "<domain type='xen'>\n"); + virBufferVSprintf(&buf, " <name>%s</name>\n", name); virUUIDFormat(uuid, uuidstr); - virBufferVSprintf(buf, " <uuid>%s</uuid>\n", uuidstr); + virBufferVSprintf(&buf, " <uuid>%s</uuid>\n", uuidstr); if ((xenXMConfigGetString(conf, "builder", &str) == 0) && !strcmp(str, "hvm")) @@ -615,10 +612,10 @@ char *xenXMDomainFormatXML(virConnectPtr if (hvm) { const char *boot; - virBufferAddLit(buf, " <os>\n"); - virBufferAddLit(buf, " <type>hvm</type>\n"); + virBufferAddLit(&buf, " <os>\n"); + virBufferAddLit(&buf, " <type>hvm</type>\n"); if (xenXMConfigGetString(conf, "kernel", &str) == 0) - virBufferVSprintf(buf, " <loader>%s</loader>\n", str); + virBufferVSprintf(&buf, " <loader>%s</loader>\n", str); if (xenXMConfigGetString(conf, "boot", &boot) < 0) boot = "c"; @@ -637,90 +634,90 @@ char *xenXMDomainFormatXML(virConnectPtr dev = "hd"; break; } - virBufferVSprintf(buf, " <boot dev='%s'/>\n", dev); + virBufferVSprintf(&buf, " <boot dev='%s'/>\n", dev); boot++; } - virBufferAddLit(buf, " </os>\n"); + virBufferAddLit(&buf, " </os>\n"); } else { if (xenXMConfigGetString(conf, "bootloader", &str) == 0) - virBufferVSprintf(buf, " <bootloader>%s</bootloader>\n", str); + virBufferVSprintf(&buf, " <bootloader>%s</bootloader>\n", str); if (xenXMConfigGetString(conf, "bootargs", &str) == 0) - virBufferEscapeString(buf, " <bootloader_args>%s</bootloader_args>\n", str); + virBufferEscapeString(&buf, " <bootloader_args>%s</bootloader_args>\n", str); if (xenXMConfigGetString(conf, "kernel", &str) == 0) { - virBufferAddLit(buf, " <os>\n"); - virBufferAddLit(buf, " <type>linux</type>\n"); - virBufferVSprintf(buf, " <kernel>%s</kernel>\n", str); + virBufferAddLit(&buf, " <os>\n"); + virBufferAddLit(&buf, " <type>linux</type>\n"); + virBufferVSprintf(&buf, " <kernel>%s</kernel>\n", str); if (xenXMConfigGetString(conf, "ramdisk", &str) == 0) - virBufferVSprintf(buf, " <initrd>%s</initrd>\n", str); + virBufferVSprintf(&buf, " <initrd>%s</initrd>\n", str); if (xenXMConfigGetString(conf, "extra", &str) == 0) - virBufferEscapeString(buf, " <cmdline>%s</cmdline>\n", str); - virBufferAddLit(buf, " </os>\n"); + virBufferEscapeString(&buf, " <cmdline>%s</cmdline>\n", str); + virBufferAddLit(&buf, " </os>\n"); } } if (xenXMConfigGetInt(conf, "memory", &val) < 0) val = MIN_XEN_GUEST_SIZE * 2; - virBufferVSprintf(buf, " <currentMemory>%ld</currentMemory>\n", + virBufferVSprintf(&buf, " <currentMemory>%ld</currentMemory>\n", val * 1024); if (xenXMConfigGetInt(conf, "maxmem", &val) < 0) if (xenXMConfigGetInt(conf, "memory", &val) < 0) val = MIN_XEN_GUEST_SIZE * 2; - virBufferVSprintf(buf, " <memory>%ld</memory>\n", val * 1024); + virBufferVSprintf(&buf, " <memory>%ld</memory>\n", val * 1024); - virBufferAddLit(buf, " <vcpu"); + virBufferAddLit(&buf, " <vcpu"); if (xenXMConfigGetString(conf, "cpus", &str) == 0) { char *ranges; ranges = virConvertCpuSet(conn, str, 0); if (ranges != NULL) { - virBufferVSprintf(buf, " cpuset='%s'", ranges); + virBufferVSprintf(&buf, " cpuset='%s'", ranges); free(ranges); } else - virBufferVSprintf(buf, " cpuset='%s'", str); + virBufferVSprintf(&buf, " cpuset='%s'", str); } if (xenXMConfigGetInt(conf, "vcpus", &val) < 0) val = 1; - virBufferVSprintf(buf, ">%ld</vcpu>\n", val); + virBufferVSprintf(&buf, ">%ld</vcpu>\n", val); if (xenXMConfigGetString(conf, "on_poweroff", &str) < 0) str = "destroy"; - virBufferVSprintf(buf, " <on_poweroff>%s</on_poweroff>\n", str); + virBufferVSprintf(&buf, " <on_poweroff>%s</on_poweroff>\n", str); if (xenXMConfigGetString(conf, "on_reboot", &str) < 0) str = "restart"; - virBufferVSprintf(buf, " <on_reboot>%s</on_reboot>\n", str); + virBufferVSprintf(&buf, " <on_reboot>%s</on_reboot>\n", str); if (xenXMConfigGetString(conf, "on_crash", &str) < 0) str = "restart"; - virBufferVSprintf(buf, " <on_crash>%s</on_crash>\n", str); + virBufferVSprintf(&buf, " <on_crash>%s</on_crash>\n", str); if (hvm) { - virBufferAddLit(buf, " <features>\n"); + virBufferAddLit(&buf, " <features>\n"); if (xenXMConfigGetInt(conf, "pae", &val) == 0 && val) - virBufferAddLit(buf, " <pae/>\n"); + virBufferAddLit(&buf, " <pae/>\n"); if (xenXMConfigGetInt(conf, "acpi", &val) == 0 && val) - virBufferAddLit(buf, " <acpi/>\n"); + virBufferAddLit(&buf, " <acpi/>\n"); if (xenXMConfigGetInt(conf, "apic", &val) == 0 && val) - virBufferAddLit(buf, " <apic/>\n"); - virBufferAddLit(buf, " </features>\n"); + virBufferAddLit(&buf, " <apic/>\n"); + virBufferAddLit(&buf, " </features>\n"); if (xenXMConfigGetInt(conf, "localtime", &val) < 0) val = 0; - virBufferVSprintf(buf, " <clock offset='%s'/>\n", val ? "localtime" : "utc"); + virBufferVSprintf(&buf, " <clock offset='%s'/>\n", val ? "localtime" : "utc"); } - virBufferAddLit(buf, " <devices>\n"); + virBufferAddLit(&buf, " <devices>\n"); if (hvm) { if (xenXMConfigGetString(conf, "device_model", &str) == 0) - virBufferVSprintf(buf, " <emulator>%s</emulator>\n", str); + virBufferVSprintf(&buf, " <emulator>%s</emulator>\n", str); } list = virConfGetValue(conf, "disk"); @@ -808,23 +805,23 @@ char *xenXMDomainFormatXML(virConnectPtr tmp[0] = '\0'; } - virBufferVSprintf(buf, " <disk type='%s' device='%s'>\n", + virBufferVSprintf(&buf, " <disk type='%s' device='%s'>\n", block ? "block" : "file", cdrom ? "cdrom" : "disk"); if (drvType[0]) - virBufferVSprintf(buf, " <driver name='%s' type='%s'/>\n", drvName, drvType); + virBufferVSprintf(&buf, " <driver name='%s' type='%s'/>\n", drvName, drvType); else - virBufferVSprintf(buf, " <driver name='%s'/>\n", drvName); + virBufferVSprintf(&buf, " <driver name='%s'/>\n", drvName); if (src[0]) - virBufferVSprintf(buf, " <source %s='%s'/>\n", block ? "dev" : "file", src); - virBufferVSprintf(buf, " <target dev='%s'/>\n", dev); + virBufferVSprintf(&buf, " <source %s='%s'/>\n", block ? "dev" : "file", src); + virBufferVSprintf(&buf, " <target dev='%s'/>\n", dev); if (!strcmp(head, "r") || !strcmp(head, "ro")) - virBufferAddLit(buf, " <readonly/>\n"); + virBufferAddLit(&buf, " <readonly/>\n"); else if ((!strcmp(head, "w!")) || (!strcmp(head, "!"))) - virBufferAddLit(buf, " <shareable/>\n"); - virBufferAddLit(buf, " </disk>\n"); + virBufferAddLit(&buf, " <shareable/>\n"); + virBufferAddLit(&buf, " </disk>\n"); skipdisk: list = list->next; @@ -833,12 +830,12 @@ char *xenXMDomainFormatXML(virConnectPtr if (hvm && priv->xendConfigVersion == 1) { if (xenXMConfigGetString(conf, "cdrom", &str) == 0) { - virBufferAddLit(buf, " <disk type='file' device='cdrom'>\n"); - virBufferAddLit(buf, " <driver name='file'/>\n"); - virBufferVSprintf(buf, " <source file='%s'/>\n", str); - virBufferAddLit(buf, " <target dev='hdc'/>\n"); - virBufferAddLit(buf, " <readonly/>\n"); - virBufferAddLit(buf, " </disk>\n"); + virBufferAddLit(&buf, " <disk type='file' device='cdrom'>\n"); + virBufferAddLit(&buf, " <driver name='file'/>\n"); + virBufferVSprintf(&buf, " <source file='%s'/>\n", str); + virBufferAddLit(&buf, " <target dev='hdc'/>\n"); + virBufferAddLit(&buf, " <readonly/>\n"); + virBufferAddLit(&buf, " </disk>\n"); } } @@ -909,16 +906,16 @@ char *xenXMDomainFormatXML(virConnectPtr type = 1; } - virBufferAddLit(buf, " <interface type='bridge'>\n"); + virBufferAddLit(&buf, " <interface type='bridge'>\n"); if (mac[0]) - virBufferVSprintf(buf, " <mac address='%s'/>\n", mac); + virBufferVSprintf(&buf, " <mac address='%s'/>\n", mac); if (type == 1 && bridge[0]) - virBufferVSprintf(buf, " <source bridge='%s'/>\n", bridge); + virBufferVSprintf(&buf, " <source bridge='%s'/>\n", bridge); if (script[0]) - virBufferVSprintf(buf, " <script path='%s'/>\n", script); + virBufferVSprintf(&buf, " <script path='%s'/>\n", script); if (ip[0]) - virBufferVSprintf(buf, " <ip address='%s'/>\n", ip); - virBufferAddLit(buf, " </interface>\n"); + virBufferVSprintf(&buf, " <ip address='%s'/>\n", ip); + virBufferAddLit(&buf, " </interface>\n"); skipnic: list = list->next; @@ -928,9 +925,9 @@ char *xenXMDomainFormatXML(virConnectPtr if (hvm) { if (xenXMConfigGetString(conf, "usbdevice", &str) == 0 && str) { if (!strcmp(str, "tablet")) - virBufferAddLit(buf, " <input type='tablet' bus='usb'/>\n"); + virBufferAddLit(&buf, " <input type='tablet' bus='usb'/>\n"); else if (!strcmp(str, "mouse")) - virBufferAddLit(buf, " <input type='mouse' bus='usb'/>\n"); + virBufferAddLit(&buf, " <input type='mouse' bus='usb'/>\n"); /* Ignore else branch - probably some other non-input device we don't support in libvirt yet */ } @@ -1003,54 +1000,56 @@ char *xenXMDomainFormatXML(virConnectPtr } if (vnc || sdl) { - virBufferVSprintf(buf, " <input type='mouse' bus='%s'/>\n", hvm ? "ps2":"xen"); + virBufferVSprintf(&buf, " <input type='mouse' bus='%s'/>\n", hvm ? "ps2":"xen"); } if (vnc) { - virBufferVSprintf(buf, + virBufferVSprintf(&buf, " <graphics type='vnc' port='%ld'", (vncunused ? -1 : 5900+vncdisplay)); if (vnclisten) { - virBufferVSprintf(buf, " listen='%s'", vnclisten); + virBufferVSprintf(&buf, " listen='%s'", vnclisten); } if (vncpasswd) { - virBufferVSprintf(buf, " passwd='%s'", vncpasswd); + virBufferVSprintf(&buf, " passwd='%s'", vncpasswd); } if (keymap) { - virBufferVSprintf(buf, " keymap='%s'", keymap); + virBufferVSprintf(&buf, " keymap='%s'", keymap); } - virBufferAddLit(buf, "/>\n"); + virBufferAddLit(&buf, "/>\n"); } if (sdl) { - virBufferAddLit(buf, " <graphics type='sdl'/>\n"); + virBufferAddLit(&buf, " <graphics type='sdl'/>\n"); } if (hvm) { if (xenXMConfigGetString(conf, "parallel", &str) == 0) { if (STRNEQ(str, "none")) - xend_parse_sexp_desc_char(conn, buf, "parallel", 0, str, NULL); + xend_parse_sexp_desc_char(conn, &buf, "parallel", 0, str, NULL); } if (xenXMConfigGetString(conf, "serial", &str) == 0) { if (STRNEQ(str, "none")) { - xend_parse_sexp_desc_char(conn, buf, "serial", 0, str, NULL); + xend_parse_sexp_desc_char(conn, &buf, "serial", 0, str, NULL); /* Add back-compat console tag for primary console */ - xend_parse_sexp_desc_char(conn, buf, "console", 0, str, NULL); + xend_parse_sexp_desc_char(conn, &buf, "console", 0, str, NULL); } } } else { /* Paravirt implicitly always has a single console */ - virBufferAddLit(buf, " <console type='pty'>\n"); - virBufferAddLit(buf, " <target port='0'/>\n"); - virBufferAddLit(buf, " </console>\n"); + virBufferAddLit(&buf, " <console type='pty'>\n"); + virBufferAddLit(&buf, " <target port='0'/>\n"); + virBufferAddLit(&buf, " </console>\n"); } - virBufferAddLit(buf, " </devices>\n"); + virBufferAddLit(&buf, " </devices>\n"); + + virBufferAddLit(&buf, "</domain>\n"); - virBufferAddLit(buf, "</domain>\n"); + if (virBufferError(&buf)) { + xenXMError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer")); + return NULL; + } - xml = buf->content; - buf->content = NULL; - virBufferFree(buf); - return (xml); + return virBufferContentAndReset(&buf); } @@ -1254,7 +1253,7 @@ int xenXMDomainPinVcpu(virDomainPtr doma { const char *filename; xenXMConfCachePtr entry; - virBufferPtr mapbuf; + virBuffer mapbuf = VIR_BUFFER_INITIALIZER; char *mapstr = NULL; char *ranges = NULL; int i, j, n, comma = 0; @@ -1288,33 +1287,24 @@ int xenXMDomainPinVcpu(virDomainPtr doma } /* from bit map, build character string of mapped CPU numbers */ - mapbuf = virBufferNew (16); - if (mapbuf == NULL) { - xenXMError (domain->conn, VIR_ERR_NO_MEMORY, __FUNCTION__); - return -1; - } for (i = 0; i < maplen; i++) for (j = 0; j < 8; j++) if ((cpumap[i] & (1 << j))) { n = i*8 + j; - if (comma) { - if (virBufferAddLit (mapbuf, ",") == -1) { - xenXMError (domain->conn, VIR_ERR_NO_MEMORY, __FUNCTION__); - virBufferFree (mapbuf); - return -1; - } - } + if (comma) + virBufferAddLit (&mapbuf, ","); comma = 1; - if (virBufferVSprintf (mapbuf, "%d", n) == -1) { - xenXMError (domain->conn, VIR_ERR_NO_MEMORY, __FUNCTION__); - virBufferFree (mapbuf); - return -1; - } + virBufferVSprintf (&mapbuf, "%d", n); } - mapstr = virBufferContentAndFree (mapbuf); + if (virBufferError(&mapbuf)) { + xenXMError(domain->conn, VIR_ERR_NO_MEMORY, _("allocate buffer")); + return -1; + } + + mapstr = virBufferContentAndReset(&mapbuf); /* convert the mapstr to a range based string */ ranges = virConvertCpuSet(domain->conn, mapstr, 0); Index: src/xml.c =================================================================== RCS file: /data/cvs/libvirt/src/xml.c,v retrieving revision 1.118 diff -u -p -r1.118 xml.c --- src/xml.c 26 Apr 2008 14:22:02 -0000 1.118 +++ src/xml.c 28 Apr 2008 13:52:33 -0000 @@ -102,19 +102,13 @@ parseCpuNumber(const char **str, int max char * virSaveCpuSet(virConnectPtr conn, char *cpuset, int maxcpu) { - virBufferPtr buf; - char *ret; + virBuffer buf = VIR_BUFFER_INITIALIZER; int start, cur; int first = 1; if ((cpuset == NULL) || (maxcpu <= 0) || (maxcpu > 100000)) return (NULL); - buf = virBufferNew(1000); - if (buf == NULL) { - virXMLError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"), 1000); - return (NULL); - } cur = 0; start = -1; while (cur < maxcpu) { @@ -123,27 +117,32 @@ virSaveCpuSet(virConnectPtr conn, char * start = cur; } else if (start != -1) { if (!first) - virBufferAddLit(buf, ","); + virBufferAddLit(&buf, ","); else first = 0; if (cur == start + 1) - virBufferVSprintf(buf, "%d", start); + virBufferVSprintf(&buf, "%d", start); else - virBufferVSprintf(buf, "%d-%d", start, cur - 1); + virBufferVSprintf(&buf, "%d-%d", start, cur - 1); start = -1; } cur++; } if (start != -1) { if (!first) - virBufferAddLit(buf, ","); + virBufferAddLit(&buf, ","); if (maxcpu == start + 1) - virBufferVSprintf(buf, "%d", start); + virBufferVSprintf(&buf, "%d", start); else - virBufferVSprintf(buf, "%d-%d", start, maxcpu - 1); + virBufferVSprintf(&buf, "%d-%d", start, maxcpu - 1); } - ret = virBufferContentAndFree(buf); - return (ret); + + if (virBufferError(&buf)) { + virXMLError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"), 1000); + return NULL; + } + + return virBufferContentAndReset(&buf); } /** @@ -1054,11 +1053,9 @@ virDomainParseXMLOSDescHVM(virConnectPtr char scratch[PATH_MAX]; if (virDomainParseXMLOSDescHVMChar(conn, scratch, sizeof(scratch), cur) < 0) goto error; - if (virBufferVSprintf(buf, "(parallel %s)", scratch) < 0) - goto no_memory; + virBufferVSprintf(buf, "(parallel %s)", scratch); } else { - if (virBufferAddLit(buf, "(parallel none)") < 0) - goto no_memory; + virBufferAddLit(buf, "(parallel none)"); } cur = virXPathNode("/domain/devices/serial[1]", ctxt); @@ -1066,8 +1063,7 @@ virDomainParseXMLOSDescHVM(virConnectPtr char scratch[PATH_MAX]; if (virDomainParseXMLOSDescHVMChar(conn, scratch, sizeof(scratch), cur) < 0) goto error; - if (virBufferVSprintf(buf, "(serial %s)", scratch) < 0) - goto no_memory; + virBufferVSprintf(buf, "(serial %s)", scratch); } else { res = virXPathBoolean("count(domain/devices/console) > 0", ctxt); if (res < 0) { @@ -1075,27 +1071,20 @@ virDomainParseXMLOSDescHVM(virConnectPtr goto error; } if (res) { - if (virBufferAddLit(buf, "(serial pty)") < 0) - goto no_memory; + virBufferAddLit(buf, "(serial pty)"); } else { - if (virBufferAddLit(buf, "(serial none)") < 0) - goto no_memory; + virBufferAddLit(buf, "(serial none)"); } } str = virXPathString("string(/domain/clock/@offset)", ctxt); - if (str != NULL && !strcmp(str, "localtime")) { - if (virBufferAddLit(buf, "(localtime 1)") < 0) - goto no_memory; + if (str != NULL && STREQ(str, "localtime")) { + virBufferAddLit(buf, "(localtime 1)"); } free(str); return (0); -no_memory: - virXMLError(conn, VIR_ERR_XML_ERROR, - _("cannot allocate memory for buffer"), 0); - error: free(nodes); return (-1); @@ -1509,7 +1498,7 @@ virDomainParseXMLDesc(virConnectPtr conn xmlDocPtr xml = NULL; xmlNodePtr node; char *nam = NULL; - virBuffer buf; + virBuffer buf = VIR_BUFFER_INITIALIZER; xmlChar *prop; xmlParserCtxtPtr pctxt; xmlXPathContextPtr ctxt = NULL; @@ -1525,11 +1514,6 @@ virDomainParseXMLDesc(virConnectPtr conn if (name != NULL) *name = NULL; - buf.content = malloc(1000); - if (buf.content == NULL) - return (NULL); - buf.size = 1000; - buf.use = 0; pctxt = xmlNewParserCtxt(); if ((pctxt == NULL) || (pctxt->sax == NULL)) { @@ -1787,7 +1771,6 @@ virDomainParseXMLDesc(virConnectPtr conn virBufferAddLit(&buf, ")"); /* closes (vm */ - buf.content[buf.use] = 0; xmlXPathFreeContext(ctxt); xmlFreeDoc(xml); @@ -1798,7 +1781,12 @@ virDomainParseXMLDesc(virConnectPtr conn else free(nam); - return (buf.content); + if (virBufferError(&buf)) { + virXMLError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"), 0); + return NULL; + } + + return virBufferContentAndReset(&buf); error: free(nam); @@ -1809,7 +1797,7 @@ virDomainParseXMLDesc(virConnectPtr conn xmlFreeDoc(xml); if (pctxt != NULL) xmlFreeParserCtxt(pctxt); - free(buf.content); + free(virBufferContentAndReset(&buf)); return (NULL); } @@ -1834,14 +1822,8 @@ virParseXMLDevice(virConnectPtr conn, co { xmlDocPtr xml = NULL; xmlNodePtr node; - virBuffer buf; + virBuffer buf = VIR_BUFFER_INITIALIZER; - buf.content = malloc(1000); - if (buf.content == NULL) - return (NULL); - buf.size = 1000; - buf.use = 0; - buf.content[0] = 0; xml = xmlReadDoc((const xmlChar *) xmldesc, "device.xml", NULL, XML_PARSE_NOENT | XML_PARSE_NONET | XML_PARSE_NOERROR | XML_PARSE_NOWARNING); @@ -1856,9 +1838,6 @@ virParseXMLDevice(virConnectPtr conn, co if (virDomainParseXMLDiskDesc(conn, node, &buf, hvm, xendConfigVersion) != 0) goto error; - /* SXP is not created when device is "floppy". */ - else if (buf.use == 0) - goto error; } else if (xmlStrEqual(node->name, BAD_CAST "interface")) { if (virDomainParseXMLIfDesc(conn, node, &buf, hvm, xendConfigVersion) != 0) @@ -1867,14 +1846,20 @@ virParseXMLDevice(virConnectPtr conn, co virXMLError(conn, VIR_ERR_XML_ERROR, (const char *) node->name, 0); goto error; } - cleanup: - if (xml != NULL) - xmlFreeDoc(xml); - return buf.content; + + xmlFreeDoc(xml); + + if (virBufferError(&buf)) { + virXMLError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"), 0); + return NULL; + } + + return virBufferContentAndReset(&buf); + error: - free(buf.content); - buf.content = NULL; - goto cleanup; + free(virBufferContentAndReset(&buf)); + xmlFreeDoc(xml); + return NULL; } Index: src/xmlrpc.c =================================================================== RCS file: /data/cvs/libvirt/src/xmlrpc.c,v retrieving revision 1.13 diff -u -p -r1.13 xmlrpc.c --- src/xmlrpc.c 10 Apr 2008 16:54:54 -0000 1.13 +++ src/xmlrpc.c 28 Apr 2008 13:52:34 -0000 @@ -363,14 +363,12 @@ void xmlRpcValueMarshal(xmlRpcValuePtr v virBufferStrcat(buf, "</value>\n", NULL); } -virBufferPtr xmlRpcMarshalRequest(const char *request, - int argc, xmlRpcValuePtr *argv) +void xmlRpcMarshalRequest(const char *request, + virBufferPtr buf, + int argc, xmlRpcValuePtr *argv) { - virBufferPtr buf; int i; - buf = virBufferNew(1024); - virBufferStrcat(buf, "<?xml version=\"1.0\"?>\n" "<methodCall>\n" @@ -386,7 +384,6 @@ virBufferPtr xmlRpcMarshalRequest(const virBufferStrcat(buf, " </params>\n" "</methodCall>\n", NULL); - return buf; } xmlRpcValuePtr xmlRpcUnmarshalResponse(xmlNodePtr node, bool *is_fault) @@ -564,13 +561,14 @@ int xmlRpcCall(xmlRpcContextPtr context, va_list ap; int argc; xmlRpcValuePtr *argv; - virBufferPtr buf; + virBuffer buf = VIR_BUFFER_INITIALIZER; char *ret; xmlDocPtr xml; xmlNodePtr node; bool fault; xmlRpcValuePtr value; void *retval = NULL; + char *content; va_start(ap, fmt); @@ -582,16 +580,16 @@ int xmlRpcCall(xmlRpcContextPtr context, va_end(ap); - buf = xmlRpcMarshalRequest(method, argc, argv); + xmlRpcMarshalRequest(method, &buf, argc, argv); xmlRpcArgvFree(argc, argv); - if (!buf) + if (virBufferError(&buf)) return -1; - ret = xmlRpcCallRaw(context->uri, buf->content); - - virBufferFree(buf); + content = virBufferContentAndReset(&buf); + ret = xmlRpcCallRaw(context->uri, content); + free(content); if (!ret) return -1; Index: src/xmlrpc.h =================================================================== RCS file: /data/cvs/libvirt/src/xmlrpc.h,v retrieving revision 1.4 diff -u -p -r1.4 xmlrpc.h --- src/xmlrpc.h 10 Apr 2008 16:54:54 -0000 1.4 +++ src/xmlrpc.h 28 Apr 2008 13:52:34 -0000 @@ -89,8 +89,9 @@ struct _xmlRpcContext; xmlRpcValuePtr *xmlRpcArgvNew(const char *fmt, va_list ap, int *argc); void xmlRpcArgvFree(int argc, xmlRpcValuePtr *argv); -virBufferPtr xmlRpcMarshalRequest(const char *request, - int argc, xmlRpcValuePtr *argv); +void xmlRpcMarshalRequest(const char *request, + virBufferPtr buf, + int argc, xmlRpcValuePtr *argv); xmlRpcValuePtr xmlRpcUnmarshalResponse(xmlNodePtr node, bool *is_fault); Index: tests/xmlrpctest.c =================================================================== RCS file: /data/cvs/libvirt/tests/xmlrpctest.c,v retrieving revision 1.11 diff -u -p -r1.11 xmlrpctest.c --- tests/xmlrpctest.c 10 Apr 2008 16:54:54 -0000 1.11 +++ tests/xmlrpctest.c 28 Apr 2008 13:52:34 -0000 @@ -59,22 +59,20 @@ testMethodPlusDOUBLE(const void *data) return retval==(10.1234+10.1234) ? 0 : -1; } -static virBufferPtr -marshalRequest(const char *fmt, ...) +static void +marshalRequest(virBufferPtr buf, const char *fmt, ...) { int argc; xmlRpcValuePtr *argv; - virBufferPtr buf; va_list ap; va_start(ap, fmt); argv = xmlRpcArgvNew(fmt, ap, &argc); va_end(ap); - buf = xmlRpcMarshalRequest("test", argc, argv); + xmlRpcMarshalRequest("test", buf, argc, argv); xmlRpcArgvFree(argc, argv); - return buf; } static int @@ -132,14 +130,21 @@ testMarshalRequestINT(const void *data) int num = INT_MAX; int ret = 0; int check = data ? *((int *)data) : 0; - virBufferPtr buf = marshalRequest("i", num); + virBuffer buf = VIR_BUFFER_INITIALIZER; + marshalRequest(&buf, "i", num); + char *content; + + if (virBufferError(&buf)) + return -1; + + content = virBufferContentAndReset(&buf); if (check) - ret = checkRequestValue(buf->content, + ret = checkRequestValue(content, "number(/methodCall/params/param[1]/value/int)", XML_RPC_INTEGER, (void *) &num); - virBufferFree(buf); + free(content); return ret; } @@ -149,13 +154,21 @@ testMarshalRequestSTRING(const void *dat const char *str = "This library will be really sexy."; int ret = 0; int check = data ? *((int *)data) : 0; - virBufferPtr buf = marshalRequest("s", str); + virBuffer buf = VIR_BUFFER_INITIALIZER; + char *content; + + marshalRequest(&buf, "s", str); + if (virBufferError(&buf)) + return -1; + + content = virBufferContentAndReset(&buf); if (check) - ret = checkRequestValue(buf->content, + ret = checkRequestValue(content, "string(/methodCall/params/param[1]/value/string)", XML_RPC_STRING, (void *) str); - virBufferFree(buf); + + free(content); return ret; } @@ -165,42 +178,24 @@ testMarshalRequestDOUBLE(const void *dat double num = 123456789.123; int ret = 0; int check = data ? *((int *)data) : 0; - virBufferPtr buf = marshalRequest("f", num); + virBuffer buf = VIR_BUFFER_INITIALIZER; + char *content; + + marshalRequest(&buf, "f", num); + if (virBufferError(&buf)) + return -1; + + content = virBufferContentAndReset(&buf); if (check) - ret = checkRequestValue(buf->content, + ret = checkRequestValue(content, "number(/methodCall/params/param[1]/value/double)", XML_RPC_DOUBLE, (void *) &num); - virBufferFree(buf); + free(content); return ret; } -static int -testBufferStrcat(const void *data ATTRIBUTE_UNUSED) -{ - virBufferPtr buf = virBufferNew(1000*32); /* don't waste time with realloc */ - int i; - - for (i=0; i < 1000; i++) - virBufferStrcat(buf, "My name is ", "libvirt", ".\n", NULL); - - virBufferFree(buf); - return 0; -} - -static int -testBufferVSprintf(const void *data ATTRIBUTE_UNUSED) -{ - virBufferPtr buf = virBufferNew(1000*32); /* don't waste time with realloc */ - int i; - - for (i=0; i < 1000; i++) - virBufferVSprintf(buf, "My name is %s.\n", "libvirt"); - - virBufferFree(buf); - return 0; -} int main(int argc, char **argv) @@ -263,13 +258,7 @@ main(int argc, char **argv) NLOOPS, testMarshalRequestSTRING, NULL) != 0) ret = -1; - if (virtTestRun("Buffer: strcat", NLOOPS, testBufferStrcat, NULL) != 0) - ret = -1; - if (virtTestRun("Buffer: sprintf", NLOOPS, testBufferVSprintf, NULL) != 0) - ret = -1; - - - exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE); + exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE); } -- |: Red Hat, Engineering, Boston -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list