[libvirt] [PATCH 05/28] Rename conf.{c,h} to virconf.{c,h}

Daniel P. Berrange berrange at redhat.com
Mon Dec 17 14:57:38 UTC 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

---
 daemon/libvirtd-config.c          |    2 +-
 daemon/libvirtd.c                 |    2 +-
 po/POTFILES.in                    |    2 +-
 src/Makefile.am                   |    2 +-
 src/libvirt.c                     |    2 +-
 src/libxl/libxl_driver.c          |    2 +-
 src/locking/lock_daemon.c         |    2 +-
 src/locking/lock_daemon_config.c  |    2 +-
 src/locking/lock_driver_lockd.c   |    2 +-
 src/locking/lock_driver_sanlock.c |    2 +-
 src/locking/sanlock_helper.c      |    2 +-
 src/lxc/lxc_conf.c                |    2 +-
 src/qemu/qemu_conf.c              |    2 +-
 src/security/security_selinux.c   |    2 +-
 src/uml/uml_conf.c                |    2 +-
 src/util/conf.c                   | 1032 -------------------------------------
 src/util/conf.h                   |  100 ----
 src/util/virconf.c                | 1032 +++++++++++++++++++++++++++++++++++++
 src/util/virconf.h                |  100 ++++
 src/vmx/vmx.c                     |    2 +-
 src/vmx/vmx.h                     |    2 +-
 src/xen/xen_inotify.c             |    2 +-
 src/xen/xm_internal.h             |    2 +-
 src/xenxs/xen_sxpr.c              |    2 +-
 src/xenxs/xen_sxpr.h              |    2 +-
 src/xenxs/xen_xm.c                |    2 +-
 src/xenxs/xen_xm.h                |    2 +-
 tests/conftest.c                  |    2 +-
 tests/libvirtdconftest.c          |    2 +-
 29 files changed, 1157 insertions(+), 1157 deletions(-)
 delete mode 100644 src/util/conf.c
 delete mode 100644 src/util/conf.h
 create mode 100644 src/util/virconf.c
 create mode 100644 src/util/virconf.h

diff --git a/daemon/libvirtd-config.c b/daemon/libvirtd-config.c
index 7838044..0ca185c 100644
--- a/daemon/libvirtd-config.c
+++ b/daemon/libvirtd-config.c
@@ -24,7 +24,7 @@
 #include <config.h>
 
 #include "libvirtd-config.h"
-#include "conf.h"
+#include "virconf.h"
 #include "memory.h"
 #include "virterror_internal.h"
 #include "logging.h"
diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index f88be9b..9b0e45a 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -47,7 +47,7 @@
 #include "uuid.h"
 #include "remote_driver.h"
 #include "memory.h"
-#include "conf.h"
+#include "virconf.h"
 #include "virnetlink.h"
 #include "virnetserver.h"
 #include "threads.h"
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 843db7c..e80c413 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -137,7 +137,6 @@ src/storage/storage_driver.c
 src/test/test_driver.c
 src/uml/uml_conf.c
 src/uml/uml_driver.c
-src/util/conf.c
 src/util/dnsmasq.c
 src/util/event_poll.c
 src/util/hooks.c
@@ -157,6 +156,7 @@ src/util/virauth.c
 src/util/virauthconfig.c
 src/util/vircgroup.c
 src/util/vircommand.c
+src/util/virconf.c
 src/util/virdbus.c
 src/util/virfile.c
 src/util/virhash.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 7e16d68..b53f1f2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -53,7 +53,6 @@ augeastest_DATA =
 # These files are not related to driver APIs. Simply generic
 # helper APIs for various purposes
 UTIL_SOURCES =							\
-		util/conf.c util/conf.h				\
 		util/event.c util/event.h			\
 		util/event_poll.c util/event_poll.h		\
 		util/hooks.c util/hooks.h			\
@@ -83,6 +82,7 @@ UTIL_SOURCES =							\
 		util/virbitmap.c util/virbitmap.h		\
 		util/virbuffer.c util/virbuffer.h		\
 		util/vircommand.c util/vircommand.h		\
+		util/virconf.c util/virconf.h			\
 		util/virfile.c util/virfile.h			\
 		util/virnodesuspend.c util/virnodesuspend.h	\
 		util/virobject.c util/virobject.h		\
diff --git a/src/libvirt.c b/src/libvirt.c
index e28ed05..8f7a869 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -54,7 +54,7 @@
 #include "memory.h"
 #include "configmake.h"
 #include "intprops.h"
-#include "conf.h"
+#include "virconf.h"
 #include "rpc/virnettlscontext.h"
 #include "vircommand.h"
 #include "virrandom.h"
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 1423073..884fca8 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -34,7 +34,7 @@
 #include "internal.h"
 #include "logging.h"
 #include "virterror_internal.h"
-#include "conf.h"
+#include "virconf.h"
 #include "datatypes.h"
 #include "virfile.h"
 #include "memory.h"
diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
index d7906c5..08caa16 100644
--- a/src/locking/lock_daemon.c
+++ b/src/locking/lock_daemon.c
@@ -40,7 +40,7 @@
 #include "virterror_internal.h"
 #include "logging.h"
 #include "memory.h"
-#include "conf.h"
+#include "virconf.h"
 #include "rpc/virnetserver.h"
 #include "virrandom.h"
 #include "virhash.h"
diff --git a/src/locking/lock_daemon_config.c b/src/locking/lock_daemon_config.c
index c64de67..c2d9a76 100644
--- a/src/locking/lock_daemon_config.c
+++ b/src/locking/lock_daemon_config.c
@@ -24,7 +24,7 @@
 #include <config.h>
 
 #include "lock_daemon_config.h"
-#include "conf.h"
+#include "virconf.h"
 #include "memory.h"
 #include "virterror_internal.h"
 #include "logging.h"
diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c
index 3902ede..c88c5af 100644
--- a/src/locking/lock_driver_lockd.c
+++ b/src/locking/lock_driver_lockd.c
@@ -22,7 +22,7 @@
 #include <config.h>
 
 #include "lock_driver.h"
-#include "conf.h"
+#include "virconf.h"
 #include "memory.h"
 #include "logging.h"
 #include "uuid.h"
diff --git a/src/locking/lock_driver_sanlock.c b/src/locking/lock_driver_sanlock.c
index a072343..2eadc07 100644
--- a/src/locking/lock_driver_sanlock.c
+++ b/src/locking/lock_driver_sanlock.c
@@ -43,7 +43,7 @@
 #include "util.h"
 #include "virfile.h"
 #include "md5.h"
-#include "conf.h"
+#include "virconf.h"
 
 #include "configmake.h"
 
diff --git a/src/locking/sanlock_helper.c b/src/locking/sanlock_helper.c
index a73b49c..ad69312 100644
--- a/src/locking/sanlock_helper.c
+++ b/src/locking/sanlock_helper.c
@@ -5,7 +5,7 @@
 
 #include "configmake.h"
 #include "internal.h"
-#include "conf.h"
+#include "virconf.h"
 #include "memory.h"
 #include "domain_conf.h"
 
diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c
index e512b8f..77667bd 100644
--- a/src/lxc/lxc_conf.c
+++ b/src/lxc/lxc_conf.c
@@ -31,7 +31,7 @@
 #include "lxc_conf.h"
 #include "nodeinfo.h"
 #include "virterror_internal.h"
-#include "conf.h"
+#include "virconf.h"
 #include "memory.h"
 #include "logging.h"
 #include "uuid.h"
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 4a8b857..7c8d826 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -42,7 +42,7 @@
 #include "qemu_bridge_filter.h"
 #include "uuid.h"
 #include "virbuffer.h"
-#include "conf.h"
+#include "virconf.h"
 #include "util.h"
 #include "memory.h"
 #include "datatypes.h"
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index 5c125fe..287312a 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -44,7 +44,7 @@
 #include "virhash.h"
 #include "virrandom.h"
 #include "util.h"
-#include "conf.h"
+#include "virconf.h"
 
 #define VIR_FROM_THIS VIR_FROM_SECURITY
 
diff --git a/src/uml/uml_conf.c b/src/uml/uml_conf.c
index 6aec8fc..51e5a7a 100644
--- a/src/uml/uml_conf.c
+++ b/src/uml/uml_conf.c
@@ -38,7 +38,7 @@
 #include "uml_conf.h"
 #include "uuid.h"
 #include "virbuffer.h"
-#include "conf.h"
+#include "virconf.h"
 #include "util.h"
 #include "memory.h"
 #include "nodeinfo.h"
