Following Daniel's feedback yesterday, instead of moving the virGetDomain & related functions from hash.c into libvirt.c, I create a new file to deal with all our public datatypes. I call it datatypes.h, datatypes.c A bunch of stuff moves out of hash.c and internal.h into these two files. Quite a few internal driver files need updates to add an extra #include line. There should be no functional changes here b/src/datatypes.c | 772 +++++++++++++++++++++++++++++++++++++++++++++++ b/src/datatypes.h | 212 ++++++++++++ b/src/libvirt_internal.h | 64 +++ po/POTFILES.in | 2 proxy/libvirt_proxy.c | 2 qemud/qemud.c | 2 qemud/remote.c | 3 src/Makefile.am | 3 src/domain_conf.c | 1 src/domain_conf.h | 4 src/driver.h | 3 src/hash.c | 725 -------------------------------------------- src/internal.h | 206 ------------ src/libvirt.c | 6 src/lxc_driver.c | 1 src/network_conf.c | 1 src/network_conf.h | 4 src/network_driver.c | 1 src/openvz_driver.c | 1 src/proxy_internal.c | 1 src/proxy_internal.h | 2 src/qemu_driver.c | 1 src/qparams.c | 2 src/remote_internal.c | 1 src/stats_linux.c | 1 src/storage_conf.c | 6 src/storage_conf.h | 5 src/storage_driver.c | 1 src/test.c | 1 src/uuid.c | 1 src/veth.c | 1 src/virterror.c | 1 src/xen_internal.c | 1 src/xen_internal.h | 2 src/xen_unified.c | 2 src/xen_unified.h | 3 src/xend_internal.c | 1 src/xend_internal.h | 1 src/xm_internal.c | 1 src/xs_internal.c | 1 tests/xmconfigtest.c | 1 41 files changed, 1102 insertions(+), 948 deletions(-) Daniel diff -r 10d728ae8445 po/POTFILES.in --- a/po/POTFILES.in Wed Oct 29 20:09:50 2008 +0000 +++ b/po/POTFILES.in Wed Oct 29 20:10:40 2008 +0000 @@ -3,8 +3,8 @@ qemud/remote.c src/conf.c src/console.c +src/datatypes.c src/domain_conf.c -src/hash.c src/iptables.c src/libvirt.c src/lxc_container.c diff -r 10d728ae8445 proxy/libvirt_proxy.c --- a/proxy/libvirt_proxy.c Wed Oct 29 20:09:50 2008 +0000 +++ b/proxy/libvirt_proxy.c Wed Oct 29 20:10:40 2008 +0000 @@ -24,7 +24,7 @@ #include <locale.h> #include "internal.h" - +#include "datatypes.h" #include "proxy_internal.h" #include "util.h" #include "xen_internal.h" diff -r 10d728ae8445 qemud/qemud.c --- a/qemud/qemud.c Wed Oct 29 20:09:50 2008 +0000 +++ b/qemud/qemud.c Wed Oct 29 20:10:40 2008 +0000 @@ -49,7 +49,7 @@ #include <signal.h> #include <netdb.h> -#include "internal.h" +#include "libvirt_internal.h" #include "qemud.h" #include "util.h" diff -r 10d728ae8445 qemud/remote.c --- a/qemud/remote.c Wed Oct 29 20:09:50 2008 +0000 +++ b/qemud/remote.c Wed Oct 29 20:10:40 2008 +0000 @@ -48,7 +48,8 @@ #include <polkit-dbus/polkit-dbus.h> #endif -#include "internal.h" +#include "libvirt_internal.h" +#include "datatypes.h" #include "qemud.h" #include "memory.h" diff -r 10d728ae8445 src/Makefile.am --- a/src/Makefile.am Wed Oct 29 20:09:50 2008 +0000 +++ b/src/Makefile.am Wed Oct 29 20:10:40 2008 +0000 @@ -44,6 +44,7 @@ buf.c buf.h \ conf.c conf.h \ event.c event.h \ + hash.c hash.h \ iptables.c iptables.h \ memory.c memory.h \ qparams.c qparams.h \ @@ -147,8 +148,8 @@ libvirt_la_SOURCES = \ driver.h \ - hash.c hash.h \ internal.h \ + datatypes.c datatypes.h \ libvirt.c libvirt_internal.h \ $(GENERIC_LIB_SOURCES) \ $(DOMAIN_CONF_SOURCES) \ diff -r 10d728ae8445 src/datatypes.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/datatypes.c Wed Oct 29 20:10:40 2008 +0000 @@ -0,0 +1,772 @@ +/* + * datatypes.h: management of structs for public data types + * + * Copyright (C) 2006-2008 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <config.h> + +#include "datatypes.h" +#include "virterror_internal.h" +#include "memory.h" + +/************************************************************************ + * * + * Domain and Connections allocations * + * * + ************************************************************************/ +/** + * virLibConnError: + * @conn: the connection if available + * @error: the error number + * @info: extra information string + * + * Handle an error at the connection level + */ +static void +virLibConnError(virConnectPtr conn, virErrorNumber error, const char *info) +{ + const char *errmsg; + + if (error == VIR_ERR_OK) + return; + + errmsg = virErrorMsg(error, info); + virRaiseError(conn, NULL, NULL, VIR_FROM_NONE, error, VIR_ERR_ERROR, + errmsg, info, NULL, 0, 0, errmsg, info); +} + +/** + * virDomainFreeName: + * @domain: a domain object + * + * Destroy the domain object, this is just used by the domain hash callback. + * + * Returns 0 in case of success and -1 in case of failure. + */ +static int +virDomainFreeName(virDomainPtr domain, const char *name ATTRIBUTE_UNUSED) +{ + return (virDomainFree(domain)); +} + +/** + * virNetworkFreeName: + * @network: a network object + * + * Destroy the network object, this is just used by the network hash callback. + * + * Returns 0 in case of success and -1 in case of failure. + */ +static int +virNetworkFreeName(virNetworkPtr network, const char *name ATTRIBUTE_UNUSED) +{ + return (virNetworkFree(network)); +} + +/** + * virStoragePoolFreeName: + * @pool: a pool object + * + * Destroy the pool object, this is just used by the pool hash callback. + * + * Returns 0 in case of success and -1 in case of failure. + */ +static int +virStoragePoolFreeName(virStoragePoolPtr pool, const char *name ATTRIBUTE_UNUSED) +{ + return (virStoragePoolFree(pool)); +} + +/** + * virStorageVolFreeName: + * @vol: a vol object + * + * Destroy the vol object, this is just used by the vol hash callback. + * + * Returns 0 in case of success and -1 in case of failure. + */ +static int +virStorageVolFreeName(virStorageVolPtr vol, const char *name ATTRIBUTE_UNUSED) +{ + return (virStorageVolFree(vol)); +} + +/** + * virGetConnect: + * + * Allocates a new hypervisor connection structure + * + * Returns a new pointer or NULL in case of error. + */ +virConnectPtr +virGetConnect(void) { + virConnectPtr ret; + + if (VIR_ALLOC(ret) < 0) { + virLibConnError(NULL, VIR_ERR_NO_MEMORY, _("allocating connection")); + goto failed; + } + ret->magic = VIR_CONNECT_MAGIC; + ret->driver = NULL; + ret->networkDriver = NULL; + ret->privateData = NULL; + ret->networkPrivateData = NULL; + ret->domains = virHashCreate(20); + if (ret->domains == NULL) + goto failed; + ret->networks = virHashCreate(20); + if (ret->networks == NULL) + goto failed; + ret->storagePools = virHashCreate(20); + if (ret->storagePools == NULL) + goto failed; + ret->storageVols = virHashCreate(20); + if (ret->storageVols == NULL) + goto failed; + + pthread_mutex_init(&ret->lock, NULL); + + ret->refs = 1; + return(ret); + +failed: + if (ret != NULL) { + if (ret->domains != NULL) + virHashFree(ret->domains, (virHashDeallocator) virDomainFreeName); + if (ret->networks != NULL) + virHashFree(ret->networks, (virHashDeallocator) virNetworkFreeName); + if (ret->storagePools != NULL) + virHashFree(ret->storagePools, (virHashDeallocator) virStoragePoolFreeName); + if (ret->storageVols != NULL) + virHashFree(ret->storageVols, (virHashDeallocator) virStorageVolFreeName); + + pthread_mutex_destroy(&ret->lock); + VIR_FREE(ret); + } + return(NULL); +} + +/** + * virReleaseConnect: + * @conn: the hypervisor connection to release + * + * Unconditionally release all memory associated with a connection. + * The conn.lock mutex must be held prior to calling this, and will + * be released prior to this returning. The connection obj must not + * be used once this method returns. + */ +static void +virReleaseConnect(virConnectPtr conn) { + DEBUG("release connection %p %s", conn, conn->name); + if (conn->domains != NULL) + virHashFree(conn->domains, (virHashDeallocator) virDomainFreeName); + if (conn->networks != NULL) + virHashFree(conn->networks, (virHashDeallocator) virNetworkFreeName); + if (conn->storagePools != NULL) + virHashFree(conn->storagePools, (virHashDeallocator) virStoragePoolFreeName); + if (conn->storageVols != NULL) + virHashFree(conn->storageVols, (virHashDeallocator) virStorageVolFreeName); + + virResetError(&conn->err); + if (virLastErr.conn == conn) + virLastErr.conn = NULL; + + VIR_FREE(conn->name); + + pthread_mutex_unlock(&conn->lock); + pthread_mutex_destroy(&conn->lock); + VIR_FREE(conn); +} + +/** + * virUnrefConnect: + * @conn: the hypervisor connection to unreference + * + * Unreference the connection. If the use count drops to zero, the structure is + * actually freed. + * + * Returns the reference count or -1 in case of failure. + */ +int +virUnrefConnect(virConnectPtr conn) { + int refs; + + if ((!VIR_IS_CONNECT(conn))) { + virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + return(-1); + } + pthread_mutex_lock(&conn->lock); + DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs); + conn->refs--; + refs = conn->refs; + if (refs == 0) { + virReleaseConnect(conn); + /* Already unlocked mutex */ + return (0); + } + pthread_mutex_unlock(&conn->lock); + return (refs); +} + +/** + * virGetDomain: + * @conn: the hypervisor connection + * @name: pointer to the domain name + * @uuid: pointer to the uuid + * + * Lookup if the domain is already registered for that connection, + * if yes return a new pointer to it, if no allocate a new structure, + * and register it in the table. In any case a corresponding call to + * virUnrefDomain() is needed to not leak data. + * + * Returns a pointer to the domain, or NULL in case of failure + */ +virDomainPtr +__virGetDomain(virConnectPtr conn, const char *name, const unsigned char *uuid) { + virDomainPtr ret = NULL; + + if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) { + virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + return(NULL); + } + pthread_mutex_lock(&conn->lock); + + /* TODO search by UUID first as they are better differenciators */ + + ret = (virDomainPtr) virHashLookup(conn->domains, name); + /* TODO check the UUID */ + if (ret == NULL) { + if (VIR_ALLOC(ret) < 0) { + virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating domain")); + goto error; + } + ret->name = strdup(name); + if (ret->name == NULL) { + virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating domain")); + goto error; + } + ret->magic = VIR_DOMAIN_MAGIC; + ret->conn = conn; + ret->id = -1; + if (uuid != NULL) + memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN); + + if (virHashAddEntry(conn->domains, name, ret) < 0) { + virLibConnError(conn, VIR_ERR_INTERNAL_ERROR, + _("failed to add domain to connection hash table")); + goto error; + } + conn->refs++; + DEBUG("New hash entry %p", ret); + } else { + DEBUG("Existing hash entry %p: refs now %d", ret, ret->refs+1); + } + ret->refs++; + pthread_mutex_unlock(&conn->lock); + return(ret); + + error: + pthread_mutex_unlock(&conn->lock); + if (ret != NULL) { + VIR_FREE(ret->name); + VIR_FREE(ret); + } + return(NULL); +} + +/** + * virReleaseDomain: + * @domain: the domain to release + * + * Unconditionally release all memory associated with a domain. + * The conn.lock mutex must be held prior to calling this, and will + * be released prior to this returning. The domain obj must not + * be used once this method returns. + * + * It will also unreference the associated connection object, + * which may also be released if its ref count hits zero. + */ +static void +virReleaseDomain(virDomainPtr domain) { + virConnectPtr conn = domain->conn; + DEBUG("release domain %p %s", domain, domain->name); + + /* TODO search by UUID first as they are better differenciators */ + if (virHashRemoveEntry(conn->domains, domain->name, NULL) < 0) + virLibConnError(conn, VIR_ERR_INTERNAL_ERROR, + _("domain missing from connection hash table")); + + if (conn->err.dom == domain) + conn->err.dom = NULL; + if (virLastErr.dom == domain) + virLastErr.dom = NULL; + domain->magic = -1; + domain->id = -1; + VIR_FREE(domain->name); + VIR_FREE(domain); + + DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs); + conn->refs--; + if (conn->refs == 0) { + virReleaseConnect(conn); + /* Already unlocked mutex */ + return; + } + + pthread_mutex_unlock(&conn->lock); +} + + +/** + * virUnrefDomain: + * @domain: the domain to unreference + * + * Unreference the domain. If the use count drops to zero, the structure is + * actually freed. + * + * Returns the reference count or -1 in case of failure. + */ +int +virUnrefDomain(virDomainPtr domain) { + int refs; + + if (!VIR_IS_CONNECTED_DOMAIN(domain)) { + virLibConnError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + return(-1); + } + pthread_mutex_lock(&domain->conn->lock); + DEBUG("unref domain %p %s %d", domain, domain->name, domain->refs); + domain->refs--; + refs = domain->refs; + if (refs == 0) { + virReleaseDomain(domain); + /* Already unlocked mutex */ + return (0); + } + + pthread_mutex_unlock(&domain->conn->lock); + return (refs); +} + +/** + * virGetNetwork: + * @conn: the hypervisor connection + * @name: pointer to the network name + * @uuid: pointer to the uuid + * + * Lookup if the network is already registered for that connection, + * if yes return a new pointer to it, if no allocate a new structure, + * and register it in the table. In any case a corresponding call to + * virUnrefNetwork() is needed to not leak data. + * + * Returns a pointer to the network, or NULL in case of failure + */ +virNetworkPtr +__virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid) { + virNetworkPtr ret = NULL; + + if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) { + virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + return(NULL); + } + pthread_mutex_lock(&conn->lock); + + /* TODO search by UUID first as they are better differenciators */ + + ret = (virNetworkPtr) virHashLookup(conn->networks, name); + /* TODO check the UUID */ + if (ret == NULL) { + if (VIR_ALLOC(ret) < 0) { + virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating network")); + goto error; + } + ret->name = strdup(name); + if (ret->name == NULL) { + virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating network")); + goto error; + } + ret->magic = VIR_NETWORK_MAGIC; + ret->conn = conn; + if (uuid != NULL) + memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN); + + if (virHashAddEntry(conn->networks, name, ret) < 0) { + virLibConnError(conn, VIR_ERR_INTERNAL_ERROR, + _("failed to add network to connection hash table")); + goto error; + } + conn->refs++; + } + ret->refs++; + pthread_mutex_unlock(&conn->lock); + return(ret); + + error: + pthread_mutex_unlock(&conn->lock); + if (ret != NULL) { + VIR_FREE(ret->name); + VIR_FREE(ret); + } + return(NULL); +} + +/** + * virReleaseNetwork: + * @network: the network to release + * + * Unconditionally release all memory associated with a network. + * The conn.lock mutex must be held prior to calling this, and will + * be released prior to this returning. The network obj must not + * be used once this method returns. + * + * It will also unreference the associated connection object, + * which may also be released if its ref count hits zero. + */ +static void +virReleaseNetwork(virNetworkPtr network) { + virConnectPtr conn = network->conn; + DEBUG("release network %p %s", network, network->name); + + /* TODO search by UUID first as they are better differenciators */ + if (virHashRemoveEntry(conn->networks, network->name, NULL) < 0) + virLibConnError(conn, VIR_ERR_INTERNAL_ERROR, + _("network missing from connection hash table")); + + if (conn->err.net == network) + conn->err.net = NULL; + if (virLastErr.net == network) + virLastErr.net = NULL; + + network->magic = -1; + VIR_FREE(network->name); + VIR_FREE(network); + + DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs); + conn->refs--; + if (conn->refs == 0) { + virReleaseConnect(conn); + /* Already unlocked mutex */ + return; + } + + pthread_mutex_unlock(&conn->lock); +} + + +/** + * virUnrefNetwork: + * @network: the network to unreference + * + * Unreference the network. If the use count drops to zero, the structure is + * actually freed. + * + * Returns the reference count or -1 in case of failure. + */ +int +virUnrefNetwork(virNetworkPtr network) { + int refs; + + if (!VIR_IS_CONNECTED_NETWORK(network)) { + virLibConnError(network->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + return(-1); + } + pthread_mutex_lock(&network->conn->lock); + DEBUG("unref network %p %s %d", network, network->name, network->refs); + network->refs--; + refs = network->refs; + if (refs == 0) { + virReleaseNetwork(network); + /* Already unlocked mutex */ + return (0); + } + + pthread_mutex_unlock(&network->conn->lock); + return (refs); +} + + +/** + * virGetStoragePool: + * @conn: the hypervisor connection + * @name: pointer to the storage pool name + * @uuid: pointer to the uuid + * + * Lookup if the storage pool is already registered for that connection, + * if yes return a new pointer to it, if no allocate a new structure, + * and register it in the table. In any case a corresponding call to + * virFreeStoragePool() is needed to not leak data. + * + * Returns a pointer to the network, or NULL in case of failure + */ +virStoragePoolPtr +__virGetStoragePool(virConnectPtr conn, const char *name, const unsigned char *uuid) { + virStoragePoolPtr ret = NULL; + + if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) { + virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + return(NULL); + } + pthread_mutex_lock(&conn->lock); + + /* TODO search by UUID first as they are better differenciators */ + + ret = (virStoragePoolPtr) virHashLookup(conn->storagePools, name); + /* TODO check the UUID */ + if (ret == NULL) { + if (VIR_ALLOC(ret) < 0) { + virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating storage pool")); + goto error; + } + ret->name = strdup(name); + if (ret->name == NULL) { + virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating storage pool")); + goto error; + } + ret->magic = VIR_STORAGE_POOL_MAGIC; + ret->conn = conn; + if (uuid != NULL) + memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN); + + if (virHashAddEntry(conn->storagePools, name, ret) < 0) { + virLibConnError(conn, VIR_ERR_INTERNAL_ERROR, + _("failed to add storage pool to connection hash table")); + goto error; + } + conn->refs++; + } + ret->refs++; + pthread_mutex_unlock(&conn->lock); + return(ret); + +error: + pthread_mutex_unlock(&conn->lock); + if (ret != NULL) { + VIR_FREE(ret->name); + VIR_FREE(ret); + } + return(NULL); +} + + +/** + * virReleaseStoragePool: + * @pool: the pool to release + * + * Unconditionally release all memory associated with a pool. + * The conn.lock mutex must be held prior to calling this, and will + * be released prior to this returning. The pool obj must not + * be used once this method returns. + * + * It will also unreference the associated connection object, + * which may also be released if its ref count hits zero. + */ +static void +virReleaseStoragePool(virStoragePoolPtr pool) { + virConnectPtr conn = pool->conn; + DEBUG("release pool %p %s", pool, pool->name); + + /* TODO search by UUID first as they are better differenciators */ + if (virHashRemoveEntry(conn->storagePools, pool->name, NULL) < 0) + virLibConnError(conn, VIR_ERR_INTERNAL_ERROR, + _("pool missing from connection hash table")); + + pool->magic = -1; + VIR_FREE(pool->name); + VIR_FREE(pool); + + DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs); + conn->refs--; + if (conn->refs == 0) { + virReleaseConnect(conn); + /* Already unlocked mutex */ + return; + } + + pthread_mutex_unlock(&conn->lock); +} + + +/** + * virUnrefStoragePool: + * @pool: the pool to unreference + * + * Unreference the pool. If the use count drops to zero, the structure is + * actually freed. + * + * Returns the reference count or -1 in case of failure. + */ +int +virUnrefStoragePool(virStoragePoolPtr pool) { + int refs; + + if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) { + virLibConnError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + return(-1); + } + pthread_mutex_lock(&pool->conn->lock); + DEBUG("unref pool %p %s %d", pool, pool->name, pool->refs); + pool->refs--; + refs = pool->refs; + if (refs == 0) { + virReleaseStoragePool(pool); + /* Already unlocked mutex */ + return (0); + } + + pthread_mutex_unlock(&pool->conn->lock); + return (refs); +} + + +/** + * virGetStorageVol: + * @conn: the hypervisor connection + * @pool: pool owning the volume + * @name: pointer to the storage vol name + * @uuid: pointer to the uuid + * + * Lookup if the storage vol is already registered for that connection, + * if yes return a new pointer to it, if no allocate a new structure, + * and register it in the table. In any case a corresponding call to + * virFreeStorageVol() is needed to not leak data. + * + * Returns a pointer to the storage vol, or NULL in case of failure + */ +virStorageVolPtr +__virGetStorageVol(virConnectPtr conn, const char *pool, const char *name, const char *key) { + virStorageVolPtr ret = NULL; + + if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (key == NULL)) { + virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + return(NULL); + } + pthread_mutex_lock(&conn->lock); + + ret = (virStorageVolPtr) virHashLookup(conn->storageVols, key); + if (ret == NULL) { + if (VIR_ALLOC(ret) < 0) { + virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating storage vol")); + goto error; + } + ret->pool = strdup(pool); + if (ret->pool == NULL) { + virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating storage vol")); + goto error; + } + ret->name = strdup(name); + if (ret->name == NULL) { + virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating storage vol")); + goto error; + } + strncpy(ret->key, key, sizeof(ret->key)-1); + ret->key[sizeof(ret->key)-1] = '\0'; + ret->magic = VIR_STORAGE_VOL_MAGIC; + ret->conn = conn; + + if (virHashAddEntry(conn->storageVols, key, ret) < 0) { + virLibConnError(conn, VIR_ERR_INTERNAL_ERROR, + _("failed to add storage vol to connection hash table")); + goto error; + } + conn->refs++; + } + ret->refs++; + pthread_mutex_unlock(&conn->lock); + return(ret); + +error: + pthread_mutex_unlock(&conn->lock); + if (ret != NULL) { + VIR_FREE(ret->name); + VIR_FREE(ret->pool); + VIR_FREE(ret); + } + return(NULL); +} + + +/** + * virReleaseStorageVol: + * @vol: the vol to release + * + * Unconditionally release all memory associated with a vol. + * The conn.lock mutex must be held prior to calling this, and will + * be released prior to this returning. The vol obj must not + * be used once this method returns. + * + * It will also unreference the associated connection object, + * which may also be released if its ref count hits zero. + */ +static void +virReleaseStorageVol(virStorageVolPtr vol) { + virConnectPtr conn = vol->conn; + DEBUG("release vol %p %s", vol, vol->name); + + /* TODO search by UUID first as they are better differenciators */ + if (virHashRemoveEntry(conn->storageVols, vol->key, NULL) < 0) + virLibConnError(conn, VIR_ERR_INTERNAL_ERROR, + _("vol missing from connection hash table")); + + vol->magic = -1; + VIR_FREE(vol->name); + VIR_FREE(vol->pool); + VIR_FREE(vol); + + DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs); + conn->refs--; + if (conn->refs == 0) { + virReleaseConnect(conn); + /* Already unlocked mutex */ + return; + } + + pthread_mutex_unlock(&conn->lock); +} + + +/** + * virUnrefStorageVol: + * @vol: the vol to unreference + * + * Unreference the vol. If the use count drops to zero, the structure is + * actually freed. + * + * Returns the reference count or -1 in case of failure. + */ +int +virUnrefStorageVol(virStorageVolPtr vol) { + int refs; + + if (!VIR_IS_CONNECTED_STORAGE_VOL(vol)) { + virLibConnError(vol->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + return(-1); + } + pthread_mutex_lock(&vol->conn->lock); + DEBUG("unref vol %p %s %d", vol, vol->name, vol->refs); + vol->refs--; + refs = vol->refs; + if (refs == 0) { + virReleaseStorageVol(vol); + /* Already unlocked mutex */ + return (0); + } + + pthread_mutex_unlock(&vol->conn->lock); + return (refs); +} diff -r 10d728ae8445 src/datatypes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/datatypes.h Wed Oct 29 20:10:40 2008 +0000 @@ -0,0 +1,212 @@ +/* + * datatypes.h: management of structs for public data types + * + * Copyright (C) 2006-2008 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __VIRT_DATATYPES_H_ +#define __VIRT_DATATYPES_H_ + +#include "internal.h" + +#include "hash.h" +#include "driver.h" + + +/** + * VIR_CONNECT_MAGIC: + * + * magic value used to protect the API when pointers to connection structures + * are passed down by the uers. + */ +#define VIR_CONNECT_MAGIC 0x4F23DEAD +#define VIR_IS_CONNECT(obj) ((obj) && (obj)->magic==VIR_CONNECT_MAGIC) + + +/** + * VIR_DOMAIN_MAGIC: + * + * magic value used to protect the API when pointers to domain structures + * are passed down by the users. + */ +#define VIR_DOMAIN_MAGIC 0xDEAD4321 +#define VIR_IS_DOMAIN(obj) ((obj) && (obj)->magic==VIR_DOMAIN_MAGIC) +#define VIR_IS_CONNECTED_DOMAIN(obj) (VIR_IS_DOMAIN(obj) && VIR_IS_CONNECT((obj)->conn)) + +/** + * VIR_NETWORK_MAGIC: + * + * magic value used to protect the API when pointers to network structures + * are passed down by the users. + */ +#define VIR_NETWORK_MAGIC 0xDEAD1234 +#define VIR_IS_NETWORK(obj) ((obj) && (obj)->magic==VIR_NETWORK_MAGIC) +#define VIR_IS_CONNECTED_NETWORK(obj) (VIR_IS_NETWORK(obj) && VIR_IS_CONNECT((obj)->conn)) + +/** + * VIR_STORAGE_POOL_MAGIC: + * + * magic value used to protect the API when pointers to storage pool structures + * are passed down by the users. + */ +#define VIR_STORAGE_POOL_MAGIC 0xDEAD5678 +#define VIR_IS_STORAGE_POOL(obj) ((obj) && (obj)->magic==VIR_STORAGE_POOL_MAGIC) +#define VIR_IS_CONNECTED_STORAGE_POOL(obj) (VIR_IS_STORAGE_POOL(obj) && VIR_IS_CONNECT((obj)->conn)) + +/** + * VIR_STORAGE_VOL_MAGIC: + * + * magic value used to protect the API when pointers to storage vol structures + * are passed down by the users. + */ +#define VIR_STORAGE_VOL_MAGIC 0xDEAD8765 +#define VIR_IS_STORAGE_VOL(obj) ((obj) && (obj)->magic==VIR_STORAGE_VOL_MAGIC) +#define VIR_IS_CONNECTED_STORAGE_VOL(obj) (VIR_IS_STORAGE_VOL(obj) && VIR_IS_CONNECT((obj)->conn)) + + +/** + * _virConnect: + * + * Internal structure associated to a connection + */ +struct _virConnect { + unsigned int magic; /* specific value to check */ + int flags; /* a set of connection flags */ + char *name; /* connection URI */ + + /* The underlying hypervisor driver and network driver. */ + virDriverPtr driver; + virNetworkDriverPtr networkDriver; + virStorageDriverPtr storageDriver; + + /* Private data pointer which can be used by driver and + * network driver as they wish. + * NB: 'private' is a reserved word in C++. + */ + void * privateData; + void * networkPrivateData; + void * storagePrivateData; + + /* Per-connection error. */ + virError err; /* the last error */ + virErrorFunc handler; /* associated handlet */ + void *userData; /* the user data */ + + /* + * The lock mutex must be acquired before accessing/changing + * any of members following this point, or changing the ref + * count of any virDomain/virNetwork object associated with + * this connection + */ + PTHREAD_MUTEX_T (lock); + virHashTablePtr domains; /* hash table for known domains */ + virHashTablePtr networks; /* hash table for known domains */ + virHashTablePtr storagePools;/* hash table for known storage pools */ + virHashTablePtr storageVols;/* hash table for known storage vols */ + int refs; /* reference count */ +}; + +/** +* _virDomain: +* +* Internal structure associated to a domain +*/ +struct _virDomain { + unsigned int magic; /* specific value to check */ + int refs; /* reference count */ + virConnectPtr conn; /* pointer back to the connection */ + char *name; /* the domain external name */ + int id; /* the domain ID */ + unsigned char uuid[VIR_UUID_BUFLEN]; /* the domain unique identifier */ +}; + +/** +* _virNetwork: +* +* Internal structure associated to a domain +*/ +struct _virNetwork { + unsigned int magic; /* specific value to check */ + int refs; /* reference count */ + virConnectPtr conn; /* pointer back to the connection */ + char *name; /* the network external name */ + unsigned char uuid[VIR_UUID_BUFLEN]; /* the network unique identifier */ +}; + +/** +* _virStoragePool: +* +* Internal structure associated to a storage pool +*/ +struct _virStoragePool { + unsigned int magic; /* specific value to check */ + int refs; /* reference count */ + virConnectPtr conn; /* pointer back to the connection */ + char *name; /* the storage pool external name */ + unsigned char uuid[VIR_UUID_BUFLEN]; /* the storage pool unique identifier */ +}; + +/** +* _virStorageVol: +* +* Internal structure associated to a storage volume +*/ +struct _virStorageVol { + unsigned int magic; /* specific value to check */ + int refs; /* reference count */ + virConnectPtr conn; /* pointer back to the connection */ + char *pool; /* Pool name of owner */ + char *name; /* the storage vol external name */ + /* XXX currently abusing path for this. Ought not to be so evil */ + char key[PATH_MAX]; /* unique key for storage vol */ +}; + +/************************************************************************ + * * + * API for domain/connections (de)allocations and lookups * + * * + ************************************************************************/ + +virConnectPtr virGetConnect(void); +int virUnrefConnect(virConnectPtr conn); +virDomainPtr __virGetDomain(virConnectPtr conn, + const char *name, + const unsigned char *uuid); +int virUnrefDomain(virDomainPtr domain); +virNetworkPtr __virGetNetwork(virConnectPtr conn, + const char *name, + const unsigned char *uuid); +int virUnrefNetwork(virNetworkPtr network); + +virStoragePoolPtr __virGetStoragePool(virConnectPtr conn, + const char *name, + const unsigned char *uuid); +int virUnrefStoragePool(virStoragePoolPtr pool); +virStorageVolPtr __virGetStorageVol(virConnectPtr conn, + const char *pool, + const char *name, + const char *key); +int virUnrefStorageVol(virStorageVolPtr vol); + +#define virGetDomain(c,n,u) __virGetDomain((c),(n),(u)) +#define virGetNetwork(c,n,u) __virGetNetwork((c),(n),(u)) +#define virGetStoragePool(c,n,u) __virGetStoragePool((c),(n),(u)) +#define virGetStorageVol(c,p,n,u) __virGetStorageVol((c),(p),(n),(u)) + + +#endif diff -r 10d728ae8445 src/domain_conf.c --- a/src/domain_conf.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/domain_conf.c Wed Oct 29 20:10:40 2008 +0000 @@ -30,6 +30,7 @@ #include <dirent.h> #include "virterror_internal.h" +#include "datatypes.h" #include "domain_conf.h" #include "memory.h" #include "verify.h" diff -r 10d728ae8445 src/domain_conf.h --- a/src/domain_conf.h Wed Oct 29 20:09:50 2008 +0000 +++ b/src/domain_conf.h Wed Oct 29 20:10:40 2008 +0000 @@ -24,7 +24,9 @@ #ifndef __DOMAIN_CONF_H #define __DOMAIN_CONF_H -#include <config.h> +#include <libxml/parser.h> +#include <libxml/tree.h> +#include <libxml/xpath.h> #include "internal.h" #include "capabilities.h" diff -r 10d728ae8445 src/driver.h --- a/src/driver.h Wed Oct 29 20:09:50 2008 +0000 +++ b/src/driver.h Wed Oct 29 20:10:40 2008 +0000 @@ -5,9 +5,6 @@ #ifndef __VIR_DRIVER_H__ #define __VIR_DRIVER_H__ - -#include "libvirt/libvirt.h" -#include "libvirt/virterror.h" #include <libxml/uri.h> diff -r 10d728ae8445 src/hash.c --- a/src/hash.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/hash.c Wed Oct 29 20:10:40 2008 +0000 @@ -594,728 +594,3 @@ return (NULL); } -/************************************************************************ - * * - * Domain and Connections allocations * - * * - ************************************************************************/ - -/** - * virDomainFreeName: - * @domain: a domain object - * - * Destroy the domain object, this is just used by the domain hash callback. - * - * Returns 0 in case of success and -1 in case of failure. - */ -static int -virDomainFreeName(virDomainPtr domain, const char *name ATTRIBUTE_UNUSED) -{ - return (virDomainFree(domain)); -} - -/** - * virNetworkFreeName: - * @network: a network object - * - * Destroy the network object, this is just used by the network hash callback. - * - * Returns 0 in case of success and -1 in case of failure. - */ -static int -virNetworkFreeName(virNetworkPtr network, const char *name ATTRIBUTE_UNUSED) -{ - return (virNetworkFree(network)); -} - -/** - * virStoragePoolFreeName: - * @pool: a pool object - * - * Destroy the pool object, this is just used by the pool hash callback. - * - * Returns 0 in case of success and -1 in case of failure. - */ -static int -virStoragePoolFreeName(virStoragePoolPtr pool, const char *name ATTRIBUTE_UNUSED) -{ - return (virStoragePoolFree(pool)); -} - -/** - * virStorageVolFreeName: - * @vol: a vol object - * - * Destroy the vol object, this is just used by the vol hash callback. - * - * Returns 0 in case of success and -1 in case of failure. - */ -static int -virStorageVolFreeName(virStorageVolPtr vol, const char *name ATTRIBUTE_UNUSED) -{ - return (virStorageVolFree(vol)); -} - -/** - * virGetConnect: - * - * Allocates a new hypervisor connection structure - * - * Returns a new pointer or NULL in case of error. - */ -virConnectPtr -virGetConnect(void) { - virConnectPtr ret; - - if (VIR_ALLOC(ret) < 0) { - virHashError(NULL, VIR_ERR_NO_MEMORY, "%s", _("allocating connection")); - goto failed; - } - ret->magic = VIR_CONNECT_MAGIC; - ret->driver = NULL; - ret->networkDriver = NULL; - ret->privateData = NULL; - ret->networkPrivateData = NULL; - ret->domains = virHashCreate(20); - if (ret->domains == NULL) - goto failed; - ret->networks = virHashCreate(20); - if (ret->networks == NULL) - goto failed; - ret->storagePools = virHashCreate(20); - if (ret->storagePools == NULL) - goto failed; - ret->storageVols = virHashCreate(20); - if (ret->storageVols == NULL) - goto failed; - - pthread_mutex_init(&ret->lock, NULL); - - ret->refs = 1; - return(ret); - -failed: - if (ret != NULL) { - if (ret->domains != NULL) - virHashFree(ret->domains, (virHashDeallocator) virDomainFreeName); - if (ret->networks != NULL) - virHashFree(ret->networks, (virHashDeallocator) virNetworkFreeName); - if (ret->storagePools != NULL) - virHashFree(ret->storagePools, (virHashDeallocator) virStoragePoolFreeName); - if (ret->storageVols != NULL) - virHashFree(ret->storageVols, (virHashDeallocator) virStorageVolFreeName); - - pthread_mutex_destroy(&ret->lock); - VIR_FREE(ret); - } - return(NULL); -} - -/** - * virReleaseConnect: - * @conn: the hypervisor connection to release - * - * Unconditionally release all memory associated with a connection. - * The conn.lock mutex must be held prior to calling this, and will - * be released prior to this returning. The connection obj must not - * be used once this method returns. - */ -static void -virReleaseConnect(virConnectPtr conn) { - DEBUG("release connection %p %s", conn, conn->name); - if (conn->domains != NULL) - virHashFree(conn->domains, (virHashDeallocator) virDomainFreeName); - if (conn->networks != NULL) - virHashFree(conn->networks, (virHashDeallocator) virNetworkFreeName); - if (conn->storagePools != NULL) - virHashFree(conn->storagePools, (virHashDeallocator) virStoragePoolFreeName); - if (conn->storageVols != NULL) - virHashFree(conn->storageVols, (virHashDeallocator) virStorageVolFreeName); - - virResetError(&conn->err); - if (virLastErr.conn == conn) - virLastErr.conn = NULL; - - VIR_FREE(conn->name); - - pthread_mutex_unlock(&conn->lock); - pthread_mutex_destroy(&conn->lock); - VIR_FREE(conn); -} - -/** - * virUnrefConnect: - * @conn: the hypervisor connection to unreference - * - * Unreference the connection. If the use count drops to zero, the structure is - * actually freed. - * - * Returns the reference count or -1 in case of failure. - */ -int -virUnrefConnect(virConnectPtr conn) { - int refs; - - if ((!VIR_IS_CONNECT(conn))) { - virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); - return(-1); - } - pthread_mutex_lock(&conn->lock); - DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs); - conn->refs--; - refs = conn->refs; - if (refs == 0) { - virReleaseConnect(conn); - /* Already unlocked mutex */ - return (0); - } - pthread_mutex_unlock(&conn->lock); - return (refs); -} - -/** - * virGetDomain: - * @conn: the hypervisor connection - * @name: pointer to the domain name - * @uuid: pointer to the uuid - * - * Lookup if the domain is already registered for that connection, - * if yes return a new pointer to it, if no allocate a new structure, - * and register it in the table. In any case a corresponding call to - * virUnrefDomain() is needed to not leak data. - * - * Returns a pointer to the domain, or NULL in case of failure - */ -virDomainPtr -__virGetDomain(virConnectPtr conn, const char *name, const unsigned char *uuid) { - virDomainPtr ret = NULL; - - if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) { - virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); - return(NULL); - } - pthread_mutex_lock(&conn->lock); - - /* TODO search by UUID first as they are better differenciators */ - - ret = (virDomainPtr) virHashLookup(conn->domains, name); - /* TODO check the UUID */ - if (ret == NULL) { - if (VIR_ALLOC(ret) < 0) { - virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating domain")); - goto error; - } - ret->name = strdup(name); - if (ret->name == NULL) { - virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating domain")); - goto error; - } - ret->magic = VIR_DOMAIN_MAGIC; - ret->conn = conn; - ret->id = -1; - if (uuid != NULL) - memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN); - - if (virHashAddEntry(conn->domains, name, ret) < 0) { - virHashError(conn, VIR_ERR_INTERNAL_ERROR, - "%s", _("failed to add domain to connection hash table")); - goto error; - } - conn->refs++; - DEBUG("New hash entry %p", ret); - } else { - DEBUG("Existing hash entry %p: refs now %d", ret, ret->refs+1); - } - ret->refs++; - pthread_mutex_unlock(&conn->lock); - return(ret); - - error: - pthread_mutex_unlock(&conn->lock); - if (ret != NULL) { - VIR_FREE(ret->name); - VIR_FREE(ret); - } - return(NULL); -} - -/** - * virReleaseDomain: - * @domain: the domain to release - * - * Unconditionally release all memory associated with a domain. - * The conn.lock mutex must be held prior to calling this, and will - * be released prior to this returning. The domain obj must not - * be used once this method returns. - * - * It will also unreference the associated connection object, - * which may also be released if its ref count hits zero. - */ -static void -virReleaseDomain(virDomainPtr domain) { - virConnectPtr conn = domain->conn; - DEBUG("release domain %p %s", domain, domain->name); - - /* TODO search by UUID first as they are better differenciators */ - if (virHashRemoveEntry(conn->domains, domain->name, NULL) < 0) - virHashError(conn, VIR_ERR_INTERNAL_ERROR, - "%s", _("domain missing from connection hash table")); - - if (conn->err.dom == domain) - conn->err.dom = NULL; - if (virLastErr.dom == domain) - virLastErr.dom = NULL; - domain->magic = -1; - domain->id = -1; - VIR_FREE(domain->name); - VIR_FREE(domain); - - DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs); - conn->refs--; - if (conn->refs == 0) { - virReleaseConnect(conn); - /* Already unlocked mutex */ - return; - } - - pthread_mutex_unlock(&conn->lock); -} - - -/** - * virUnrefDomain: - * @domain: the domain to unreference - * - * Unreference the domain. If the use count drops to zero, the structure is - * actually freed. - * - * Returns the reference count or -1 in case of failure. - */ -int -virUnrefDomain(virDomainPtr domain) { - int refs; - - if (!VIR_IS_CONNECTED_DOMAIN(domain)) { - virHashError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); - return(-1); - } - pthread_mutex_lock(&domain->conn->lock); - DEBUG("unref domain %p %s %d", domain, domain->name, domain->refs); - domain->refs--; - refs = domain->refs; - if (refs == 0) { - virReleaseDomain(domain); - /* Already unlocked mutex */ - return (0); - } - - pthread_mutex_unlock(&domain->conn->lock); - return (refs); -} - -/** - * virGetNetwork: - * @conn: the hypervisor connection - * @name: pointer to the network name - * @uuid: pointer to the uuid - * - * Lookup if the network is already registered for that connection, - * if yes return a new pointer to it, if no allocate a new structure, - * and register it in the table. In any case a corresponding call to - * virUnrefNetwork() is needed to not leak data. - * - * Returns a pointer to the network, or NULL in case of failure - */ -virNetworkPtr -__virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid) { - virNetworkPtr ret = NULL; - - if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) { - virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); - return(NULL); - } - pthread_mutex_lock(&conn->lock); - - /* TODO search by UUID first as they are better differenciators */ - - ret = (virNetworkPtr) virHashLookup(conn->networks, name); - /* TODO check the UUID */ - if (ret == NULL) { - if (VIR_ALLOC(ret) < 0) { - virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating network")); - goto error; - } - ret->name = strdup(name); - if (ret->name == NULL) { - virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating network")); - goto error; - } - ret->magic = VIR_NETWORK_MAGIC; - ret->conn = conn; - if (uuid != NULL) - memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN); - - if (virHashAddEntry(conn->networks, name, ret) < 0) { - virHashError(conn, VIR_ERR_INTERNAL_ERROR, - "%s", _("failed to add network to connection hash table")); - goto error; - } - conn->refs++; - } - ret->refs++; - pthread_mutex_unlock(&conn->lock); - return(ret); - - error: - pthread_mutex_unlock(&conn->lock); - if (ret != NULL) { - VIR_FREE(ret->name); - VIR_FREE(ret); - } - return(NULL); -} - -/** - * virReleaseNetwork: - * @network: the network to release - * - * Unconditionally release all memory associated with a network. - * The conn.lock mutex must be held prior to calling this, and will - * be released prior to this returning. The network obj must not - * be used once this method returns. - * - * It will also unreference the associated connection object, - * which may also be released if its ref count hits zero. - */ -static void -virReleaseNetwork(virNetworkPtr network) { - virConnectPtr conn = network->conn; - DEBUG("release network %p %s", network, network->name); - - /* TODO search by UUID first as they are better differenciators */ - if (virHashRemoveEntry(conn->networks, network->name, NULL) < 0) - virHashError(conn, VIR_ERR_INTERNAL_ERROR, - "%s", _("network missing from connection hash table")); - - if (conn->err.net == network) - conn->err.net = NULL; - if (virLastErr.net == network) - virLastErr.net = NULL; - - network->magic = -1; - VIR_FREE(network->name); - VIR_FREE(network); - - DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs); - conn->refs--; - if (conn->refs == 0) { - virReleaseConnect(conn); - /* Already unlocked mutex */ - return; - } - - pthread_mutex_unlock(&conn->lock); -} - - -/** - * virUnrefNetwork: - * @network: the network to unreference - * - * Unreference the network. If the use count drops to zero, the structure is - * actually freed. - * - * Returns the reference count or -1 in case of failure. - */ -int -virUnrefNetwork(virNetworkPtr network) { - int refs; - - if (!VIR_IS_CONNECTED_NETWORK(network)) { - virHashError(network->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); - return(-1); - } - pthread_mutex_lock(&network->conn->lock); - DEBUG("unref network %p %s %d", network, network->name, network->refs); - network->refs--; - refs = network->refs; - if (refs == 0) { - virReleaseNetwork(network); - /* Already unlocked mutex */ - return (0); - } - - pthread_mutex_unlock(&network->conn->lock); - return (refs); -} - - -/** - * virGetStoragePool: - * @conn: the hypervisor connection - * @name: pointer to the storage pool name - * @uuid: pointer to the uuid - * - * Lookup if the storage pool is already registered for that connection, - * if yes return a new pointer to it, if no allocate a new structure, - * and register it in the table. In any case a corresponding call to - * virFreeStoragePool() is needed to not leak data. - * - * Returns a pointer to the network, or NULL in case of failure - */ -virStoragePoolPtr -__virGetStoragePool(virConnectPtr conn, const char *name, const unsigned char *uuid) { - virStoragePoolPtr ret = NULL; - - if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) { - virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); - return(NULL); - } - pthread_mutex_lock(&conn->lock); - - /* TODO search by UUID first as they are better differenciators */ - - ret = (virStoragePoolPtr) virHashLookup(conn->storagePools, name); - /* TODO check the UUID */ - if (ret == NULL) { - if (VIR_ALLOC(ret) < 0) { - virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage pool")); - goto error; - } - ret->name = strdup(name); - if (ret->name == NULL) { - virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage pool")); - goto error; - } - ret->magic = VIR_STORAGE_POOL_MAGIC; - ret->conn = conn; - if (uuid != NULL) - memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN); - - if (virHashAddEntry(conn->storagePools, name, ret) < 0) { - virHashError(conn, VIR_ERR_INTERNAL_ERROR, - "%s", _("failed to add storage pool to connection hash table")); - goto error; - } - conn->refs++; - } - ret->refs++; - pthread_mutex_unlock(&conn->lock); - return(ret); - -error: - pthread_mutex_unlock(&conn->lock); - if (ret != NULL) { - VIR_FREE(ret->name); - VIR_FREE(ret); - } - return(NULL); -} - - -/** - * virReleaseStoragePool: - * @pool: the pool to release - * - * Unconditionally release all memory associated with a pool. - * The conn.lock mutex must be held prior to calling this, and will - * be released prior to this returning. The pool obj must not - * be used once this method returns. - * - * It will also unreference the associated connection object, - * which may also be released if its ref count hits zero. - */ -static void -virReleaseStoragePool(virStoragePoolPtr pool) { - virConnectPtr conn = pool->conn; - DEBUG("release pool %p %s", pool, pool->name); - - /* TODO search by UUID first as they are better differenciators */ - if (virHashRemoveEntry(conn->storagePools, pool->name, NULL) < 0) - virHashError(conn, VIR_ERR_INTERNAL_ERROR, - "%s", _("pool missing from connection hash table")); - - pool->magic = -1; - VIR_FREE(pool->name); - VIR_FREE(pool); - - DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs); - conn->refs--; - if (conn->refs == 0) { - virReleaseConnect(conn); - /* Already unlocked mutex */ - return; - } - - pthread_mutex_unlock(&conn->lock); -} - - -/** - * virUnrefStoragePool: - * @pool: the pool to unreference - * - * Unreference the pool. If the use count drops to zero, the structure is - * actually freed. - * - * Returns the reference count or -1 in case of failure. - */ -int -virUnrefStoragePool(virStoragePoolPtr pool) { - int refs; - - if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) { - virHashError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); - return(-1); - } - pthread_mutex_lock(&pool->conn->lock); - DEBUG("unref pool %p %s %d", pool, pool->name, pool->refs); - pool->refs--; - refs = pool->refs; - if (refs == 0) { - virReleaseStoragePool(pool); - /* Already unlocked mutex */ - return (0); - } - - pthread_mutex_unlock(&pool->conn->lock); - return (refs); -} - - -/** - * virGetStorageVol: - * @conn: the hypervisor connection - * @pool: pool owning the volume - * @name: pointer to the storage vol name - * @uuid: pointer to the uuid - * - * Lookup if the storage vol is already registered for that connection, - * if yes return a new pointer to it, if no allocate a new structure, - * and register it in the table. In any case a corresponding call to - * virFreeStorageVol() is needed to not leak data. - * - * Returns a pointer to the storage vol, or NULL in case of failure - */ -virStorageVolPtr -__virGetStorageVol(virConnectPtr conn, const char *pool, const char *name, const char *key) { - virStorageVolPtr ret = NULL; - - if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (key == NULL)) { - virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); - return(NULL); - } - pthread_mutex_lock(&conn->lock); - - ret = (virStorageVolPtr) virHashLookup(conn->storageVols, key); - if (ret == NULL) { - if (VIR_ALLOC(ret) < 0) { - virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage vol")); - goto error; - } - ret->pool = strdup(pool); - if (ret->pool == NULL) { - virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage vol")); - goto error; - } - ret->name = strdup(name); - if (ret->name == NULL) { - virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage vol")); - goto error; - } - strncpy(ret->key, key, sizeof(ret->key)-1); - ret->key[sizeof(ret->key)-1] = '\0'; - ret->magic = VIR_STORAGE_VOL_MAGIC; - ret->conn = conn; - - if (virHashAddEntry(conn->storageVols, key, ret) < 0) { - virHashError(conn, VIR_ERR_INTERNAL_ERROR, - "%s", _("failed to add storage vol to connection hash table")); - goto error; - } - conn->refs++; - } - ret->refs++; - pthread_mutex_unlock(&conn->lock); - return(ret); - -error: - pthread_mutex_unlock(&conn->lock); - if (ret != NULL) { - VIR_FREE(ret->name); - VIR_FREE(ret->pool); - VIR_FREE(ret); - } - return(NULL); -} - - -/** - * virReleaseStorageVol: - * @vol: the vol to release - * - * Unconditionally release all memory associated with a vol. - * The conn.lock mutex must be held prior to calling this, and will - * be released prior to this returning. The vol obj must not - * be used once this method returns. - * - * It will also unreference the associated connection object, - * which may also be released if its ref count hits zero. - */ -static void -virReleaseStorageVol(virStorageVolPtr vol) { - virConnectPtr conn = vol->conn; - DEBUG("release vol %p %s", vol, vol->name); - - /* TODO search by UUID first as they are better differenciators */ - if (virHashRemoveEntry(conn->storageVols, vol->key, NULL) < 0) - virHashError(conn, VIR_ERR_INTERNAL_ERROR, - "%s", _("vol missing from connection hash table")); - - vol->magic = -1; - VIR_FREE(vol->name); - VIR_FREE(vol->pool); - VIR_FREE(vol); - - DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs); - conn->refs--; - if (conn->refs == 0) { - virReleaseConnect(conn); - /* Already unlocked mutex */ - return; - } - - pthread_mutex_unlock(&conn->lock); -} - - -/** - * virUnrefStorageVol: - * @vol: the vol to unreference - * - * Unreference the vol. If the use count drops to zero, the structure is - * actually freed. - * - * Returns the reference count or -1 in case of failure. - */ -int -virUnrefStorageVol(virStorageVolPtr vol) { - int refs; - - if (!VIR_IS_CONNECTED_STORAGE_VOL(vol)) { - virHashError(vol->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); - return(-1); - } - pthread_mutex_lock(&vol->conn->lock); - DEBUG("unref vol %p %s %d", vol, vol->name, vol->refs); - vol->refs--; - refs = vol->refs; - if (refs == 0) { - virReleaseStorageVol(vol); - /* Already unlocked mutex */ - return (0); - } - - pthread_mutex_unlock(&vol->conn->lock); - return (refs); -} diff -r 10d728ae8445 src/internal.h --- a/src/internal.h Wed Oct 29 20:09:50 2008 +0000 +++ b/src/internal.h Wed Oct 29 20:10:40 2008 +0000 @@ -33,10 +33,8 @@ #include "gettext.h" -#include "hash.h" #include "libvirt/libvirt.h" #include "libvirt/virterror.h" -#include "driver.h" /* On architectures which lack these limits, define them (ie. Cygwin). * Note that the libvirt code should be robust enough to handle the @@ -142,210 +140,6 @@ __FILE__, __LINE__); /** - * VIR_CONNECT_MAGIC: - * - * magic value used to protect the API when pointers to connection structures - * are passed down by the uers. - */ -#define VIR_CONNECT_MAGIC 0x4F23DEAD -#define VIR_IS_CONNECT(obj) ((obj) && (obj)->magic==VIR_CONNECT_MAGIC) - - -/** - * VIR_DOMAIN_MAGIC: - * - * magic value used to protect the API when pointers to domain structures - * are passed down by the users. - */ -#define VIR_DOMAIN_MAGIC 0xDEAD4321 -#define VIR_IS_DOMAIN(obj) ((obj) && (obj)->magic==VIR_DOMAIN_MAGIC) -#define VIR_IS_CONNECTED_DOMAIN(obj) (VIR_IS_DOMAIN(obj) && VIR_IS_CONNECT((obj)->conn)) - -/** - * VIR_NETWORK_MAGIC: - * - * magic value used to protect the API when pointers to network structures - * are passed down by the users. - */ -#define VIR_NETWORK_MAGIC 0xDEAD1234 -#define VIR_IS_NETWORK(obj) ((obj) && (obj)->magic==VIR_NETWORK_MAGIC) -#define VIR_IS_CONNECTED_NETWORK(obj) (VIR_IS_NETWORK(obj) && VIR_IS_CONNECT((obj)->conn)) - -/** - * VIR_STORAGE_POOL_MAGIC: - * - * magic value used to protect the API when pointers to storage pool structures - * are passed down by the users. - */ -#define VIR_STORAGE_POOL_MAGIC 0xDEAD5678 -#define VIR_IS_STORAGE_POOL(obj) ((obj) && (obj)->magic==VIR_STORAGE_POOL_MAGIC) -#define VIR_IS_CONNECTED_STORAGE_POOL(obj) (VIR_IS_STORAGE_POOL(obj) && VIR_IS_CONNECT((obj)->conn)) - -/** - * VIR_STORAGE_VOL_MAGIC: - * - * magic value used to protect the API when pointers to storage vol structures - * are passed down by the users. - */ -#define VIR_STORAGE_VOL_MAGIC 0xDEAD8765 -#define VIR_IS_STORAGE_VOL(obj) ((obj) && (obj)->magic==VIR_STORAGE_VOL_MAGIC) -#define VIR_IS_CONNECTED_STORAGE_VOL(obj) (VIR_IS_STORAGE_VOL(obj) && VIR_IS_CONNECT((obj)->conn)) - -/* - * arbitrary limitations - */ -#define MAX_DRIVERS 10 -#define MIN_XEN_GUEST_SIZE 64 /* 64 megabytes */ - -/** - * _virConnect: - * - * Internal structure associated to a connection - */ -struct _virConnect { - unsigned int magic; /* specific value to check */ - int flags; /* a set of connection flags */ - char *name; /* connection URI */ - - /* The underlying hypervisor driver and network driver. */ - virDriverPtr driver; - virNetworkDriverPtr networkDriver; - virStorageDriverPtr storageDriver; - - /* Private data pointer which can be used by driver and - * network driver as they wish. - * NB: 'private' is a reserved word in C++. - */ - void * privateData; - void * networkPrivateData; - void * storagePrivateData; - - /* Per-connection error. */ - virError err; /* the last error */ - virErrorFunc handler; /* associated handlet */ - void *userData; /* the user data */ - - /* - * The lock mutex must be acquired before accessing/changing - * any of members following this point, or changing the ref - * count of any virDomain/virNetwork object associated with - * this connection - */ - PTHREAD_MUTEX_T (lock); - virHashTablePtr domains; /* hash table for known domains */ - virHashTablePtr networks; /* hash table for known domains */ - virHashTablePtr storagePools;/* hash table for known storage pools */ - virHashTablePtr storageVols;/* hash table for known storage vols */ - int refs; /* reference count */ -}; - -/** -* _virDomain: -* -* Internal structure associated to a domain -*/ -struct _virDomain { - unsigned int magic; /* specific value to check */ - int refs; /* reference count */ - virConnectPtr conn; /* pointer back to the connection */ - char *name; /* the domain external name */ - int id; /* the domain ID */ - unsigned char uuid[VIR_UUID_BUFLEN]; /* the domain unique identifier */ -}; - -/** -* _virNetwork: -* -* Internal structure associated to a domain -*/ -struct _virNetwork { - unsigned int magic; /* specific value to check */ - int refs; /* reference count */ - virConnectPtr conn; /* pointer back to the connection */ - char *name; /* the network external name */ - unsigned char uuid[VIR_UUID_BUFLEN]; /* the network unique identifier */ -}; - -/** -* _virStoragePool: -* -* Internal structure associated to a storage pool -*/ -struct _virStoragePool { - unsigned int magic; /* specific value to check */ - int refs; /* reference count */ - virConnectPtr conn; /* pointer back to the connection */ - char *name; /* the storage pool external name */ - unsigned char uuid[VIR_UUID_BUFLEN]; /* the storage pool unique identifier */ -}; - -/** -* _virStorageVol: -* -* Internal structure associated to a storage volume -*/ -struct _virStorageVol { - unsigned int magic; /* specific value to check */ - int refs; /* reference count */ - virConnectPtr conn; /* pointer back to the connection */ - char *pool; /* Pool name of owner */ - char *name; /* the storage vol external name */ - /* XXX currently abusing path for this. Ought not to be so evil */ - char key[PATH_MAX]; /* unique key for storage vol */ -}; - - - -/************************************************************************ - * * - * API for domain/connections (de)allocations and lookups * - * * - ************************************************************************/ - -virConnectPtr virGetConnect (void); -int virUnrefConnect (virConnectPtr conn); -virDomainPtr __virGetDomain (virConnectPtr conn, - const char *name, - const unsigned char *uuid); -int virUnrefDomain (virDomainPtr domain); -virNetworkPtr __virGetNetwork (virConnectPtr conn, - const char *name, - const unsigned char *uuid); -int virUnrefNetwork (virNetworkPtr network); - -virStoragePoolPtr __virGetStoragePool (virConnectPtr conn, - const char *name, - const unsigned char *uuid); -int virUnrefStoragePool (virStoragePoolPtr pool); -virStorageVolPtr __virGetStorageVol (virConnectPtr conn, - const char *pool, - const char *name, - const char *key); -int virUnrefStorageVol (virStorageVolPtr vol); - -#define virGetDomain(c,n,u) __virGetDomain((c),(n),(u)) -#define virGetNetwork(c,n,u) __virGetNetwork((c),(n),(u)) -#define virGetStoragePool(c,n,u) __virGetStoragePool((c),(n),(u)) -#define virGetStorageVol(c,p,n,u) __virGetStorageVol((c),(p),(n),(u)) - -#ifdef WITH_LIBVIRTD -int __virStateInitialize(void); -int __virStateCleanup(void); -int __virStateReload(void); -int __virStateActive(void); -#define virStateInitialize() __virStateInitialize() -#define virStateCleanup() __virStateCleanup() -#define virStateReload() __virStateReload() -#define virStateActive() __virStateActive() -#endif - -int __virDrvSupportsFeature (virConnectPtr conn, int feature); - -int __virDomainMigratePrepare (virConnectPtr dconn, char **cookie, int *cookielen, const char *uri_in, char **uri_out, unsigned long flags, const char *dname, unsigned long bandwidth); -int __virDomainMigratePerform (virDomainPtr domain, const char *cookie, int cookielen, const char *uri, unsigned long flags, const char *dname, unsigned long bandwidth); -virDomainPtr __virDomainMigrateFinish (virConnectPtr dconn, const char *dname, const char *cookie, int cookielen, const char *uri, unsigned long flags); - -/** * Domain Event Notification */ diff -r 10d728ae8445 src/libvirt.c --- a/src/libvirt.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/libvirt.c Wed Oct 29 20:10:40 2008 +0000 @@ -32,6 +32,8 @@ #endif #include "virterror_internal.h" +#include "datatypes.h" +#include "libvirt_internal.h" #include "driver.h" #include "uuid.h" @@ -66,6 +68,8 @@ * - use lock to protect against concurrent accesses ? * - use reference counting to guarantee coherent pointer state ? */ + +#define MAX_DRIVERS 10 static virDriverPtr virDriverTab[MAX_DRIVERS]; static int virDriverTabCount = 0; @@ -5560,3 +5564,5 @@ return 0; } + + diff -r 10d728ae8445 src/libvirt_internal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/libvirt_internal.h Wed Oct 29 20:10:40 2008 +0000 @@ -0,0 +1,64 @@ +/* + * libvirt.h: publically exported APIs, not for public use + * + * Copyright (C) 2006-2008 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __LIBVIRT_H_ +#define __LIBVIRT_H_ + +#include "internal.h" + + +#ifdef WITH_LIBVIRTD +int __virStateInitialize(void); +int __virStateCleanup(void); +int __virStateReload(void); +int __virStateActive(void); +#define virStateInitialize() __virStateInitialize() +#define virStateCleanup() __virStateCleanup() +#define virStateReload() __virStateReload() +#define virStateActive() __virStateActive() +#endif + +int __virDrvSupportsFeature (virConnectPtr conn, int feature); + +int __virDomainMigratePrepare (virConnectPtr dconn, + char **cookie, + int *cookielen, + const char *uri_in, + char **uri_out, + unsigned long flags, + const char *dname, + unsigned long bandwidth); +int __virDomainMigratePerform (virDomainPtr domain, + const char *cookie, + int cookielen, + const char *uri, + unsigned long flags, + const char *dname, + unsigned long bandwidth); +virDomainPtr __virDomainMigrateFinish (virConnectPtr dconn, + const char *dname, + const char *cookie, + int cookielen, + const char *uri, + unsigned long flags); + + +#endif diff -r 10d728ae8445 src/lxc_driver.c --- a/src/lxc_driver.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/lxc_driver.c Wed Oct 29 20:10:40 2008 +0000 @@ -36,6 +36,7 @@ #include <wait.h> #include "virterror_internal.h" +#include "datatypes.h" #include "lxc_conf.h" #include "lxc_container.h" #include "lxc_driver.h" diff -r 10d728ae8445 src/network_conf.c --- a/src/network_conf.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/network_conf.c Wed Oct 29 20:10:40 2008 +0000 @@ -34,6 +34,7 @@ #include <dirent.h> #include "virterror_internal.h" +#include "datatypes.h" #include "network_conf.h" #include "memory.h" #include "xml.h" diff -r 10d728ae8445 src/network_conf.h --- a/src/network_conf.h Wed Oct 29 20:09:50 2008 +0000 +++ b/src/network_conf.h Wed Oct 29 20:10:40 2008 +0000 @@ -23,6 +23,10 @@ #ifndef __NETWORK_CONF_H__ #define __NETWORK_CONF_H__ + +#include <libxml/parser.h> +#include <libxml/tree.h> +#include <libxml/xpath.h> #include "internal.h" diff -r 10d728ae8445 src/network_driver.c --- a/src/network_driver.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/network_driver.c Wed Oct 29 20:10:40 2008 +0000 @@ -45,6 +45,7 @@ #include <sys/ioctl.h> #include "virterror_internal.h" +#include "datatypes.h" #include "network_driver.h" #include "network_conf.h" #include "driver.h" diff -r 10d728ae8445 src/openvz_driver.c --- a/src/openvz_driver.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/openvz_driver.c Wed Oct 29 20:10:40 2008 +0000 @@ -48,6 +48,7 @@ #include <sys/wait.h> #include "virterror_internal.h" +#include "datatypes.h" #include "openvz_driver.h" #include "event.h" #include "buf.h" diff -r 10d728ae8445 src/proxy_internal.c --- a/src/proxy_internal.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/proxy_internal.c Wed Oct 29 20:10:40 2008 +0000 @@ -23,6 +23,7 @@ #include <string.h> #include "virterror_internal.h" +#include "datatypes.h" #include "driver.h" #include "proxy_internal.h" #include "util.h" diff -r 10d728ae8445 src/proxy_internal.h --- a/src/proxy_internal.h Wed Oct 29 20:09:50 2008 +0000 +++ b/src/proxy_internal.h Wed Oct 29 20:10:40 2008 +0000 @@ -12,7 +12,7 @@ #ifndef __LIBVIR_PROXY_H__ #define __LIBVIR_PROXY_H__ -#include "libvirt/libvirt.h" +#include "internal.h" #define PROXY_SOCKET_PATH "/tmp/livirt_proxy_conn" #define PROXY_PROTO_VERSION 1 diff -r 10d728ae8445 src/qemu_driver.c --- a/src/qemu_driver.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/qemu_driver.c Wed Oct 29 20:10:40 2008 +0000 @@ -53,6 +53,7 @@ #endif #include "virterror_internal.h" +#include "datatypes.h" #include "qemu_driver.h" #include "qemu_conf.h" #include "c-ctype.h" diff -r 10d728ae8445 src/qparams.c --- a/src/qparams.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/qparams.c Wed Oct 29 20:10:40 2008 +0000 @@ -25,6 +25,8 @@ #include <stdio.h> #include <stdlib.h> #include <stdarg.h> + +#include <libxml/uri.h> #include "virterror_internal.h" #include "buf.h" diff -r 10d728ae8445 src/remote_internal.c --- a/src/remote_internal.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/remote_internal.c Wed Oct 29 20:10:40 2008 +0000 @@ -74,6 +74,7 @@ #endif #include "virterror_internal.h" +#include "datatypes.h" #include "driver.h" #include "buf.h" #include "qparams.h" diff -r 10d728ae8445 src/stats_linux.c --- a/src/stats_linux.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/stats_linux.c Wed Oct 29 20:10:40 2008 +0000 @@ -25,6 +25,7 @@ #endif #include "virterror_internal.h" +#include "datatypes.h" #include "util.h" #include "xen_unified.h" #include "stats_linux.h" diff -r 10d728ae8445 src/storage_conf.c --- a/src/storage_conf.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/storage_conf.c Wed Oct 29 20:10:40 2008 +0000 @@ -23,11 +23,6 @@ #include <config.h> -#include <libxml/parser.h> -#include <libxml/tree.h> -#include <libxml/xpath.h> -#include <libxml/uri.h> - #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> @@ -39,6 +34,7 @@ #include <string.h> #include "virterror_internal.h" +#include "datatypes.h" #include "storage_conf.h" #include "storage_backend.h" #include "xml.h" diff -r 10d728ae8445 src/storage_conf.h --- a/src/storage_conf.h Wed Oct 29 20:09:50 2008 +0000 +++ b/src/storage_conf.h Wed Oct 29 20:10:40 2008 +0000 @@ -24,7 +24,10 @@ #ifndef __VIR_STORAGE_CONF_H__ #define __VIR_STORAGE_CONF_H__ -#include <libvirt/libvirt.h> +#include <libxml/parser.h> +#include <libxml/tree.h> +#include <libxml/xpath.h> + #include "internal.h" /* Shared structs */ diff -r 10d728ae8445 src/storage_driver.c --- a/src/storage_driver.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/storage_driver.c Wed Oct 29 20:10:40 2008 +0000 @@ -33,6 +33,7 @@ #include <string.h> #include "virterror_internal.h" +#include "datatypes.h" #include "driver.h" #include "util.h" #include "storage_driver.h" diff -r 10d728ae8445 src/test.c --- a/src/test.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/test.c Wed Oct 29 20:10:40 2008 +0000 @@ -32,6 +32,7 @@ #include "virterror_internal.h" +#include "datatypes.h" #include "test.h" #include "buf.h" #include "util.h" diff -r 10d728ae8445 src/uuid.c --- a/src/uuid.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/uuid.c Wed Oct 29 20:10:40 2008 +0000 @@ -26,6 +26,7 @@ #include <errno.h> #include <fcntl.h> #include <stdlib.h> +#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> diff -r 10d728ae8445 src/veth.c --- a/src/veth.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/veth.c Wed Oct 29 20:10:40 2008 +0000 @@ -12,6 +12,7 @@ #include <config.h> #include <string.h> +#include <stdio.h> #include "veth.h" #include "internal.h" diff -r 10d728ae8445 src/virterror.c --- a/src/virterror.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/virterror.c Wed Oct 29 20:10:40 2008 +0000 @@ -16,6 +16,7 @@ #include <stdarg.h> #include "virterror_internal.h" +#include "datatypes.h" virError virLastErr = /* the last error */ { .code = 0, .domain = 0, .message = NULL, .level = VIR_ERR_NONE, diff -r 10d728ae8445 src/xen_internal.c --- a/src/xen_internal.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/xen_internal.c Wed Oct 29 20:10:40 2008 +0000 @@ -41,6 +41,7 @@ #include <xen/sched.h> #include "virterror_internal.h" +#include "datatypes.h" #include "driver.h" #include "util.h" #include "xen_unified.h" diff -r 10d728ae8445 src/xen_internal.h --- a/src/xen_internal.h Wed Oct 29 20:09:50 2008 +0000 +++ b/src/xen_internal.h Wed Oct 29 20:10:40 2008 +0000 @@ -10,6 +10,8 @@ #ifndef __VIR_XEN_INTERNAL_H__ #define __VIR_XEN_INTERNAL_H__ + +#include <libxml/uri.h> #include "internal.h" #include "capabilities.h" diff -r 10d728ae8445 src/xen_unified.c --- a/src/xen_unified.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/xen_unified.c Wed Oct 29 20:10:40 2008 +0000 @@ -28,7 +28,7 @@ #include <libxml/uri.h> #include "virterror_internal.h" - +#include "datatypes.h" #include "xen_unified.h" #include "xen_internal.h" diff -r 10d728ae8445 src/xen_unified.h --- a/src/xen_unified.h Wed Oct 29 20:09:50 2008 +0000 +++ b/src/xen_unified.h Wed Oct 29 20:10:40 2008 +0000 @@ -13,6 +13,7 @@ #include "internal.h" #include "capabilities.h" +#include "driver.h" #ifndef HAVE_WINSOCK2_H #include <sys/un.h> @@ -29,6 +30,8 @@ #define XEN_UNIFIED_XS_OFFSET 3 #define XEN_UNIFIED_XM_OFFSET 4 #define XEN_UNIFIED_NR_DRIVERS 5 + +#define MIN_XEN_GUEST_SIZE 64 /* 64 megabytes */ /* _xenUnifiedDriver: * diff -r 10d728ae8445 src/xend_internal.c --- a/src/xend_internal.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/xend_internal.c Wed Oct 29 20:10:40 2008 +0000 @@ -33,6 +33,7 @@ #include <errno.h> #include "virterror_internal.h" +#include "datatypes.h" #include "xend_internal.h" #include "driver.h" #include "util.h" diff -r 10d728ae8445 src/xend_internal.h --- a/src/xend_internal.h Wed Oct 29 20:09:50 2008 +0000 +++ b/src/xend_internal.h Wed Oct 29 20:10:40 2008 +0000 @@ -19,6 +19,7 @@ #include <sys/types.h> #include <stdint.h> #include <stdbool.h> +#include <libxml/uri.h> #include "internal.h" #include "capabilities.h" diff -r 10d728ae8445 src/xm_internal.c --- a/src/xm_internal.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/xm_internal.c Wed Oct 29 20:10:40 2008 +0000 @@ -36,6 +36,7 @@ #include <xen/dom0_ops.h> #include "virterror_internal.h" +#include "datatypes.h" #include "xm_internal.h" #include "xen_unified.h" #include "xend_internal.h" diff -r 10d728ae8445 src/xs_internal.c --- a/src/xs_internal.c Wed Oct 29 20:09:50 2008 +0000 +++ b/src/xs_internal.c Wed Oct 29 20:10:40 2008 +0000 @@ -27,6 +27,7 @@ #include <xs.h> #include "virterror_internal.h" +#include "datatypes.h" #include "driver.h" #include "xen_unified.h" #include "xs_internal.h" diff -r 10d728ae8445 tests/xmconfigtest.c --- a/tests/xmconfigtest.c Wed Oct 29 20:09:50 2008 +0000 +++ b/tests/xmconfigtest.c Wed Oct 29 20:10:40 2008 +0000 @@ -30,6 +30,7 @@ #ifdef WITH_XEN #include "internal.h" +#include "datatypes.h" #include "xen_unified.h" #include "xm_internal.h" #include "testutils.h" -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list