The following set of changes adjust the way errors are handled in the
virBuffer routines. The key idea is to make it hard (impossible) to
misuse the API, with each change addressing one of the errors scenarios
I've found in existing code using the routines.
- The contents of the struct are no longer public.
Rationale: This stops people accessing the buffer directly,
thus preventing use of data which may be in an error state.
- All virBuffer objects must now be declared on the stack and
initialized with the static VIR_BUFFER_INITIALIZER, instead
of the virBufferNew() allocator
Rationale: avoids the need to check virBufferNew for allocation
failure, and avoids a potential memory leak of the virBuffer
object itself.
- The buffer content can only be accessed via the public API
virBufferContentAndReset(). This returns the internal char *
content, and resets the state of the buffer.
Rationale: the caller can only obtain the internal content if
the buffer is in a known good state. On error they'll be given
back a NULL, rather than potentially incomplete / malformed
data.
- The virBufferAdd/VSprintf/etc routines for appending to the
buffer are all void and set the internal error flag upon
failure and immediately free the internal content.
Rationale: the caller will never see a potentially incomplete
buffer, and avoids the potential of leaking the memory for the
internal buffer in cleanup paths.
So in using the APIs, there are now only a handful of very low
impact errors the caller can make:
- Forget to initialize the buffer with VIR_BUFFER_INITIALIZER.
The compiler will warn about this, so it is harmless.
- Forget to free() the content from virBufferContentAndReset.
This data is typically propagated to the caller's caller
for free()ing anyway, so not an issue.
- Forget to check the error flag before asking for the internal
content. If the error flag is set the internal content will
have been free'd and they'll be given back NULL. So the caller
will not see incomplete data.
So the worst case behaviour is a leak of the buffer content, or
failing to raise a libvirt error when the buffer has an error.
The general style of usage now looks like
char *
somefunction(...) {
virBuffer buf = VIR_BUFFER_INITIALIZER;
...
virBufferAdd(&buf, "<domain>\n");
virBufferVSprint(&buf, " <memory>%d</memory>\n", memory);
...
virBufferAdd(&buf, "</domain>\n");
....
if (virBufferError(&buf)) {
__virRaiseError(...);
return NULL;
}
return virBufferContentAndReset(&buf);
}
In fixing up all the uses of virBuffer routines in existing driver
code I encountered every error condition mentioned here. Most of
these would have resulted in either memory leaks, or passing a
malformed XML document to another routine, so with the additional
code clarity gained by removing the gotos this is very useful
cleanup.
src/buf.c | 241 ++++++++++++++++-------------
src/buf.h | 50 ++++--
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, 898 insertions(+), 1147 deletions(-)
Regards,
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 26 Apr 2008 16:24:38 -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 increase
+ the public __SIZEOF_VIR_BUFFER constant */
+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 26 Apr 2008 16:24:38 -0000
@@ -20,22 +20,45 @@
*/
typedef struct _virBuffer virBuffer;
typedef virBuffer *virBufferPtr;
+
+#ifndef __VIR_BUFFER_C__
+/* This constant must match size of the actual struct
+ in the buf.c file */
+#if __WORDSIZE == 64
+#define __SIZEOF_VIR_BUFFER 32
+#define VIR_BUFFER_INITIALIZER { { 0, 0, 0, 0, \
+ 0, 0, 0, 0, \
+ 0, 0, 0, 0, \
+ 0, 0, 0, 0, \
+ 0, 0, 0, 0, \
+ 0, 0, 0, 0, \
+ 0, 0, 0, 0, \
+ 0, 0, 0, 0 \
+ } }
+#else
+#define __SIZEOF_VIR_BUFFER 16
+#define VIR_BUFFER_INITIALIZER { { 0, 0, 0, 0, \
+ 0, 0, 0, 0, \
+ 0, 0, 0, 0, \
+ 0, 0, 0, 0 \
+ } }
+#endif
struct _virBuffer {
- char *content; /* The buffer content UTF8 */
- unsigned int use; /* The buffer size used */
- unsigned int size; /* The buffer size */
+ char *padding[__SIZEOF_VIR_BUFFER]; /* This struct contents is private */
};
-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, ...)
+#endif
+
+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 +67,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 26 Apr 2008 16:24:39 -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 26 Apr 2008 16:24:39 -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 26 Apr 2008 16:24:39 -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 26 Apr 2008 16:24:40 -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 26 Apr 2008 16:24:42 -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 26 Apr 2008 16:24:43 -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 26 Apr 2008 16:24:43 -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 26 Apr 2008 16:24:45 -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.146
diff -u -p -r1.146 virsh.c
--- src/virsh.c 25 Apr 2008 14:53:05 -0000 1.146
+++ src/virsh.c 26 Apr 2008 16:24:49 -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 26 Apr 2008 16:24:51 -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 26 Apr 2008 16:24:54 -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 26 Apr 2008 16:24:55 -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 26 Apr 2008 16:24:56 -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 26 Apr 2008 16:24:56 -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 26 Apr 2008 16:24:56 -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 :|