diff --git a/src/util/conf.c b/src/util/conf.c
deleted file mode 100644
index 3b97545..0000000
--- a/src/util/conf.c
+++ /dev/null
@@ -1,1032 +0,0 @@
-/**
- * conf.c: parser for a subset of the Python encoded Xen configuration files
- *
- * Copyright (C) 2006-2012 Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library.  If not, see
- * <http://www.gnu.org/licenses/>.
- *
- * Daniel Veillard <veillard at redhat.com>
- */
-
-#include <config.h>
-
-#include <string.h>
-
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "virterror_internal.h"
-#include "virbuffer.h"
-#include "conf.h"
-#include "util.h"
-#include "c-ctype.h"
-#include "logging.h"
-#include "memory.h"
-#include "virfile.h"
-
-#define VIR_FROM_THIS VIR_FROM_CONF
-
-/************************************************************************
- *									*
- *	Structures and macros used by the mini parser			*
- *									*
- ************************************************************************/
-
-typedef struct _virConfParserCtxt virConfParserCtxt;
-typedef virConfParserCtxt *virConfParserCtxtPtr;
-
-struct _virConfParserCtxt {
-    const char* filename;
-    const char* base;
-    const char* cur;
-    const char *end;
-    int line;
-
-    virConfPtr conf;
-};
-
-#define CUR (*ctxt->cur)
-#define NEXT if (ctxt->cur < ctxt->end) ctxt->cur++;
-#define IS_EOL(c) (((c) == '\n') || ((c) == '\r'))
-
-#define SKIP_BLANKS_AND_EOL                                             \
-  do { while ((ctxt->cur < ctxt->end) && (c_isblank(CUR) || IS_EOL(CUR))) { \
-         if (CUR == '\n') ctxt->line++;	                                \
-         ctxt->cur++;}} while (0)
-#define SKIP_BLANKS                                                     \
-  do { while ((ctxt->cur < ctxt->end) && (c_isblank(CUR)))              \
-          ctxt->cur++; } while (0)
-
-/************************************************************************
- *									*
- *		Structures used by configuration data			*
- *									*
- ************************************************************************/
-
-typedef struct _virConfEntry virConfEntry;
-typedef virConfEntry *virConfEntryPtr;
-
-struct _virConfEntry {
-    virConfEntryPtr next;
-    char* name;
-    char* comment;
-    virConfValuePtr value;
-};
-
-struct _virConf {
-    const char* filename;
-    unsigned int flags;
-    virConfEntryPtr entries;
-};
-
-/**
- * virConfError:
- * @ctxt: the parser context if available or NULL
- * @error: the error number
- * @info: extra information string
- *
- * Handle an error at the xend daemon interface
- */
-#define virConfError(ctxt, error, info) \
-    virConfErrorHelper(__FILE__, __FUNCTION__, __LINE__, ctxt, error, info)
-static void
-virConfErrorHelper(const char *file, const char *func, size_t line,
-                   virConfParserCtxtPtr ctxt,
-                   virErrorNumber error, const char *info)
-{
-    if (error == VIR_ERR_OK)
-        return;
-
-    /* Construct the string 'filename:line: info' if we have that. */
-    if (ctxt && ctxt->filename) {
-        virReportErrorHelper(VIR_FROM_CONF, error, file, func, line,
-                             _("%s:%d: %s"), ctxt->filename, ctxt->line, info);
-    } else {
-        virReportErrorHelper(VIR_FROM_CONF, error, file, func, line,
-                             "%s", info);
-    }
-}
-
-
-/************************************************************************
- *									*
- *		Structures allocations and deallocations		*
- *									*
- ************************************************************************/
-
-/**
- * virConfFreeList:
- * @list: the list to free
- *
- * Free a list
- */
-static void
-virConfFreeList(virConfValuePtr list)
-{
-    virConfValuePtr next;
-
-    while (list != NULL) {
-        next = list->next;
-        list->next = NULL;
-        virConfFreeValue(list);
-        list = next;
-    }
-}
-
-/**
- * virConfFreeValue:
- * @val: the value to free
- *
- * Free a value
- */
-void
-virConfFreeValue(virConfValuePtr val)
-{
-    if (val == NULL)
-        return;
-    if (val->type == VIR_CONF_STRING &&
-        val->str != NULL)
-        VIR_FREE(val->str);
-    if (val->type == VIR_CONF_LIST &&
-        val->list != NULL)
-        virConfFreeList(val->list);
-    VIR_FREE(val);
-}
-
-virConfPtr
-virConfNew(void)
-{
-    virConfPtr ret;
-
-    if (VIR_ALLOC(ret) < 0) {
-        virReportOOMError();
-        return NULL;
-    }
-    ret->filename = NULL;
-    ret->flags = 0;
-
-    return ret;
-}
-
-/**
- * virConfCreate:
- * @filename: the name to report errors
- * @flags: combination of virConfFlag(s)
- *
- * Create a configuration internal structure
- *
- * Returns a pointer or NULL in case of error.
- */
-static virConfPtr
-virConfCreate(const char *filename, unsigned int flags)
-{
-    virConfPtr ret = virConfNew();
-    if (ret) {
-        ret->filename = filename;
-        ret->flags = flags;
-    }
-    return ret;
-}
-
-/**
- * virConfAddEntry:
- * @conf: the conf structure
- * @name: name of the entry or NULL for comment
- * @value: the value if any
- * @comm: extra comment for that entry if any
- *
- * add one entry to the conf, the parameters are included in the conf
- * if successful and freed on virConfFree()
- *
- * Returns a pointer to the entry or NULL in case of failure
- */
-static virConfEntryPtr
-virConfAddEntry(virConfPtr conf, char *name, virConfValuePtr value, char *comm)
-{
-    virConfEntryPtr ret, prev;
-
-    if (conf == NULL)
-        return NULL;
-    if ((comm == NULL) && (name == NULL))
-        return NULL;
-
-    if (VIR_ALLOC(ret) < 0) {
-        virReportOOMError();
-        return NULL;
-    }
-
-    ret->name = name;
-    ret->value = value;
-    ret->comment = comm;
-
-    if (conf->entries == NULL) {
-        conf->entries = ret;
-    } else {
-        prev = conf->entries;
-        while (prev->next != NULL)
-            prev = prev->next;
-        prev->next = ret;
-    }
-    return ret;
-}
-
-/************************************************************************
- *									*
- *			Serialization					*
- *									*
- ************************************************************************/
-
-/**
- * virConfSaveValue:
- * @buf: output buffer
- * @val: a value
- *
- * Serialize the value to the buffer
- *
- * Returns 0 in case of success, -1 in case of error.
- */
-static int
-virConfSaveValue(virBufferPtr buf, virConfValuePtr val)
-{
-    if (val == NULL)
-        return -1;
-    switch (val->type) {
-        case VIR_CONF_NONE:
-            return -1;
-        case VIR_CONF_LONG:
-            virBufferAsprintf(buf, "%ld", val->l);
-            break;
-        case VIR_CONF_STRING:
-            if (strchr(val->str, '\n') != NULL) {
-                virBufferAsprintf(buf, "\"\"\"%s\"\"\"", val->str);
-            } else if (strchr(val->str, '"') == NULL) {
-                virBufferAsprintf(buf, "\"%s\"", val->str);
-            } else if (strchr(val->str, '\'') == NULL) {
-                virBufferAsprintf(buf, "'%s'", val->str);
-            } else {
-                virBufferAsprintf(buf, "\"\"\"%s\"\"\"", val->str);
-            }
-            break;
-        case VIR_CONF_LIST: {
-            virConfValuePtr cur;
-
-            cur = val->list;
-            virBufferAddLit(buf, "[ ");
-            if (cur != NULL) {
-                virConfSaveValue(buf, cur);
-                cur = cur->next;
-                while (cur != NULL) {
-                    virBufferAddLit(buf, ", ");
-                    virConfSaveValue(buf, cur);
-                    cur = cur->next;
-                }
-            }
-            virBufferAddLit(buf, " ]");
-            break;
-        }
-        default:
-            return -1;
-    }
-    return 0;
-}
-
-/**
- * virConfSaveEntry:
- * @buf: output buffer
- * @cur: a conf entry
- *
- * Serialize the entry to the buffer
- *
- * Returns 0 in case of success, -1 in case of error.
- */
-static int
-virConfSaveEntry(virBufferPtr buf, virConfEntryPtr cur)
-{
-    if (cur->name != NULL) {
-        virBufferAdd(buf, cur->name, -1);
-        virBufferAddLit(buf, " = ");
-        virConfSaveValue(buf, cur->value);
-        if (cur->comment != NULL) {
-            virBufferAddLit(buf, " #");
-            virBufferAdd(buf, cur->comment, -1);
-        }
-    } else if (cur->comment != NULL) {
-        virBufferAddLit(buf, "#");
-        virBufferAdd(buf, cur->comment, -1);
-    }
-    virBufferAddLit(buf, "\n");
-    return 0;
-}
-
-/************************************************************************
- *									*
- *			The parser core					*
- *									*
- ************************************************************************/
-
-/**
- * virConfParseLong:
- * @ctxt: the parsing context
- * @val: the result
- *
- * Parse one long int value
- *
- * Returns 0 in case of success and -1 in case of error
- */
-static int
-virConfParseLong(virConfParserCtxtPtr ctxt, long *val)
-{
-    long l = 0;
-    int neg = 0;
-
-    if (CUR == '-') {
-        neg = 1;
-        NEXT;
-    } else if (CUR == '+') {
-        NEXT;
-    }
-    if ((ctxt->cur >= ctxt->end) || (!c_isdigit(CUR))) {
-        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("unterminated number"));
-        return -1;
-    }
-    while ((ctxt->cur < ctxt->end) && (c_isdigit(CUR))) {
-        l = l * 10 + (CUR - '0');
-        NEXT;
-    }
-    if (neg)
-        l = -l;
-    *val = l;
-    return 0;
-}
-
-/**
- * virConfParseString:
- * @ctxt: the parsing context
- *
- * Parse one string
- *
- * Returns a pointer to the string or NULL in case of error
- */
-static char *
-virConfParseString(virConfParserCtxtPtr ctxt)
-{
-    const char *base;
-    char *ret = NULL;
-
-    if (CUR == '\'') {
-        NEXT;
-        base = ctxt->cur;
-        while ((ctxt->cur < ctxt->end) && (CUR != '\'') && (!IS_EOL(CUR)))
-            NEXT;
-        if (CUR != '\'') {
-            virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("unterminated string"));
-            return NULL;
-        }
-        ret = strndup(base, ctxt->cur - base);
-        if (ret == NULL) {
-            virReportOOMError();
-            return NULL;
-        }
-        NEXT;
-    } else if ((ctxt->cur + 6 < ctxt->end) &&
-               (STRPREFIX(ctxt->cur, "\"\"\""))) {
-        /* String starts with python-style triple quotes """ */
-        ctxt->cur += 3;
-        base = ctxt->cur;
-
-        /* Find the ending triple quotes */
-        while ((ctxt->cur + 2 < ctxt->end) &&
-               !(STRPREFIX(ctxt->cur, "\"\"\""))) {
-            if (CUR == '\n')
-                ctxt->line++;
-            NEXT;
-        }
-
-        if (!STRPREFIX(ctxt->cur, "\"\"\"")) {
-            virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("unterminated string"));
-            return NULL;
-        }
-        ret = strndup(base, ctxt->cur - base);
-        if (ret == NULL) {
-            virReportOOMError();
-            return NULL;
-        }
-        ctxt->cur += 3;
-    } else if (CUR == '"') {
-        NEXT;
-        base = ctxt->cur;
-        while ((ctxt->cur < ctxt->end) && (CUR != '"') && (!IS_EOL(CUR)))
-            NEXT;
-        if (CUR != '"') {
-            virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("unterminated string"));
-            return NULL;
-        }
-        ret = strndup(base, ctxt->cur - base);
-        if (ret == NULL) {
-            virReportOOMError();
-            return NULL;
-        }
-        NEXT;
-    }
-    return ret;
-}
-
-/**
- * virConfParseValue:
- * @ctxt: the parsing context
- *
- * Parse one value
- *
- * Returns a pointer to the value or NULL in case of error
- */
-static virConfValuePtr
-virConfParseValue(virConfParserCtxtPtr ctxt)
-{
-    virConfValuePtr ret, lst = NULL, tmp, prev;
-    virConfType type = VIR_CONF_NONE;
-    char *str = NULL;
-    long  l = 0;
-
-    SKIP_BLANKS;
-    if (ctxt->cur >= ctxt->end) {
-        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("expecting a value"));
-        return NULL;
-    }
-    if ((CUR == '"') || (CUR == '\'')) {
-        type = VIR_CONF_STRING;
-        str = virConfParseString(ctxt);
-        if (str == NULL)
-            return NULL;
-    } else if (CUR == '[') {
-        if (ctxt->conf->flags & VIR_CONF_FLAG_VMX_FORMAT) {
-            virConfError(ctxt, VIR_ERR_CONF_SYNTAX,
-                         _("lists not allowed in VMX format"));
-            return NULL;
-        }
-        type = VIR_CONF_LIST;
-        NEXT;
-        SKIP_BLANKS_AND_EOL;
-        if ((ctxt->cur < ctxt->end) && (CUR != ']')) {
-            if ((lst = virConfParseValue(ctxt)) == NULL)
-                return NULL;
-            SKIP_BLANKS_AND_EOL;
-        }
-        while ((ctxt->cur < ctxt->end) && (CUR != ']')) {
-
-            /* Tell Clang that when execution reaches this point
-               "lst" is guaranteed to be non-NULL.  This stops it
-               from issuing an invalid NULL-dereference warning about
-               "prev = lst; while (prev->next..." below.  */
-            sa_assert(lst);
-
-            if (CUR != ',') {
-                virConfError(ctxt, VIR_ERR_CONF_SYNTAX,
-                             _("expecting a separator in list"));
-                virConfFreeList(lst);
-                return NULL;
-            }
-            NEXT;
-            SKIP_BLANKS_AND_EOL;
-            if (CUR == ']') {
-                break;
-            }
-            tmp = virConfParseValue(ctxt);
-            if (tmp == NULL) {
-                virConfFreeList(lst);
-                return NULL;
-            }
-            prev = lst;
-            while (prev->next != NULL) prev = prev->next;
-            prev->next = tmp;
-            SKIP_BLANKS_AND_EOL;
-        }
-        if (CUR == ']') {
-            NEXT;
-        } else {
-            virConfError(ctxt, VIR_ERR_CONF_SYNTAX,
-                         _("list is not closed with ]"));
-            virConfFreeList(lst);
-            return NULL;
-        }
-    } else if (c_isdigit(CUR) || (CUR == '-') || (CUR == '+')) {
-        if (ctxt->conf->flags & VIR_CONF_FLAG_VMX_FORMAT) {
-            virConfError(ctxt, VIR_ERR_CONF_SYNTAX,
-                         _("numbers not allowed in VMX format"));
-            return NULL;
-        }
-        if (virConfParseLong(ctxt, &l) < 0) {
-            return NULL;
-        }
-        type = VIR_CONF_LONG;
-    } else {
-        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("expecting a value"));
-        return NULL;
-    }
-    if (VIR_ALLOC(ret) < 0) {
-        virReportOOMError();
-        virConfFreeList(lst);
-        VIR_FREE(str);
-        return NULL;
-    }
-    ret->type = type;
-    ret->l = l;
-    ret->str = str;
-    ret->list = lst;
-    return ret;
-}
-
-/**
- * virConfParseName:
- * @ctxt: the parsing context
- *
- * Parse one name
- *
- * Returns a copy of the new string, NULL in case of error
- */
-static char *
-virConfParseName(virConfParserCtxtPtr ctxt)
-{
-    const char *base;
-    char *ret;
-
-    SKIP_BLANKS;
-    base = ctxt->cur;
-    /* TODO: probably need encoding support and UTF-8 parsing ! */
-    if (!c_isalpha(CUR) &&
-        !((ctxt->conf->flags & VIR_CONF_FLAG_VMX_FORMAT) && (CUR == '.'))) {
-        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("expecting a name"));
-        return NULL;
-    }
-    while ((ctxt->cur < ctxt->end) &&
-           (c_isalnum(CUR) || (CUR == '_') ||
-            ((ctxt->conf->flags & VIR_CONF_FLAG_VMX_FORMAT) &&
-             ((CUR == ':') || (CUR == '.') || (CUR == '-')))))
-        NEXT;
-    ret = strndup(base, ctxt->cur - base);
-    if (ret == NULL) {
-        virReportOOMError();
-        return NULL;
-    }
-    return ret;
-}
-
-/**
- * virConfParseComment:
- * @ctxt: the parsing context
- *
- * Parse one standalone comment in the configuration file
- *
- * Returns 0 in case of success and -1 in case of error
- */
-static int
-virConfParseComment(virConfParserCtxtPtr ctxt)
-{
-    const char *base;
-    char *comm;
-
-    if (CUR != '#')
-        return -1;
-    NEXT;
-    base = ctxt->cur;
-    while ((ctxt->cur < ctxt->end) && (!IS_EOL(CUR))) NEXT;
-    comm = strndup(base, ctxt->cur - base);
-    if (comm == NULL) {
-        virReportOOMError();
-        return -1;
-    }
-    virConfAddEntry(ctxt->conf, NULL, NULL, comm);
-    return 0;
-}
-
-/**
- * virConfParseSeparator:
- * @ctxt: the parsing context
- *
- * Parse one separator between statement if not at the end.
- *
- * Returns 0 in case of success and -1 in case of error
- */
-static int
-virConfParseSeparator(virConfParserCtxtPtr ctxt)
-{
-    SKIP_BLANKS;
-    if (ctxt->cur >= ctxt->end)
-        return 0;
-    if (IS_EOL(CUR)) {
-        SKIP_BLANKS_AND_EOL;
-    } else if (CUR == ';') {
-        NEXT;
-        SKIP_BLANKS_AND_EOL;
-    } else {
-        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("expecting a separator"));
-        return -1;
-    }
-    return 0;
-}
-
-/**
- * virConfParseStatement:
- * @ctxt: the parsing context
- *
- * Parse one statement in the conf file
- *
- * Returns 0 in case of success and -1 in case of error
- */
-static int
-virConfParseStatement(virConfParserCtxtPtr ctxt)
-{
-    const char *base;
-    char *name;
-    virConfValuePtr value;
-    char *comm = NULL;
-
-    SKIP_BLANKS_AND_EOL;
-    if (CUR == '#') {
-        return virConfParseComment(ctxt);
-    }
-    name = virConfParseName(ctxt);
-    if (name == NULL)
-        return -1;
-    SKIP_BLANKS;
-    if (CUR != '=') {
-        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("expecting an assignment"));
-        VIR_FREE(name);
-        return -1;
-    }
-    NEXT;
-    SKIP_BLANKS;
-    value = virConfParseValue(ctxt);
-    if (value == NULL) {
-        VIR_FREE(name);
-        return -1;
-    }
-    SKIP_BLANKS;
-    if (CUR == '#') {
-        NEXT;
-        base = ctxt->cur;
-        while ((ctxt->cur < ctxt->end) && (!IS_EOL(CUR))) NEXT;
-        comm = strndup(base, ctxt->cur - base);
-        if (comm == NULL) {
-            virReportOOMError();
-            VIR_FREE(name);
-            virConfFreeValue(value);
-            return -1;
-        }
-    }
-    if (virConfAddEntry(ctxt->conf, name, value, comm) == NULL) {
-        VIR_FREE(name);
-        virConfFreeValue(value);
-        VIR_FREE(comm);
-        return -1;
-    }
-    return 0;
-}
-
-/**
- * virConfParse:
- * @filename: the name to report errors
- * @content: the configuration content in memory
- * @len: the length in bytes
- * @flags: combination of virConfFlag(s)
- *
- * Parse the subset of the Python language needed to handle simple
- * Xen configuration files.
- *
- * Returns a handle to lookup settings or NULL if it failed to
- *         read or parse the file, use virConfFree() to free the data.
- */
-static virConfPtr
-virConfParse(const char *filename, const char *content, int len,
-             unsigned int flags) {
-    virConfParserCtxt ctxt;
-
-    ctxt.filename = filename;
-    ctxt.base = ctxt.cur = content;
-    ctxt.end = content + len - 1;
-    ctxt.line = 1;
-
-    ctxt.conf = virConfCreate(filename, flags);
-    if (ctxt.conf == NULL)
-        return NULL;
-
-    while (ctxt.cur < ctxt.end) {
-        if (virConfParseStatement(&ctxt) < 0)
-            goto error;
-        if (virConfParseSeparator(&ctxt) < 0)
-            goto error;
-    }
-
-    return ctxt.conf;
-
-error:
-    virConfFree(ctxt.conf);
-    return NULL;
-}
-
-/************************************************************************
- *									*
- *			The module entry points				*
- *									*
- ************************************************************************/
-
-/* 10 MB limit on config file size as a sanity check */
-#define MAX_CONFIG_FILE_SIZE (1024*1024*10)
-
-/**
- * virConfReadFile:
- * @filename: the path to the configuration file.
- * @flags: combination of virConfFlag(s)
- *
- * Reads a configuration file.
- *
- * Returns a handle to lookup settings or NULL if it failed to
- *         read or parse the file, use virConfFree() to free the data.
- */
-virConfPtr
-virConfReadFile(const char *filename, unsigned int flags)
-{
-    char *content;
-    int len;
-    virConfPtr conf;
-
-    VIR_DEBUG("filename=%s", NULLSTR(filename));
-
-    if (filename == NULL) {
-        virConfError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
-        return NULL;
-    }
-
-    if ((len = virFileReadAll(filename, MAX_CONFIG_FILE_SIZE, &content)) < 0) {
-        return NULL;
-    }
-
-    conf = virConfParse(filename, content, len, flags);
-
-    VIR_FREE(content);
-
-    return conf;
-}
-
-/**
- * virConfReadMem:
- * @memory: pointer to the content of the configuration file
- * @len: length in byte
- * @flags: combination of virConfFlag(s)
- *
- * Reads a configuration file loaded in memory. The string can be
- * zero terminated in which case @len can be 0
- *
- * Returns a handle to lookup settings or NULL if it failed to
- *         parse the content, use virConfFree() to free the data.
- */
-virConfPtr
-virConfReadMem(const char *memory, int len, unsigned int flags)
-{
-    if ((memory == NULL) || (len < 0)) {
-        virConfError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
-        return NULL;
-    }
-    if (len == 0)
-        len = strlen(memory);
-
-    return virConfParse("memory conf", memory, len, flags);
-}
-
-/**
- * virConfFree:
- * @conf: a configuration file handle
- *
- * Frees all data associated to the handle
- *
- * Returns 0 in case of success, -1 in case of error.
- */
-int
-virConfFree(virConfPtr conf)
-{
-    virConfEntryPtr tmp;
-    if (conf == NULL)
-        return 0;
-
-    tmp = conf->entries;
-    while (tmp) {
-        virConfEntryPtr next;
-        VIR_FREE(tmp->name);
-        virConfFreeValue(tmp->value);
-        VIR_FREE(tmp->comment);
-        next = tmp->next;
-        VIR_FREE(tmp);
-        tmp = next;
-    }
-    VIR_FREE(conf);
-    return 0;
-}
-
-/**
- * virConfGetValue:
- * @conf: a configuration file handle
- * @entry: the name of the entry
- *
- * Lookup the value associated to this entry in the configuration file
- *
- * Returns a pointer to the value or NULL if the lookup failed, the data
- *         associated will be freed when virConfFree() is called
- */
-virConfValuePtr
-virConfGetValue(virConfPtr conf, const char *setting)
-{
-    virConfEntryPtr cur;
-
-    if (conf == NULL)
-        return NULL;
-
-    cur = conf->entries;
-    while (cur != NULL) {
-        if ((cur->name != NULL) &&
-            ((conf->flags & VIR_CONF_FLAG_VMX_FORMAT &&
-              STRCASEEQ(cur->name, setting)) ||
-             STREQ(cur->name, setting)))
-            return cur->value;
-        cur = cur->next;
-    }
-    return NULL;
-}
-
-/**
- * virConfSetValue:
- * @conf: a configuration file handle
- * @entry: the name of the entry
- * @value: the new configuration value
- *
- * Set (or replace) the value associated to this entry in the configuration
- * file. The passed in 'value' will be owned by the conf object upon return
- * of this method, even in case of error. It should not be referenced again
- * by the caller.
- *
- * Returns 0 on success, or -1 on failure.
- */
-int
-virConfSetValue(virConfPtr conf,
-                const char *setting,
-                virConfValuePtr value)
-{
-    virConfEntryPtr cur, prev = NULL;
-
-    if (value && value->type == VIR_CONF_STRING && value->str == NULL)
-        return -1;
-
-    cur = conf->entries;
-    while (cur != NULL) {
-        if ((cur->name != NULL) && (STREQ(cur->name, setting))) {
-            break;
-        }
-        prev = cur;
-        cur = cur->next;
-    }
-
-    if (!cur) {
-        if (VIR_ALLOC(cur) < 0) {
-            virReportOOMError();
-            virConfFreeValue(value);
-            return -1;
-        }
-        cur->comment = NULL;
-        if (!(cur->name = strdup(setting))) {
-            virReportOOMError();
-            virConfFreeValue(value);
-            VIR_FREE(cur);
-            return -1;
-        }
-        cur->value = value;
-        if (prev) {
-            cur->next = prev->next;
-            prev->next = cur;
-        } else {
-            cur->next = conf->entries;
-            conf->entries = cur;
-        }
-    } else {
-        virConfFreeValue(cur->value);
-        cur->value = value;
-    }
-    return 0;
-}
-
-
-/**
- * virConfWriteFile:
- * @filename: the path to the configuration file.
- * @conf: the conf
- *
- * Writes a configuration file back to a file.
- *
- * Returns the number of bytes written or -1 in case of error.
- */
-int
-virConfWriteFile(const char *filename, virConfPtr conf)
-{
-    virBuffer buf = VIR_BUFFER_INITIALIZER;
-    virConfEntryPtr cur;
-    int ret;
-    int fd;
-    char *content;
-    unsigned int use;
-
-    if (conf == NULL)
-        return -1;
-
-    cur = conf->entries;
-    while (cur != NULL) {
-        virConfSaveEntry(&buf, cur);
-        cur = cur->next;
-    }
-
-    if (virBufferError(&buf)) {
-        virBufferFreeAndReset(&buf);
-        virReportOOMError();
-        return -1;
-    }
-
-    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
-    if (fd < 0) {
-        virBufferFreeAndReset(&buf);
-        virConfError(NULL, VIR_ERR_WRITE_FAILED, _("failed to open file"));
-        return -1;
-    }
-
-    use = virBufferUse(&buf);
-    content = virBufferContentAndReset(&buf);
-    ret = safewrite(fd, content, use);
-    VIR_FREE(content);
-    VIR_FORCE_CLOSE(fd);
-    if (ret != (int)use) {
-        virConfError(NULL, VIR_ERR_WRITE_FAILED, _("failed to save content"));
-        return -1;
-    }
-
-    return ret;
-}
-
-/**
- * virConfWriteMem:
- * @memory: pointer to the memory to store the config file
- * @len: pointer to the length in bytes of the store, on output the size
- * @conf: the conf
- *
- * Writes a configuration file back to a memory area. @len is an IN/OUT
- * parameter, it indicates the size available in bytes, and on output the
- * size required for the configuration file (even if the call fails due to
- * insufficient space).
- *
- * Returns the number of bytes written or -1 in case of error.
- */
-int
-virConfWriteMem(char *memory, int *len, virConfPtr conf)
-{
-    virBuffer buf = VIR_BUFFER_INITIALIZER;
-    virConfEntryPtr cur;
-    char *content;
-    unsigned int use;
-
-    if ((memory == NULL) || (len == NULL) || (*len <= 0) || (conf == NULL))
-        return -1;
-
-    cur = conf->entries;
-    while (cur != NULL) {
-        virConfSaveEntry(&buf, cur);
-        cur = cur->next;
-    }
-
-    if (virBufferError(&buf)) {
-        virBufferFreeAndReset(&buf);
-        virReportOOMError();
-        return -1;
-    }
-
-    use = virBufferUse(&buf);
-    content = virBufferContentAndReset(&buf);
-
-    if ((int)use >= *len) {
-        *len = (int)use;
-        VIR_FREE(content);
-        return -1;
-    }
-    memcpy(memory, content, use);
-    VIR_FREE(content);
-    *len = use;
-    return use;
-}
diff --git a/src/util/conf.h b/src/util/conf.h
deleted file mode 100644
index 224592d..0000000
--- a/src/util/conf.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * conf.h: parser for a subset of the Python encoded Xen configuration files
- *
- * Copyright (C) 2006, 2007 Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library.  If not, see
- * <http://www.gnu.org/licenses/>.
- *
- * Daniel Veillard <veillard at redhat.com>
- */
-
-#ifndef __VIR_CONF_H__
-# define __VIR_CONF_H__
-
-/**
- * virConfType:
- * one of the possible type for a value from the configuration file
- *
- * TODO: we probably need a float too.
- */
-typedef enum {
-    VIR_CONF_NONE = 0,		/* undefined */
-    VIR_CONF_LONG = 1,		/* a long int */
-    VIR_CONF_STRING = 2,	/* a string */
-    VIR_CONF_LIST = 3		/* a list */
-} virConfType;
-
-typedef enum {
-    VIR_CONF_FLAG_VMX_FORMAT = 1,  /* allow ':', '.' and '-' in names for compatibility
-                                      with VMware VMX configuration file, but restrict
-                                      allowed value types to string only */
-} virConfFlags;
-
-static inline const char *
-virConfTypeName (virConfType t)
-{
-    switch (t) {
-    case VIR_CONF_LONG:
-        return "long";
-    case VIR_CONF_STRING:
-        return "string";
-    case VIR_CONF_LIST:
-        return "list";
-    default:
-        return "*unexpected*";
-    }
-}
-
-/**
- * virConfValue:
- * a value from the configuration file
- */
-typedef struct _virConfValue virConfValue;
-typedef virConfValue *virConfValuePtr;
-
-struct _virConfValue {
-    virConfType type;		/* the virConfType */
-    virConfValuePtr next;	/* next element if in a list */
-    long  l;			/* long integer */
-    char *str;			/* pointer to 0 terminated string */
-    virConfValuePtr list;	/* list of a list */
-};
-
-/**
- * virConfPtr:
- * a pointer to a parsed configuration file
- */
-typedef struct _virConf virConf;
-typedef virConf *virConfPtr;
-
-virConfPtr      virConfNew             (void);
-virConfPtr	virConfReadFile	(const char *filename, unsigned int flags);
-virConfPtr	virConfReadMem		(const char *memory,
-                                         int len, unsigned int flags);
-int		virConfFree		(virConfPtr conf);
-void            virConfFreeValue      (virConfValuePtr val);
-
-virConfValuePtr	virConfGetValue	(virConfPtr conf,
-                                         const char *setting);
-int             virConfSetValue        (virConfPtr conf,
-                                         const char *setting,
-                                         virConfValuePtr value);
-int		virConfWriteFile	(const char *filename,
-                                         virConfPtr conf);
-int		virConfWriteMem	(char *memory,
-                                         int *len,
-                                         virConfPtr conf);
-
-#endif /* __VIR_CONF_H__ */
diff --git a/src/util/virconf.c b/src/util/virconf.c
new file mode 100644
index 0000000..221a1eb
--- /dev/null
+++ b/src/util/virconf.c
@@ -0,0 +1,1032 @@
+/**
+ * conf.c: parser for a subset of the Python encoded Xen configuration files
+ *
+ * Copyright (C) 2006-2012 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Daniel Veillard <veillard at redhat.com>
+ */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "virterror_internal.h"
+#include "virbuffer.h"
+#include "virconf.h"
+#include "util.h"
+#include "c-ctype.h"
+#include "logging.h"
+#include "memory.h"
+#include "virfile.h"
+
+#define VIR_FROM_THIS VIR_FROM_CONF
+
+/************************************************************************
+ *									*
+ *	Structures and macros used by the mini parser			*
+ *									*
+ ************************************************************************/
+
+typedef struct _virConfParserCtxt virConfParserCtxt;
+typedef virConfParserCtxt *virConfParserCtxtPtr;
+
+struct _virConfParserCtxt {
+    const char* filename;
+    const char* base;
+    const char* cur;
+    const char *end;
+    int line;
+
+    virConfPtr conf;
+};
+
+#define CUR (*ctxt->cur)
+#define NEXT if (ctxt->cur < ctxt->end) ctxt->cur++;
+#define IS_EOL(c) (((c) == '\n') || ((c) == '\r'))
+
+#define SKIP_BLANKS_AND_EOL                                             \
+  do { while ((ctxt->cur < ctxt->end) && (c_isblank(CUR) || IS_EOL(CUR))) { \
+         if (CUR == '\n') ctxt->line++;	                                \
+         ctxt->cur++;}} while (0)
+#define SKIP_BLANKS                                                     \
+  do { while ((ctxt->cur < ctxt->end) && (c_isblank(CUR)))              \
+          ctxt->cur++; } while (0)
+
+/************************************************************************
+ *									*
+ *		Structures used by configuration data			*
+ *									*
+ ************************************************************************/
+
+typedef struct _virConfEntry virConfEntry;
+typedef virConfEntry *virConfEntryPtr;
+
+struct _virConfEntry {
+    virConfEntryPtr next;
+    char* name;
+    char* comment;
+    virConfValuePtr value;
+};
+
+struct _virConf {
+    const char* filename;
+    unsigned int flags;
+    virConfEntryPtr entries;
+};
+
+/**
+ * virConfError:
+ * @ctxt: the parser context if available or NULL
+ * @error: the error number
+ * @info: extra information string
+ *
+ * Handle an error at the xend daemon interface
+ */
+#define virConfError(ctxt, error, info) \
+    virConfErrorHelper(__FILE__, __FUNCTION__, __LINE__, ctxt, error, info)
+static void
+virConfErrorHelper(const char *file, const char *func, size_t line,
+                   virConfParserCtxtPtr ctxt,
+                   virErrorNumber error, const char *info)
+{
+    if (error == VIR_ERR_OK)
+        return;
+
+    /* Construct the string 'filename:line: info' if we have that. */
+    if (ctxt && ctxt->filename) {
+        virReportErrorHelper(VIR_FROM_CONF, error, file, func, line,
+                             _("%s:%d: %s"), ctxt->filename, ctxt->line, info);
+    } else {
+        virReportErrorHelper(VIR_FROM_CONF, error, file, func, line,
+                             "%s", info);
+    }
+}
+
+
+/************************************************************************
+ *									*
+ *		Structures allocations and deallocations		*
+ *									*
+ ************************************************************************/
+
+/**
+ * virConfFreeList:
+ * @list: the list to free
+ *
+ * Free a list
+ */
+static void
+virConfFreeList(virConfValuePtr list)
+{
+    virConfValuePtr next;
+
+    while (list != NULL) {
+        next = list->next;
+        list->next = NULL;
+        virConfFreeValue(list);
+        list = next;
+    }
+}
+
+/**
+ * virConfFreeValue:
+ * @val: the value to free
+ *
+ * Free a value
+ */
+void
+virConfFreeValue(virConfValuePtr val)
+{
+    if (val == NULL)
+        return;
+    if (val->type == VIR_CONF_STRING &&
+        val->str != NULL)
+        VIR_FREE(val->str);
+    if (val->type == VIR_CONF_LIST &&
+        val->list != NULL)
+        virConfFreeList(val->list);
+    VIR_FREE(val);
+}
+
+virConfPtr
+virConfNew(void)
+{
+    virConfPtr ret;
+
+    if (VIR_ALLOC(ret) < 0) {
+        virReportOOMError();
+        return NULL;
+    }
+    ret->filename = NULL;
+    ret->flags = 0;
+
+    return ret;
+}
+
+/**
+ * virConfCreate:
+ * @filename: the name to report errors
+ * @flags: combination of virConfFlag(s)
+ *
+ * Create a configuration internal structure
+ *
+ * Returns a pointer or NULL in case of error.
+ */
+static virConfPtr
+virConfCreate(const char *filename, unsigned int flags)
+{
+    virConfPtr ret = virConfNew();
+    if (ret) {
+        ret->filename = filename;
+        ret->flags = flags;
+    }
+    return ret;
+}
+
+/**
+ * virConfAddEntry:
+ * @conf: the conf structure
+ * @name: name of the entry or NULL for comment
+ * @value: the value if any
+ * @comm: extra comment for that entry if any
+ *
+ * add one entry to the conf, the parameters are included in the conf
+ * if successful and freed on virConfFree()
+ *
+ * Returns a pointer to the entry or NULL in case of failure
+ */
+static virConfEntryPtr
+virConfAddEntry(virConfPtr conf, char *name, virConfValuePtr value, char *comm)
+{
+    virConfEntryPtr ret, prev;
+
+    if (conf == NULL)
+        return NULL;
+    if ((comm == NULL) && (name == NULL))
+        return NULL;
+
+    if (VIR_ALLOC(ret) < 0) {
+        virReportOOMError();
+        return NULL;
+    }
+
+    ret->name = name;
+    ret->value = value;
+    ret->comment = comm;
+
+    if (conf->entries == NULL) {
+        conf->entries = ret;
+    } else {
+        prev = conf->entries;
+        while (prev->next != NULL)
+            prev = prev->next;
+        prev->next = ret;
+    }
+    return ret;
+}
+
+/************************************************************************
+ *									*
+ *			Serialization					*
+ *									*
+ ************************************************************************/
+
+/**
+ * virConfSaveValue:
+ * @buf: output buffer
+ * @val: a value
+ *
+ * Serialize the value to the buffer
+ *
+ * Returns 0 in case of success, -1 in case of error.
+ */
+static int
+virConfSaveValue(virBufferPtr buf, virConfValuePtr val)
+{
+    if (val == NULL)
+        return -1;
+    switch (val->type) {
+        case VIR_CONF_NONE:
+            return -1;
+        case VIR_CONF_LONG:
+            virBufferAsprintf(buf, "%ld", val->l);
+            break;
+        case VIR_CONF_STRING:
+            if (strchr(val->str, '\n') != NULL) {
+                virBufferAsprintf(buf, "\"\"\"%s\"\"\"", val->str);
+            } else if (strchr(val->str, '"') == NULL) {
+                virBufferAsprintf(buf, "\"%s\"", val->str);
+            } else if (strchr(val->str, '\'') == NULL) {
+                virBufferAsprintf(buf, "'%s'", val->str);
+            } else {
+                virBufferAsprintf(buf, "\"\"\"%s\"\"\"", val->str);
+            }
+            break;
+        case VIR_CONF_LIST: {
+            virConfValuePtr cur;
+
+            cur = val->list;
+            virBufferAddLit(buf, "[ ");
+            if (cur != NULL) {
+                virConfSaveValue(buf, cur);
+                cur = cur->next;
+                while (cur != NULL) {
+                    virBufferAddLit(buf, ", ");
+                    virConfSaveValue(buf, cur);
+                    cur = cur->next;
+                }
+            }
+            virBufferAddLit(buf, " ]");
+            break;
+        }
+        default:
+            return -1;
+    }
+    return 0;
+}
+
+/**
+ * virConfSaveEntry:
+ * @buf: output buffer
+ * @cur: a conf entry
+ *
+ * Serialize the entry to the buffer
+ *
+ * Returns 0 in case of success, -1 in case of error.
+ */
+static int
+virConfSaveEntry(virBufferPtr buf, virConfEntryPtr cur)
+{
+    if (cur->name != NULL) {
+        virBufferAdd(buf, cur->name, -1);
+        virBufferAddLit(buf, " = ");
+        virConfSaveValue(buf, cur->value);
+        if (cur->comment != NULL) {
+            virBufferAddLit(buf, " #");
+            virBufferAdd(buf, cur->comment, -1);
+        }
+    } else if (cur->comment != NULL) {
+        virBufferAddLit(buf, "#");
+        virBufferAdd(buf, cur->comment, -1);
+    }
+    virBufferAddLit(buf, "\n");
+    return 0;
+}
+
+/************************************************************************
+ *									*
+ *			The parser core					*
+ *									*
+ ************************************************************************/
+
+/**
+ * virConfParseLong:
+ * @ctxt: the parsing context
+ * @val: the result
+ *
+ * Parse one long int value
+ *
+ * Returns 0 in case of success and -1 in case of error
+ */
+static int
+virConfParseLong(virConfParserCtxtPtr ctxt, long *val)
+{
+    long l = 0;
+    int neg = 0;
+
+    if (CUR == '-') {
+        neg = 1;
+        NEXT;
+    } else if (CUR == '+') {
+        NEXT;
+    }
+    if ((ctxt->cur >= ctxt->end) || (!c_isdigit(CUR))) {
+        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("unterminated number"));
+        return -1;
+    }
+    while ((ctxt->cur < ctxt->end) && (c_isdigit(CUR))) {
+        l = l * 10 + (CUR - '0');
+        NEXT;
+    }
+    if (neg)
+        l = -l;
+    *val = l;
+    return 0;
+}
+
+/**
+ * virConfParseString:
+ * @ctxt: the parsing context
+ *
+ * Parse one string
+ *
+ * Returns a pointer to the string or NULL in case of error
+ */
+static char *
+virConfParseString(virConfParserCtxtPtr ctxt)
+{
+    const char *base;
+    char *ret = NULL;
+
+    if (CUR == '\'') {
+        NEXT;
+        base = ctxt->cur;
+        while ((ctxt->cur < ctxt->end) && (CUR != '\'') && (!IS_EOL(CUR)))
+            NEXT;
+        if (CUR != '\'') {
+            virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("unterminated string"));
+            return NULL;
+        }
+        ret = strndup(base, ctxt->cur - base);
+        if (ret == NULL) {
+            virReportOOMError();
+            return NULL;
+        }
+        NEXT;
+    } else if ((ctxt->cur + 6 < ctxt->end) &&
+               (STRPREFIX(ctxt->cur, "\"\"\""))) {
+        /* String starts with python-style triple quotes """ */
+        ctxt->cur += 3;
+        base = ctxt->cur;
+
+        /* Find the ending triple quotes */
+        while ((ctxt->cur + 2 < ctxt->end) &&
+               !(STRPREFIX(ctxt->cur, "\"\"\""))) {
+            if (CUR == '\n')
+                ctxt->line++;
+            NEXT;
+        }
+
+        if (!STRPREFIX(ctxt->cur, "\"\"\"")) {
+            virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("unterminated string"));
+            return NULL;
+        }
+        ret = strndup(base, ctxt->cur - base);
+        if (ret == NULL) {
+            virReportOOMError();
+            return NULL;
+        }
+        ctxt->cur += 3;
+    } else if (CUR == '"') {
+        NEXT;
+        base = ctxt->cur;
+        while ((ctxt->cur < ctxt->end) && (CUR != '"') && (!IS_EOL(CUR)))
+            NEXT;
+        if (CUR != '"') {
+            virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("unterminated string"));
+            return NULL;
+        }
+        ret = strndup(base, ctxt->cur - base);
+        if (ret == NULL) {
+            virReportOOMError();
+            return NULL;
+        }
+        NEXT;
+    }
+    return ret;
+}
+
+/**
+ * virConfParseValue:
+ * @ctxt: the parsing context
+ *
+ * Parse one value
+ *
+ * Returns a pointer to the value or NULL in case of error
+ */
+static virConfValuePtr
+virConfParseValue(virConfParserCtxtPtr ctxt)
+{
+    virConfValuePtr ret, lst = NULL, tmp, prev;
+    virConfType type = VIR_CONF_NONE;
+    char *str = NULL;
+    long  l = 0;
+
+    SKIP_BLANKS;
+    if (ctxt->cur >= ctxt->end) {
+        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("expecting a value"));
+        return NULL;
+    }
+    if ((CUR == '"') || (CUR == '\'')) {
+        type = VIR_CONF_STRING;
+        str = virConfParseString(ctxt);
+        if (str == NULL)
+            return NULL;
+    } else if (CUR == '[') {
+        if (ctxt->conf->flags & VIR_CONF_FLAG_VMX_FORMAT) {
+            virConfError(ctxt, VIR_ERR_CONF_SYNTAX,
+                         _("lists not allowed in VMX format"));
+            return NULL;
+        }
+        type = VIR_CONF_LIST;
+        NEXT;
+        SKIP_BLANKS_AND_EOL;
+        if ((ctxt->cur < ctxt->end) && (CUR != ']')) {
+            if ((lst = virConfParseValue(ctxt)) == NULL)
+                return NULL;
+            SKIP_BLANKS_AND_EOL;
+        }
+        while ((ctxt->cur < ctxt->end) && (CUR != ']')) {
+
+            /* Tell Clang that when execution reaches this point
+               "lst" is guaranteed to be non-NULL.  This stops it
+               from issuing an invalid NULL-dereference warning about
+               "prev = lst; while (prev->next..." below.  */
+            sa_assert(lst);
+
+            if (CUR != ',') {
+                virConfError(ctxt, VIR_ERR_CONF_SYNTAX,
+                             _("expecting a separator in list"));
+                virConfFreeList(lst);
+                return NULL;
+            }
+            NEXT;
+            SKIP_BLANKS_AND_EOL;
+            if (CUR == ']') {
+                break;
+            }
+            tmp = virConfParseValue(ctxt);
+            if (tmp == NULL) {
+                virConfFreeList(lst);
+                return NULL;
+            }
+            prev = lst;
+            while (prev->next != NULL) prev = prev->next;
+            prev->next = tmp;
+            SKIP_BLANKS_AND_EOL;
+        }
+        if (CUR == ']') {
+            NEXT;
+        } else {
+            virConfError(ctxt, VIR_ERR_CONF_SYNTAX,
+                         _("list is not closed with ]"));
+            virConfFreeList(lst);
+            return NULL;
+        }
+    } else if (c_isdigit(CUR) || (CUR == '-') || (CUR == '+')) {
+        if (ctxt->conf->flags & VIR_CONF_FLAG_VMX_FORMAT) {
+            virConfError(ctxt, VIR_ERR_CONF_SYNTAX,
+                         _("numbers not allowed in VMX format"));
+            return NULL;
+        }
+        if (virConfParseLong(ctxt, &l) < 0) {
+            return NULL;
+        }
+        type = VIR_CONF_LONG;
+    } else {
+        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("expecting a value"));
+        return NULL;
+    }
+    if (VIR_ALLOC(ret) < 0) {
+        virReportOOMError();
+        virConfFreeList(lst);
+        VIR_FREE(str);
+        return NULL;
+    }
+    ret->type = type;
+    ret->l = l;
+    ret->str = str;
+    ret->list = lst;
+    return ret;
+}
+
+/**
+ * virConfParseName:
+ * @ctxt: the parsing context
+ *
+ * Parse one name
+ *
+ * Returns a copy of the new string, NULL in case of error
+ */
+static char *
+virConfParseName(virConfParserCtxtPtr ctxt)
+{
+    const char *base;
+    char *ret;
+
+    SKIP_BLANKS;
+    base = ctxt->cur;
+    /* TODO: probably need encoding support and UTF-8 parsing ! */
+    if (!c_isalpha(CUR) &&
+        !((ctxt->conf->flags & VIR_CONF_FLAG_VMX_FORMAT) && (CUR == '.'))) {
+        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("expecting a name"));
+        return NULL;
+    }
+    while ((ctxt->cur < ctxt->end) &&
+           (c_isalnum(CUR) || (CUR == '_') ||
+            ((ctxt->conf->flags & VIR_CONF_FLAG_VMX_FORMAT) &&
+             ((CUR == ':') || (CUR == '.') || (CUR == '-')))))
+        NEXT;
+    ret = strndup(base, ctxt->cur - base);
+    if (ret == NULL) {
+        virReportOOMError();
+        return NULL;
+    }
+    return ret;
+}
+
+/**
+ * virConfParseComment:
+ * @ctxt: the parsing context
+ *
+ * Parse one standalone comment in the configuration file
+ *
+ * Returns 0 in case of success and -1 in case of error
+ */
+static int
+virConfParseComment(virConfParserCtxtPtr ctxt)
+{
+    const char *base;
+    char *comm;
+
+    if (CUR != '#')
+        return -1;
+    NEXT;
+    base = ctxt->cur;
+    while ((ctxt->cur < ctxt->end) && (!IS_EOL(CUR))) NEXT;
+    comm = strndup(base, ctxt->cur - base);
+    if (comm == NULL) {
+        virReportOOMError();
+        return -1;
+    }
+    virConfAddEntry(ctxt->conf, NULL, NULL, comm);
+    return 0;
+}
+
+/**
+ * virConfParseSeparator:
+ * @ctxt: the parsing context
+ *
+ * Parse one separator between statement if not at the end.
+ *
+ * Returns 0 in case of success and -1 in case of error
+ */
+static int
+virConfParseSeparator(virConfParserCtxtPtr ctxt)
+{
+    SKIP_BLANKS;
+    if (ctxt->cur >= ctxt->end)
+        return 0;
+    if (IS_EOL(CUR)) {
+        SKIP_BLANKS_AND_EOL;
+    } else if (CUR == ';') {
+        NEXT;
+        SKIP_BLANKS_AND_EOL;
+    } else {
+        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("expecting a separator"));
+        return -1;
+    }
+    return 0;
+}
+
+/**
+ * virConfParseStatement:
+ * @ctxt: the parsing context
+ *
+ * Parse one statement in the conf file
+ *
+ * Returns 0 in case of success and -1 in case of error
+ */
+static int
+virConfParseStatement(virConfParserCtxtPtr ctxt)
+{
+    const char *base;
+    char *name;
+    virConfValuePtr value;
+    char *comm = NULL;
+
+    SKIP_BLANKS_AND_EOL;
+    if (CUR == '#') {
+        return virConfParseComment(ctxt);
+    }
+    name = virConfParseName(ctxt);
+    if (name == NULL)
+        return -1;
+    SKIP_BLANKS;
+    if (CUR != '=') {
+        virConfError(ctxt, VIR_ERR_CONF_SYNTAX, _("expecting an assignment"));
+        VIR_FREE(name);
+        return -1;
+    }
+    NEXT;
+    SKIP_BLANKS;
+    value = virConfParseValue(ctxt);
+    if (value == NULL) {
+        VIR_FREE(name);
+        return -1;
+    }
+    SKIP_BLANKS;
+    if (CUR == '#') {
+        NEXT;
+        base = ctxt->cur;
+        while ((ctxt->cur < ctxt->end) && (!IS_EOL(CUR))) NEXT;
+        comm = strndup(base, ctxt->cur - base);
+        if (comm == NULL) {
+            virReportOOMError();
+            VIR_FREE(name);
+            virConfFreeValue(value);
+            return -1;
+        }
+    }
+    if (virConfAddEntry(ctxt->conf, name, value, comm) == NULL) {
+        VIR_FREE(name);
+        virConfFreeValue(value);
+        VIR_FREE(comm);
+        return -1;
+    }
+    return 0;
+}
+
+/**
+ * virConfParse:
+ * @filename: the name to report errors
+ * @content: the configuration content in memory
+ * @len: the length in bytes
+ * @flags: combination of virConfFlag(s)
+ *
+ * Parse the subset of the Python language needed to handle simple
+ * Xen configuration files.
+ *
+ * Returns a handle to lookup settings or NULL if it failed to
+ *         read or parse the file, use virConfFree() to free the data.
+ */
+static virConfPtr
+virConfParse(const char *filename, const char *content, int len,
+             unsigned int flags) {
+    virConfParserCtxt ctxt;
+
+    ctxt.filename = filename;
+    ctxt.base = ctxt.cur = content;
+    ctxt.end = content + len - 1;
+    ctxt.line = 1;
+
+    ctxt.conf = virConfCreate(filename, flags);
+    if (ctxt.conf == NULL)
+        return NULL;
+
+    while (ctxt.cur < ctxt.end) {
+        if (virConfParseStatement(&ctxt) < 0)
+            goto error;
+        if (virConfParseSeparator(&ctxt) < 0)
+            goto error;
+    }
+
+    return ctxt.conf;
+
+error:
+    virConfFree(ctxt.conf);
+    return NULL;
+}
+
+/************************************************************************
+ *									*
+ *			The module entry points				*
+ *									*
+ ************************************************************************/
+
+/* 10 MB limit on config file size as a sanity check */
+#define MAX_CONFIG_FILE_SIZE (1024*1024*10)
+
+/**
+ * virConfReadFile:
+ * @filename: the path to the configuration file.
+ * @flags: combination of virConfFlag(s)
+ *
+ * Reads a configuration file.
+ *
+ * Returns a handle to lookup settings or NULL if it failed to
+ *         read or parse the file, use virConfFree() to free the data.
+ */
+virConfPtr
+virConfReadFile(const char *filename, unsigned int flags)
+{
+    char *content;
+    int len;
+    virConfPtr conf;
+
+    VIR_DEBUG("filename=%s", NULLSTR(filename));
+
+    if (filename == NULL) {
+        virConfError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
+        return NULL;
+    }
+
+    if ((len = virFileReadAll(filename, MAX_CONFIG_FILE_SIZE, &content)) < 0) {
+        return NULL;
+    }
+
+    conf = virConfParse(filename, content, len, flags);
+
+    VIR_FREE(content);
+
+    return conf;
+}
+
+/**
+ * virConfReadMem:
+ * @memory: pointer to the content of the configuration file
+ * @len: length in byte
+ * @flags: combination of virConfFlag(s)
+ *
+ * Reads a configuration file loaded in memory. The string can be
+ * zero terminated in which case @len can be 0
+ *
+ * Returns a handle to lookup settings or NULL if it failed to
+ *         parse the content, use virConfFree() to free the data.
+ */
+virConfPtr
+virConfReadMem(const char *memory, int len, unsigned int flags)
+{
+    if ((memory == NULL) || (len < 0)) {
+        virConfError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
+        return NULL;
+    }
+    if (len == 0)
+        len = strlen(memory);
+
+    return virConfParse("memory conf", memory, len, flags);
+}
+
+/**
+ * virConfFree:
+ * @conf: a configuration file handle
+ *
+ * Frees all data associated to the handle
+ *
+ * Returns 0 in case of success, -1 in case of error.
+ */
+int
+virConfFree(virConfPtr conf)
+{
+    virConfEntryPtr tmp;
+    if (conf == NULL)
+        return 0;
+
+    tmp = conf->entries;
+    while (tmp) {
+        virConfEntryPtr next;
+        VIR_FREE(tmp->name);
+        virConfFreeValue(tmp->value);
+        VIR_FREE(tmp->comment);
+        next = tmp->next;
+        VIR_FREE(tmp);
+        tmp = next;
+    }
+    VIR_FREE(conf);
+    return 0;
+}
+
+/**
+ * virConfGetValue:
+ * @conf: a configuration file handle
+ * @entry: the name of the entry
+ *
+ * Lookup the value associated to this entry in the configuration file
+ *
+ * Returns a pointer to the value or NULL if the lookup failed, the data
+ *         associated will be freed when virConfFree() is called
+ */
+virConfValuePtr
+virConfGetValue(virConfPtr conf, const char *setting)
+{
+    virConfEntryPtr cur;
+
+    if (conf == NULL)
+        return NULL;
+
+    cur = conf->entries;
+    while (cur != NULL) {
+        if ((cur->name != NULL) &&
+            ((conf->flags & VIR_CONF_FLAG_VMX_FORMAT &&
+              STRCASEEQ(cur->name, setting)) ||
+             STREQ(cur->name, setting)))
+            return cur->value;
+        cur = cur->next;
+    }
+    return NULL;
+}
+
+/**
+ * virConfSetValue:
+ * @conf: a configuration file handle
+ * @entry: the name of the entry
+ * @value: the new configuration value
+ *
+ * Set (or replace) the value associated to this entry in the configuration
+ * file. The passed in 'value' will be owned by the conf object upon return
+ * of this method, even in case of error. It should not be referenced again
+ * by the caller.
+ *
+ * Returns 0 on success, or -1 on failure.
+ */
+int
+virConfSetValue(virConfPtr conf,
+                const char *setting,
+                virConfValuePtr value)
+{
+    virConfEntryPtr cur, prev = NULL;
+
+    if (value && value->type == VIR_CONF_STRING && value->str == NULL)
+        return -1;
+
+    cur = conf->entries;
+    while (cur != NULL) {
+        if ((cur->name != NULL) && (STREQ(cur->name, setting))) {
+            break;
+        }
+        prev = cur;
+        cur = cur->next;
+    }
+
+    if (!cur) {
+        if (VIR_ALLOC(cur) < 0) {
+            virReportOOMError();
+            virConfFreeValue(value);
+            return -1;
+        }
+        cur->comment = NULL;
+        if (!(cur->name = strdup(setting))) {
+            virReportOOMError();
+            virConfFreeValue(value);
+            VIR_FREE(cur);
+            return -1;
+        }
+        cur->value = value;
+        if (prev) {
+            cur->next = prev->next;
+            prev->next = cur;
+        } else {
+            cur->next = conf->entries;
+            conf->entries = cur;
+        }
+    } else {
+        virConfFreeValue(cur->value);
+        cur->value = value;
+    }
+    return 0;
+}
+
+
+/**
+ * virConfWriteFile:
+ * @filename: the path to the configuration file.
+ * @conf: the conf
+ *
+ * Writes a configuration file back to a file.
+ *
+ * Returns the number of bytes written or -1 in case of error.
+ */
+int
+virConfWriteFile(const char *filename, virConfPtr conf)
+{
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
+    virConfEntryPtr cur;
+    int ret;
+    int fd;
+    char *content;
+    unsigned int use;
+
+    if (conf == NULL)
+        return -1;
+
+    cur = conf->entries;
+    while (cur != NULL) {
+        virConfSaveEntry(&buf, cur);
+        cur = cur->next;
+    }
+
+    if (virBufferError(&buf)) {
+        virBufferFreeAndReset(&buf);
+        virReportOOMError();
+        return -1;
+    }
+
+    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+    if (fd < 0) {
+        virBufferFreeAndReset(&buf);
+        virConfError(NULL, VIR_ERR_WRITE_FAILED, _("failed to open file"));
+        return -1;
+    }
+
+    use = virBufferUse(&buf);
+    content = virBufferContentAndReset(&buf);
+    ret = safewrite(fd, content, use);
+    VIR_FREE(content);
+    VIR_FORCE_CLOSE(fd);
+    if (ret != (int)use) {
+        virConfError(NULL, VIR_ERR_WRITE_FAILED, _("failed to save content"));
+        return -1;
+    }
+
+    return ret;
+}
+
+/**
+ * virConfWriteMem:
+ * @memory: pointer to the memory to store the config file
+ * @len: pointer to the length in bytes of the store, on output the size
+ * @conf: the conf
+ *
+ * Writes a configuration file back to a memory area. @len is an IN/OUT
+ * parameter, it indicates the size available in bytes, and on output the
+ * size required for the configuration file (even if the call fails due to
+ * insufficient space).
+ *
+ * Returns the number of bytes written or -1 in case of error.
+ */
+int
+virConfWriteMem(char *memory, int *len, virConfPtr conf)
+{
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
+    virConfEntryPtr cur;
+    char *content;
+    unsigned int use;
+
+    if ((memory == NULL) || (len == NULL) || (*len <= 0) || (conf == NULL))
+        return -1;
+
+    cur = conf->entries;
+    while (cur != NULL) {
+        virConfSaveEntry(&buf, cur);
+        cur = cur->next;
+    }
+
+    if (virBufferError(&buf)) {
+        virBufferFreeAndReset(&buf);
+        virReportOOMError();
+        return -1;
+    }
+
+    use = virBufferUse(&buf);
+    content = virBufferContentAndReset(&buf);
+
+    if ((int)use >= *len) {
+        *len = (int)use;
+        VIR_FREE(content);
+        return -1;
+    }
+    memcpy(memory, content, use);
+    VIR_FREE(content);
+    *len = use;
+    return use;
+}
diff --git a/src/util/virconf.h b/src/util/virconf.h
new file mode 100644
index 0000000..224592d
--- /dev/null
+++ b/src/util/virconf.h
@@ -0,0 +1,100 @@
+/**
+ * conf.h: parser for a subset of the Python encoded Xen configuration files
+ *
+ * Copyright (C) 2006, 2007 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Daniel Veillard <veillard at redhat.com>
+ */
+
+#ifndef __VIR_CONF_H__
+# define __VIR_CONF_H__
+
+/**
+ * virConfType:
+ * one of the possible type for a value from the configuration file
+ *
+ * TODO: we probably need a float too.
+ */
+typedef enum {
+    VIR_CONF_NONE = 0,		/* undefined */
+    VIR_CONF_LONG = 1,		/* a long int */
+    VIR_CONF_STRING = 2,	/* a string */
+    VIR_CONF_LIST = 3		/* a list */
+} virConfType;
+
+typedef enum {
+    VIR_CONF_FLAG_VMX_FORMAT = 1,  /* allow ':', '.' and '-' in names for compatibility
+                                      with VMware VMX configuration file, but restrict
+                                      allowed value types to string only */
+} virConfFlags;
+
+static inline const char *
+virConfTypeName (virConfType t)
+{
+    switch (t) {
+    case VIR_CONF_LONG:
+        return "long";
+    case VIR_CONF_STRING:
+        return "string";
+    case VIR_CONF_LIST:
+        return "list";
+    default:
+        return "*unexpected*";
+    }
+}
+
+/**
+ * virConfValue:
+ * a value from the configuration file
+ */
+typedef struct _virConfValue virConfValue;
+typedef virConfValue *virConfValuePtr;
+
+struct _virConfValue {
+    virConfType type;		/* the virConfType */
+    virConfValuePtr next;	/* next element if in a list */
+    long  l;			/* long integer */
+    char *str;			/* pointer to 0 terminated string */
+    virConfValuePtr list;	/* list of a list */
+};
+
+/**
+ * virConfPtr:
+ * a pointer to a parsed configuration file
+ */
+typedef struct _virConf virConf;
+typedef virConf *virConfPtr;
+
+virConfPtr      virConfNew             (void);
+virConfPtr	virConfReadFile	(const char *filename, unsigned int flags);
+virConfPtr	virConfReadMem		(const char *memory,
+                                         int len, unsigned int flags);
+int		virConfFree		(virConfPtr conf);
+void            virConfFreeValue      (virConfValuePtr val);
+
+virConfValuePtr	virConfGetValue	(virConfPtr conf,
+                                         const char *setting);
+int             virConfSetValue        (virConfPtr conf,
+                                         const char *setting,
+                                         virConfValuePtr value);
+int		virConfWriteFile	(const char *filename,
+                                         virConfPtr conf);
+int		virConfWriteMem	(char *memory,
+                                         int *len,
+                                         virConfPtr conf);
+
+#endif /* __VIR_CONF_H__ */
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index e051de5..0d34453 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -27,7 +27,7 @@
 
 #include "internal.h"
 #include "virterror_internal.h"
-#include "conf.h"
+#include "virconf.h"
 #include "memory.h"
 #include "logging.h"
 #include "uuid.h"
diff --git a/src/vmx/vmx.h b/src/vmx/vmx.h
index 406c27e..f4877b1 100644
--- a/src/vmx/vmx.h
+++ b/src/vmx/vmx.h
@@ -24,7 +24,7 @@
 # define __VIR_VMX_H__
 
 # include "internal.h"
-# include "conf.h"
+# include "virconf.h"
 # include "domain_conf.h"
 
 typedef struct _virVMXContext virVMXContext;
diff --git a/src/xen/xen_inotify.c b/src/xen/xen_inotify.c
index 2e40015..bcafdd0 100644
--- a/src/xen/xen_inotify.c
+++ b/src/xen/xen_inotify.c
@@ -32,7 +32,7 @@
 #include "driver.h"
 #include "memory.h"
 #include "xen_driver.h"
-#include "conf.h"
+#include "virconf.h"
 #include "domain_conf.h"
 #include "xen_inotify.h"
 #include "xend_internal.h"
diff --git a/src/xen/xm_internal.h b/src/xen/xm_internal.h
index 98b5ad7..df77ac8 100644
--- a/src/xen/xm_internal.h
+++ b/src/xen/xm_internal.h
@@ -27,7 +27,7 @@
 
 # include "internal.h"
 # include "driver.h"
-# include "conf.h"
+# include "virconf.h"
 # include "domain_conf.h"
 
 extern struct xenUnifiedDriver xenXMDriver;
diff --git a/src/xenxs/xen_sxpr.c b/src/xenxs/xen_sxpr.c
index 3e8396b..ed0c9e1 100644
--- a/src/xenxs/xen_sxpr.c
+++ b/src/xenxs/xen_sxpr.c
@@ -28,7 +28,7 @@
 
 #include "internal.h"
 #include "virterror_internal.h"
-#include "conf.h"
+#include "virconf.h"
 #include "memory.h"
 #include "verify.h"
 #include "uuid.h"
diff --git a/src/xenxs/xen_sxpr.h b/src/xenxs/xen_sxpr.h
index d4502bd..4ff640c 100644
--- a/src/xenxs/xen_sxpr.h
+++ b/src/xenxs/xen_sxpr.h
@@ -28,7 +28,7 @@
 # define __VIR_XEN_SXPR_H__
 
 # include "internal.h"
-# include "conf.h"
+# include "virconf.h"
 # include "domain_conf.h"
 # include "sexpr.h"
 
diff --git a/src/xenxs/xen_xm.c b/src/xenxs/xen_xm.c
index 23b3037..7bde7ab 100644
--- a/src/xenxs/xen_xm.c
+++ b/src/xenxs/xen_xm.c
@@ -27,7 +27,7 @@
 
 #include "internal.h"
 #include "virterror_internal.h"
-#include "conf.h"
+#include "virconf.h"
 #include "memory.h"
 #include "verify.h"
 #include "uuid.h"
diff --git a/src/xenxs/xen_xm.h b/src/xenxs/xen_xm.h
index c3d0ad4..629a4b3 100644
--- a/src/xenxs/xen_xm.h
+++ b/src/xenxs/xen_xm.h
@@ -27,7 +27,7 @@
 # define __VIR_XEN_XM_H__
 
 # include "internal.h"
-# include "conf.h"
+# include "virconf.h"
 # include "domain_conf.h"
 
 virConfPtr xenFormatXM(virConnectPtr conn, virDomainDefPtr def,
diff --git a/tests/conftest.c b/tests/conftest.c
index 4342a52..aacc526 100644
--- a/tests/conftest.c
+++ b/tests/conftest.c
@@ -5,7 +5,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
-#include "conf.h"
+#include "virconf.h"
 #include "memory.h"
 
 int main(int argc, char **argv)
diff --git a/tests/libvirtdconftest.c b/tests/libvirtdconftest.c
index ee1f8a0..c2b02a6 100644
--- a/tests/libvirtdconftest.c
+++ b/tests/libvirtdconftest.c
@@ -28,7 +28,7 @@
 #include "c-ctype.h"
 #include "virterror_internal.h"
 #include "logging.h"
-#include "conf.h"
+#include "virconf.h"
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
-- 
1.7.11.7




More information about the libvir-list mailing list