Wed Apr 4 15:18:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>

* src/xen_unified.c et al: Unified Xen driver.  Architecture
	  described here:
	  https://www.redhat.com/archives/libvir-list/2007-March/msg00396.html
This commit is contained in:
Richard W.M. Jones 2007-04-04 14:19:49 +00:00
parent ad8bef84d1
commit 18cd1a1e57
24 changed files with 2126 additions and 1331 deletions

View File

@ -1,3 +1,9 @@
Wed Apr 4 15:18:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/xen_unified.c et al: Unified Xen driver. Architecture
described here:
https://www.redhat.com/archives/libvir-list/2007-March/msg00396.html
Wed Apr 4 10:30:00 BST 2007 Richard W.M. Jones <rjones@redhat.com> Wed Apr 4 10:30:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* configure.in, qemud/Makefile.am: Set QEMUD_PID_FILE macro * configure.in, qemud/Makefile.am: Set QEMUD_PID_FILE macro

View File

@ -25,6 +25,7 @@
#include "xen_internal.h" #include "xen_internal.h"
#include "xend_internal.h" #include "xend_internal.h"
#include "xs_internal.h" #include "xs_internal.h"
#include "xen_unified.h"
static int fdServer = -1; static int fdServer = -1;
static int debug = 0; static int debug = 0;
@ -58,6 +59,23 @@ static int
proxyInitXen(void) { proxyInitXen(void) {
int ret; int ret;
unsigned long xenVersion2; unsigned long xenVersion2;
xenUnifiedPrivatePtr priv;
/* Allocate per-connection private data. */
priv = malloc (sizeof *priv);
if (!priv) {
fprintf(stderr, "Failed to allocate private data\n");
return(-1);
}
conn->privateData = priv;
priv->handle = -1;
priv->xendConfigVersion = -1;
priv->type = -1;
priv->len = -1;
priv->addr = NULL;
priv->xshandle = NULL;
priv->proxy = -1;
ret = xenHypervisorOpen(conn, NULL, VIR_DRV_OPEN_QUIET); ret = xenHypervisorOpen(conn, NULL, VIR_DRV_OPEN_QUIET);
if (ret < 0) { if (ret < 0) {

View File

@ -21,6 +21,7 @@ libvirt_la_SOURCES = \
hash.c hash.h \ hash.c hash.h \
test.c test.h \ test.c test.h \
xml.c xml.h \ xml.c xml.h \
xen_unified.c xen_unified.h \
xen_internal.c xen_internal.h \ xen_internal.c xen_internal.h \
xs_internal.c xs_internal.h \ xs_internal.c xs_internal.h \
xend_internal.c xend_internal.h \ xend_internal.c xend_internal.h \

View File

@ -17,13 +17,9 @@ extern "C" {
* List of registered drivers numbers * List of registered drivers numbers
*/ */
typedef enum { typedef enum {
VIR_DRV_XEN_HYPERVISOR = 1, VIR_DRV_XEN_UNIFIED = 1,
VIR_DRV_XEN_STORE = 2, VIR_DRV_TEST = 2,
VIR_DRV_XEN_DAEMON = 3, VIR_DRV_QEMU = 3,
VIR_DRV_TEST = 4,
VIR_DRV_XEN_PROXY = 5,
VIR_DRV_XEN_XM = 6,
VIR_DRV_QEMU = 7
} virDrvNo; } virDrvNo;
@ -32,10 +28,24 @@ typedef enum {
VIR_DRV_OPEN_RO = 2 VIR_DRV_OPEN_RO = 2
} virDrvOpenFlag; } virDrvOpenFlag;
typedef int /* Status codes returned from driver open call. */
(*virDrvOpen) (virConnectPtr conn, typedef enum {
const char *name, /* Opened successfully. */
int flags); VIR_DRV_OPEN_SUCCESS = 0,
/* 'name' is not for us. */
VIR_DRV_OPEN_DECLINED = -1,
/* 'name' is for us, but there was some error. virConnectOpen will
* return an error rather than continue probing the other drivers.
*/
VIR_DRV_OPEN_ERROR = -2,
} virDrvOpenStatus;
typedef virDrvOpenStatus
(*virDrvOpen) (virConnectPtr conn,
const char *name,
int flags);
typedef int typedef int
(*virDrvClose) (virConnectPtr conn); (*virDrvClose) (virConnectPtr conn);
typedef const char * typedef const char *
@ -44,7 +54,7 @@ typedef int
(*virDrvGetVersion) (virConnectPtr conn, (*virDrvGetVersion) (virConnectPtr conn,
unsigned long *hvVer); unsigned long *hvVer);
typedef int typedef int
(*virDrvGetMaxVcpus) (virConnectPtr conn); (*virDrvGetMaxVcpus) (virConnectPtr conn, const char *type);
typedef int typedef int
(*virDrvNodeGetInfo) (virConnectPtr conn, (*virDrvNodeGetInfo) (virConnectPtr conn,
virNodeInfoPtr info); virNodeInfoPtr info);
@ -155,6 +165,12 @@ typedef virDriver *virDriverPtr;
* *
* Structure associated to a virtualization driver, defining the various * Structure associated to a virtualization driver, defining the various
* entry points for it. * entry points for it.
*
* All drivers must support the following fields/methods:
* - no
* - name
* - open
* - close
*/ */
struct _virDriver { struct _virDriver {
int no; /* the number virDrvNo */ int no; /* the number virDrvNo */
@ -252,6 +268,10 @@ typedef virNetworkDriver *virNetworkDriverPtr;
* *
* Structure associated to a network virtualization driver, defining the various * Structure associated to a network virtualization driver, defining the various
* entry points for it. * entry points for it.
*
* All drivers must support the following fields/methods:
* - open
* - close
*/ */
struct _virNetworkDriver { struct _virNetworkDriver {
virDrvOpen open; virDrvOpen open;

View File

@ -665,9 +665,10 @@ virGetConnect(void) {
goto failed; goto failed;
} }
ret->magic = VIR_CONNECT_MAGIC; ret->magic = VIR_CONNECT_MAGIC;
ret->nb_drivers = 0; ret->driver = NULL;
ret->handle = -1; ret->networkDriver = NULL;
ret->qemud_fd = -1; ret->privateData = NULL;
ret->networkPrivateData = NULL;
ret->domains = virHashCreate(20); ret->domains = virHashCreate(20);
if (ret->domains == NULL) if (ret->domains == NULL)
goto failed; goto failed;

View File

@ -114,30 +114,19 @@ struct _virConnect {
unsigned int magic; /* specific value to check */ unsigned int magic; /* specific value to check */
int uses; /* reference count */ int uses; /* reference count */
/* the list of available drivers for that connection */
virDriverPtr drivers[MAX_DRIVERS];
int nb_drivers;
/* the list of available network drivers */ /* The underlying hypervisor driver and network driver. */
virNetworkDriverPtr networkDrivers[MAX_DRIVERS]; virDriverPtr driver;
int nb_network_drivers; virNetworkDriverPtr networkDriver;
/* extra data needed by drivers */ /* Private data pointer which can be used by driver and
int handle; /* internal handle used for hypercall */ * network driver as they wish.
struct xs_handle *xshandle;/* handle to talk to the xenstore */ * NB: 'private' is a reserved word in C++.
int proxy; /* file descriptor if using the proxy */ */
int xendConfigVersion; /* XenD config version */ void * privateData;
void * networkPrivateData;
/* connection to xend */ /* Per-connection error. */
int type; /* PF_UNIX or PF_INET */
int len; /* lenght of addr */
struct sockaddr *addr; /* type of address used */
struct sockaddr_un addr_un; /* the unix address */
struct sockaddr_in addr_in; /* the inet address */
int qemud_fd; /* connection to qemud */
/* error stuff */
virError err; /* the last error */ virError err; /* the last error */
virErrorFunc handler; /* associated handlet */ virErrorFunc handler; /* associated handlet */
void *userData; /* the user data */ void *userData; /* the user data */

File diff suppressed because it is too large Load Diff

View File

@ -21,6 +21,7 @@
#include "internal.h" #include "internal.h"
#include "driver.h" #include "driver.h"
#include "proxy_internal.h" #include "proxy_internal.h"
#include "xen_unified.h"
#define STANDALONE #define STANDALONE
@ -42,8 +43,8 @@ static int xenProxyDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info);
static char *xenProxyDomainDumpXML(virDomainPtr domain, int flags); static char *xenProxyDomainDumpXML(virDomainPtr domain, int flags);
static char *xenProxyDomainGetOSType(virDomainPtr domain); static char *xenProxyDomainGetOSType(virDomainPtr domain);
static virDriver xenProxyDriver = { virDriver xenProxyDriver = {
VIR_DRV_XEN_PROXY, -1,
"XenProxy", "XenProxy",
0, 0,
xenProxyOpen, /* open */ xenProxyOpen, /* open */
@ -89,14 +90,16 @@ static virDriver xenProxyDriver = {
}; };
/** /**
* xenProxyRegister: * xenProxyInit:
* *
* Registers the xenHypervisor driver * Initialise the xen proxy driver.
*/ */
void xenProxyRegister(void) int
xenProxyInit (void)
{ {
virRegisterDriver(&xenProxyDriver); return 0;
} }
/************************************************************************ /************************************************************************
* * * *
* Error handling * * Error handling *
@ -378,12 +381,29 @@ retry:
* Shutdown the Xen proxy communication layer * Shutdown the Xen proxy communication layer
*/ */
static int static int
xenProxyClose(virConnectPtr conn) { xenProxyClose(virConnectPtr conn)
if ((conn == NULL) || (conn->proxy < 0)) {
return(-1); xenUnifiedPrivatePtr priv;
virProxyCloseClientSocket(conn->proxy);
conn->proxy = -1; if (conn == NULL) {
return (0); virProxyError (NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
return -1;
}
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (!priv) {
virProxyError (NULL, VIR_ERR_INTERNAL_ERROR, __FUNCTION__);
return -1;
}
/* Fail silently. */
if (priv->proxy == -1)
return -1;
virProxyCloseClientSocket (priv->proxy);
priv->proxy = -1;
return 0;
} }
static int static int
@ -392,9 +412,22 @@ xenProxyCommand(virConnectPtr conn, virProxyPacketPtr request,
static int serial = 0; static int serial = 0;
int ret; int ret;
virProxyPacketPtr res = NULL; virProxyPacketPtr res = NULL;
xenUnifiedPrivatePtr priv;
if ((conn == NULL) || (conn->proxy < 0)) if (conn == NULL) {
return(-1); virProxyError (NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
return -1;
}
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (!priv) {
virProxyError (NULL, VIR_ERR_INTERNAL_ERROR, __FUNCTION__);
return -1;
}
/* Fail silently. */
if (priv->proxy == -1)
return -1;
/* /*
* normal communication serial numbers are in 0..4095 * normal communication serial numbers are in 0..4095
@ -404,14 +437,14 @@ xenProxyCommand(virConnectPtr conn, virProxyPacketPtr request,
serial = 0; serial = 0;
request->version = PROXY_PROTO_VERSION; request->version = PROXY_PROTO_VERSION;
request->serial = serial; request->serial = serial;
ret = virProxyWriteClientSocket(conn->proxy, (const char *) request, ret = virProxyWriteClientSocket(priv->proxy, (const char *) request,
request->len); request->len);
if (ret < 0) if (ret < 0)
return(-1); return(-1);
retry: retry:
if (answer == NULL) { if (answer == NULL) {
/* read in situ */ /* read in situ */
ret = virProxyReadClientSocket(conn->proxy, (char *) request, ret = virProxyReadClientSocket(priv->proxy, (char *) request,
sizeof(virProxyPacket), quiet); sizeof(virProxyPacket), quiet);
if (ret < 0) if (ret < 0)
return(-1); return(-1);
@ -432,7 +465,7 @@ retry:
} }
} else { } else {
/* read in packet provided */ /* read in packet provided */
ret = virProxyReadClientSocket(conn->proxy, (char *) answer, ret = virProxyReadClientSocket(priv->proxy, (char *) answer,
sizeof(virProxyPacket), quiet); sizeof(virProxyPacket), quiet);
if (ret < 0) if (ret < 0)
return(-1); return(-1);
@ -453,7 +486,7 @@ retry:
return(-1); return(-1);
} }
if (res->len > sizeof(virProxyPacket)) { if (res->len > sizeof(virProxyPacket)) {
ret = virProxyReadClientSocket(conn->proxy, ret = virProxyReadClientSocket(priv->proxy,
(char *) &(answer->extra.arg[0]), (char *) &(answer->extra.arg[0]),
res->len - ret, quiet); res->len - ret, quiet);
if (ret != (int) (res->len - sizeof(virProxyPacket))) { if (ret != (int) (res->len - sizeof(virProxyPacket))) {
@ -495,25 +528,26 @@ retry:
* Returns 0 in case of success, and -1 in case of failure * Returns 0 in case of success, and -1 in case of failure
*/ */
int int
xenProxyOpen(virConnectPtr conn, const char *name, int flags) xenProxyOpen(virConnectPtr conn, const char *name ATTRIBUTE_UNUSED, int flags)
{ {
virProxyPacket req; virProxyPacket req;
int ret; int ret;
int fd; int fd;
xenUnifiedPrivatePtr priv;
if ((name != NULL) && (strcasecmp(name, "xen")))
return(-1);
if (!(flags & VIR_DRV_OPEN_RO)) if (!(flags & VIR_DRV_OPEN_RO))
return(-1); return(-1);
conn->proxy = -1; priv = (xenUnifiedPrivatePtr) conn->privateData;
priv->proxy = -1;
fd = virProxyOpenClientSocket(PROXY_SOCKET_PATH); fd = virProxyOpenClientSocket(PROXY_SOCKET_PATH);
if (fd < 0) { if (fd < 0) {
if (!(flags & VIR_DRV_OPEN_QUIET)) if (!(flags & VIR_DRV_OPEN_QUIET))
virProxyError(conn, VIR_ERR_NO_XEN, PROXY_SOCKET_PATH); virProxyError(conn, VIR_ERR_NO_XEN, PROXY_SOCKET_PATH);
return(-1); return(-1);
} }
conn->proxy = fd; priv->proxy = fd;
memset(&req, 0, sizeof(req)); memset(&req, 0, sizeof(req));
req.command = VIR_PROXY_NONE; req.command = VIR_PROXY_NONE;

View File

@ -84,10 +84,9 @@ struct _virProxyFullPacket {
}; };
typedef struct _virProxyFullPacket virProxyFullPacket; typedef struct _virProxyFullPacket virProxyFullPacket;
typedef virProxyFullPacket *virProxyFullPacketPtr; typedef virProxyFullPacket *virProxyFullPacketPtr;
/*
* Functions callable from libvirt library extern virDriver xenProxyDriver;
*/ int xenProxyInit (void);
void xenProxyRegister(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -48,7 +48,20 @@
#include "xml.h" #include "xml.h"
#include "protocol.h" #include "protocol.h"
/**
* qemuPrivatePtr:
*
* Per-connection private data.
*/
struct _qemuPrivate {
int qemud_fd; /* Connection to libvirt qemu daemon. */
};
struct _qemuNetworkPrivate {
int qemud_fd;
int shared;
};
typedef struct _qemuPrivate *qemuPrivatePtr;
typedef struct _qemuNetworkPrivate *qemuNetworkPrivatePtr;
static void static void
qemuError(virConnectPtr con, qemuError(virConnectPtr con,
@ -209,7 +222,8 @@ qemuForkServer(void)
* Returns the associated file descriptor or -1 in case of failure * Returns the associated file descriptor or -1 in case of failure
*/ */
static int static int
qemuOpenClientUNIX(virConnectPtr conn, const char *path, int autostart) { qemuOpenClientUNIX(virConnectPtr conn ATTRIBUTE_UNUSED,
const char *path, int autostart) {
int fd; int fd;
struct sockaddr_un addr; struct sockaddr_un addr;
int trials = 0; int trials = 0;
@ -217,7 +231,7 @@ qemuOpenClientUNIX(virConnectPtr conn, const char *path, int autostart) {
retry: retry:
fd = socket(PF_UNIX, SOCK_STREAM, 0); fd = socket(PF_UNIX, SOCK_STREAM, 0);
if (fd < 0) { if (fd < 0) {
return(-1); return VIR_DRV_OPEN_ERROR;
} }
/* /*
@ -242,12 +256,10 @@ qemuOpenClientUNIX(virConnectPtr conn, const char *path, int autostart) {
usleep(5000 * trials * trials); usleep(5000 * trials * trials);
goto retry; goto retry;
} }
return (-1); return VIR_DRV_OPEN_ERROR;
} }
conn->qemud_fd = fd; return fd;
return (0);
} }
@ -256,9 +268,10 @@ qemuOpenClientUNIX(virConnectPtr conn, const char *path, int autostart) {
* connection closes. * connection closes.
*/ */
static int qemuProcessRequest(virConnectPtr conn, static int qemuProcessRequest(virConnectPtr conn,
virDomainPtr dom, int qemud_fd,
struct qemud_packet *req, virDomainPtr dom,
struct qemud_packet *reply) { struct qemud_packet *req,
struct qemud_packet *reply) {
char *out = (char *)req; char *out = (char *)req;
int outDone = 0; int outDone = 0;
int outLeft = sizeof(struct qemud_packet_header) + req->header.dataSize; int outLeft = sizeof(struct qemud_packet_header) + req->header.dataSize;
@ -270,7 +283,7 @@ static int qemuProcessRequest(virConnectPtr conn,
/* Block sending entire outgoing packet */ /* Block sending entire outgoing packet */
while (outLeft) { while (outLeft) {
int got = write(conn->qemud_fd, out+outDone, outLeft); int got = write(qemud_fd, out+outDone, outLeft);
if (got < 0) { if (got < 0) {
return -1; return -1;
} }
@ -280,7 +293,7 @@ static int qemuProcessRequest(virConnectPtr conn,
/* Block waiting for header to come back */ /* Block waiting for header to come back */
while (inLeft) { while (inLeft) {
int done = read(conn->qemud_fd, in+inGot, inLeft); int done = read(qemud_fd, in+inGot, inLeft);
if (done <= 0) { if (done <= 0) {
return -1; return -1;
} }
@ -308,7 +321,7 @@ static int qemuProcessRequest(virConnectPtr conn,
/* Now block reading in body */ /* Now block reading in body */
inLeft = reply->header.dataSize; inLeft = reply->header.dataSize;
while (inLeft) { while (inLeft) {
int done = read(conn->qemud_fd, in+inGot, inLeft); int done = read(qemud_fd, in+inGot, inLeft);
if (done <= 0) { if (done <= 0) {
return -1; return -1;
} }
@ -333,17 +346,17 @@ static int qemuOpenConnection(virConnectPtr conn, xmlURIPtr uri, int readonly) {
int autostart = 0; int autostart = 0;
if (uri->server != NULL) { if (uri->server != NULL) {
return -1; return VIR_DRV_OPEN_ERROR;
} }
if (!strcmp(uri->path, "/system")) { if (!strcmp(uri->path, "/system")) {
if (readonly) { if (readonly) {
if (snprintf(path, sizeof(path), "%s/run/libvirt/qemud-sock-ro", LOCAL_STATE_DIR) >= (int)sizeof(path)) { if (snprintf(path, sizeof(path), "%s/run/libvirt/qemud-sock-ro", LOCAL_STATE_DIR) >= (int)sizeof(path)) {
return -1; return VIR_DRV_OPEN_ERROR;
} }
} else { } else {
if (snprintf(path, sizeof(path), "%s/run/libvirt/qemud-sock", LOCAL_STATE_DIR) >= (int)sizeof(path)) { if (snprintf(path, sizeof(path), "%s/run/libvirt/qemud-sock", LOCAL_STATE_DIR) >= (int)sizeof(path)) {
return -1; return VIR_DRV_OPEN_ERROR;
} }
} }
} else if (!strcmp(uri->path, "/session")) { } else if (!strcmp(uri->path, "/session")) {
@ -351,14 +364,14 @@ static int qemuOpenConnection(virConnectPtr conn, xmlURIPtr uri, int readonly) {
int uid; int uid;
if ((uid = geteuid()) < 0) { if ((uid = geteuid()) < 0) {
return -1; return VIR_DRV_OPEN_ERROR;
} }
if (!(pw = getpwuid(uid))) if (!(pw = getpwuid(uid)))
return -1; return VIR_DRV_OPEN_ERROR;
if (snprintf(path, sizeof(path), "@%s/.libvirt/qemud-sock", pw->pw_dir) == sizeof(path)) { if (snprintf(path, sizeof(path), "@%s/.libvirt/qemud-sock", pw->pw_dir) == sizeof(path)) {
return -1; return VIR_DRV_OPEN_ERROR;
} }
autostart = 1; autostart = 1;
} }
@ -373,42 +386,62 @@ static int qemuOpen(virConnectPtr conn,
const char *name, const char *name,
int flags){ int flags){
xmlURIPtr uri; xmlURIPtr uri;
qemuPrivatePtr priv;
int ret;
if (!name) { if (!name) {
return -1; return VIR_DRV_OPEN_DECLINED;
} }
uri = xmlParseURI(name); uri = xmlParseURI(name);
if (uri == NULL) { if (uri == NULL) {
if (!(flags & VIR_DRV_OPEN_QUIET)) if (!(flags & VIR_DRV_OPEN_QUIET))
qemuError(conn, NULL, VIR_ERR_NO_SUPPORT, name); qemuError(conn, NULL, VIR_ERR_NO_SUPPORT, name);
return(-1); return VIR_DRV_OPEN_DECLINED;
} }
if (!uri->scheme || if (!uri->scheme ||
strcmp(uri->scheme, "qemu") || strcmp(uri->scheme, "qemu") ||
!uri->path) { !uri->path) {
xmlFreeURI(uri); xmlFreeURI(uri);
return -1; return VIR_DRV_OPEN_DECLINED;
} }
conn->qemud_fd = -1; /* Create per-connection private data. */
qemuOpenConnection(conn, uri, flags & VIR_DRV_OPEN_RO ? 1 : 0); priv = conn->privateData = malloc (sizeof *priv);
if (!priv) {
qemuError (conn, NULL, VIR_ERR_NO_MEMORY, __FUNCTION__);
return VIR_DRV_OPEN_ERROR;
}
ret = qemuOpenConnection(conn, uri, flags & VIR_DRV_OPEN_RO ? 1 : 0);
xmlFreeURI(uri); xmlFreeURI(uri);
if (conn->qemud_fd < 0) { if (ret < 0) {
return -1; free (priv);
conn->privateData = NULL;
return VIR_DRV_OPEN_ERROR;
} }
return 0; priv->qemud_fd = ret;
return VIR_DRV_OPEN_SUCCESS;
} }
static int qemuClose (virConnectPtr conn) { static int
if (conn->qemud_fd != -1) { qemuClose (virConnectPtr conn)
close(conn->qemud_fd); {
conn->qemud_fd = -1; qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
if (priv->qemud_fd != -1) {
close (priv->qemud_fd);
priv->qemud_fd = -1;
} }
free (priv);
conn->privateData = NULL;
return 0; return 0;
} }
@ -416,11 +449,12 @@ static int qemuClose (virConnectPtr conn) {
static int qemuGetVersion(virConnectPtr conn, static int qemuGetVersion(virConnectPtr conn,
unsigned long *hvVer) { unsigned long *hvVer) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
req.header.type = QEMUD_PKT_GET_VERSION; req.header.type = QEMUD_PKT_GET_VERSION;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -432,11 +466,12 @@ static int qemuGetVersion(virConnectPtr conn,
static int qemuNodeGetInfo(virConnectPtr conn, static int qemuNodeGetInfo(virConnectPtr conn,
virNodeInfoPtr info) { virNodeInfoPtr info) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
req.header.type = QEMUD_PKT_GET_NODEINFO; req.header.type = QEMUD_PKT_GET_NODEINFO;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -457,6 +492,7 @@ qemuGetCapabilities (virConnectPtr conn)
{ {
struct qemud_packet req, reply; struct qemud_packet req, reply;
char *xml; char *xml;
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
/* Punt the request across to the daemon, because the daemon /* Punt the request across to the daemon, because the daemon
* has tables describing available architectures. * has tables describing available architectures.
@ -464,7 +500,7 @@ qemuGetCapabilities (virConnectPtr conn)
req.header.type = QEMUD_PKT_GET_CAPABILITIES; req.header.type = QEMUD_PKT_GET_CAPABILITIES;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -481,11 +517,12 @@ qemuGetCapabilities (virConnectPtr conn)
static int qemuNumOfDomains(virConnectPtr conn) { static int qemuNumOfDomains(virConnectPtr conn) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
req.header.type = QEMUD_PKT_NUM_DOMAINS; req.header.type = QEMUD_PKT_NUM_DOMAINS;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -498,11 +535,12 @@ static int qemuListDomains(virConnectPtr conn,
int maxids) { int maxids) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
int i, nDomains; int i, nDomains;
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
req.header.type = QEMUD_PKT_LIST_DOMAINS; req.header.type = QEMUD_PKT_LIST_DOMAINS;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -524,6 +562,7 @@ qemuDomainCreateLinux(virConnectPtr conn, const char *xmlDesc,
struct qemud_packet req, reply; struct qemud_packet req, reply;
virDomainPtr dom; virDomainPtr dom;
int len = strlen(xmlDesc); int len = strlen(xmlDesc);
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
if (len > (QEMUD_MAX_XML_LEN-1)) { if (len > (QEMUD_MAX_XML_LEN-1)) {
return NULL; return NULL;
@ -534,7 +573,7 @@ qemuDomainCreateLinux(virConnectPtr conn, const char *xmlDesc,
strcpy(req.data.domainCreateRequest.xml, xmlDesc); strcpy(req.data.domainCreateRequest.xml, xmlDesc);
req.data.domainCreateRequest.xml[QEMUD_MAX_XML_LEN-1] = '\0'; req.data.domainCreateRequest.xml[QEMUD_MAX_XML_LEN-1] = '\0';
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -554,12 +593,13 @@ static virDomainPtr qemuLookupDomainByID(virConnectPtr conn,
int id) { int id) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
virDomainPtr dom; virDomainPtr dom;
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
req.header.type = QEMUD_PKT_DOMAIN_LOOKUP_BY_ID; req.header.type = QEMUD_PKT_DOMAIN_LOOKUP_BY_ID;
req.header.dataSize = sizeof(req.data.domainLookupByIDRequest); req.header.dataSize = sizeof(req.data.domainLookupByIDRequest);
req.data.domainLookupByIDRequest.id = id; req.data.domainLookupByIDRequest.id = id;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -579,12 +619,13 @@ static virDomainPtr qemuLookupDomainByUUID(virConnectPtr conn,
const unsigned char *uuid) { const unsigned char *uuid) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
virDomainPtr dom; virDomainPtr dom;
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
req.header.type = QEMUD_PKT_DOMAIN_LOOKUP_BY_UUID; req.header.type = QEMUD_PKT_DOMAIN_LOOKUP_BY_UUID;
req.header.dataSize = sizeof(req.data.domainLookupByUUIDRequest); req.header.dataSize = sizeof(req.data.domainLookupByUUIDRequest);
memmove(req.data.domainLookupByUUIDRequest.uuid, uuid, QEMUD_UUID_RAW_LEN); memmove(req.data.domainLookupByUUIDRequest.uuid, uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -604,6 +645,7 @@ static virDomainPtr qemuLookupDomainByName(virConnectPtr conn,
const char *name) { const char *name) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
virDomainPtr dom; virDomainPtr dom;
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
if (strlen(name) > (QEMUD_MAX_NAME_LEN-1)) if (strlen(name) > (QEMUD_MAX_NAME_LEN-1))
return NULL; return NULL;
@ -612,7 +654,7 @@ static virDomainPtr qemuLookupDomainByName(virConnectPtr conn,
req.header.dataSize = sizeof(req.data.domainLookupByNameRequest); req.header.dataSize = sizeof(req.data.domainLookupByNameRequest);
strcpy(req.data.domainLookupByNameRequest.name, name); strcpy(req.data.domainLookupByNameRequest.name, name);
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -627,12 +669,13 @@ static virDomainPtr qemuLookupDomainByName(virConnectPtr conn,
static int qemuDestroyDomain(virDomainPtr domain) { static int qemuDestroyDomain(virDomainPtr domain) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) domain->conn->privateData;
req.header.type = QEMUD_PKT_DOMAIN_DESTROY; req.header.type = QEMUD_PKT_DOMAIN_DESTROY;
req.header.dataSize = sizeof(req.data.domainDestroyRequest); req.header.dataSize = sizeof(req.data.domainDestroyRequest);
req.data.domainDestroyRequest.id = domain->id; req.data.domainDestroyRequest.id = domain->id;
if (qemuProcessRequest(domain->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(domain->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -643,28 +686,30 @@ static int qemuShutdownDomain(virDomainPtr domain) {
return qemuDestroyDomain(domain); return qemuDestroyDomain(domain);
} }
static int qemuResumeDomain(virDomainPtr domain ATTRIBUTE_UNUSED) { static int qemuResumeDomain(virDomainPtr domain) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) domain->conn->privateData;
req.header.type = QEMUD_PKT_DOMAIN_RESUME; req.header.type = QEMUD_PKT_DOMAIN_RESUME;
req.header.dataSize = sizeof(req.data.domainResumeRequest); req.header.dataSize = sizeof(req.data.domainResumeRequest);
req.data.domainResumeRequest.id = domain->id; req.data.domainResumeRequest.id = domain->id;
if (qemuProcessRequest(domain->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(domain->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
return 0; return 0;
} }
static int qemuPauseDomain(virDomainPtr domain ATTRIBUTE_UNUSED) { static int qemuPauseDomain(virDomainPtr domain) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) domain->conn->privateData;
req.header.type = QEMUD_PKT_DOMAIN_SUSPEND; req.header.type = QEMUD_PKT_DOMAIN_SUSPEND;
req.header.dataSize = sizeof(req.data.domainSuspendRequest); req.header.dataSize = sizeof(req.data.domainSuspendRequest);
req.data.domainSuspendRequest.id = domain->id; req.data.domainSuspendRequest.id = domain->id;
if (qemuProcessRequest(domain->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(domain->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -674,12 +719,13 @@ static int qemuPauseDomain(virDomainPtr domain ATTRIBUTE_UNUSED) {
static int qemuGetDomainInfo(virDomainPtr domain, static int qemuGetDomainInfo(virDomainPtr domain,
virDomainInfoPtr info) { virDomainInfoPtr info) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) domain->conn->privateData;
req.header.type = QEMUD_PKT_DOMAIN_GET_INFO; req.header.type = QEMUD_PKT_DOMAIN_GET_INFO;
req.header.dataSize = sizeof(req.data.domainGetInfoRequest); req.header.dataSize = sizeof(req.data.domainGetInfoRequest);
memmove(req.data.domainGetInfoRequest.uuid, domain->uuid, QEMUD_UUID_RAW_LEN); memmove(req.data.domainGetInfoRequest.uuid, domain->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(domain->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(domain->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -710,12 +756,13 @@ static int qemuGetDomainInfo(virDomainPtr domain,
static char *qemuDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED) { static char *qemuDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) domain->conn->privateData;
req.header.type = QEMUD_PKT_DUMP_XML; req.header.type = QEMUD_PKT_DUMP_XML;
req.header.dataSize = sizeof(req.data.domainDumpXMLRequest); req.header.dataSize = sizeof(req.data.domainDumpXMLRequest);
memmove(req.data.domainDumpXMLRequest.uuid, domain->uuid, QEMUD_UUID_RAW_LEN); memmove(req.data.domainDumpXMLRequest.uuid, domain->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(domain->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(domain->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -735,11 +782,12 @@ static int qemuRestoreDomain(virConnectPtr conn ATTRIBUTE_UNUSED, const char *fi
static int qemuNumOfDefinedDomains(virConnectPtr conn) { static int qemuNumOfDefinedDomains(virConnectPtr conn) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
req.header.type = QEMUD_PKT_NUM_DEFINED_DOMAINS; req.header.type = QEMUD_PKT_NUM_DEFINED_DOMAINS;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -751,11 +799,12 @@ static int qemuListDefinedDomains(virConnectPtr conn,
int maxnames){ int maxnames){
struct qemud_packet req, reply; struct qemud_packet req, reply;
int i, nDomains; int i, nDomains;
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
req.header.type = QEMUD_PKT_LIST_DEFINED_DOMAINS; req.header.type = QEMUD_PKT_LIST_DEFINED_DOMAINS;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -773,12 +822,13 @@ static int qemuListDefinedDomains(virConnectPtr conn,
static int qemuDomainCreate(virDomainPtr dom) { static int qemuDomainCreate(virDomainPtr dom) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) dom->conn->privateData;
req.header.type = QEMUD_PKT_DOMAIN_START; req.header.type = QEMUD_PKT_DOMAIN_START;
req.header.dataSize = sizeof(req.data.domainStartRequest); req.header.dataSize = sizeof(req.data.domainStartRequest);
memcpy(req.data.domainStartRequest.uuid, dom->uuid, QEMUD_UUID_RAW_LEN); memcpy(req.data.domainStartRequest.uuid, dom->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(dom->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(dom->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -791,6 +841,7 @@ static virDomainPtr qemuDomainDefineXML(virConnectPtr conn, const char *xml) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
virDomainPtr dom; virDomainPtr dom;
int len = strlen(xml); int len = strlen(xml);
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
if (len > (QEMUD_MAX_XML_LEN-1)) { if (len > (QEMUD_MAX_XML_LEN-1)) {
return NULL; return NULL;
@ -801,7 +852,7 @@ static virDomainPtr qemuDomainDefineXML(virConnectPtr conn, const char *xml) {
strcpy(req.data.domainDefineRequest.xml, xml); strcpy(req.data.domainDefineRequest.xml, xml);
req.data.domainDefineRequest.xml[QEMUD_MAX_XML_LEN-1] = '\0'; req.data.domainDefineRequest.xml[QEMUD_MAX_XML_LEN-1] = '\0';
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -819,12 +870,13 @@ static virDomainPtr qemuDomainDefineXML(virConnectPtr conn, const char *xml) {
static int qemuUndefine(virDomainPtr dom) { static int qemuUndefine(virDomainPtr dom) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
int ret = 0; int ret = 0;
qemuPrivatePtr priv = (qemuPrivatePtr) dom->conn->privateData;
req.header.type = QEMUD_PKT_DOMAIN_UNDEFINE; req.header.type = QEMUD_PKT_DOMAIN_UNDEFINE;
req.header.dataSize = sizeof(req.data.domainUndefineRequest); req.header.dataSize = sizeof(req.data.domainUndefineRequest);
memcpy(req.data.domainUndefineRequest.uuid, dom->uuid, QEMUD_UUID_RAW_LEN); memcpy(req.data.domainUndefineRequest.uuid, dom->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(dom->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(dom->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
ret = -1; ret = -1;
goto cleanup; goto cleanup;
} }
@ -839,12 +891,13 @@ static int qemuUndefine(virDomainPtr dom) {
static int qemuDomainGetAutostart(virDomainPtr dom, static int qemuDomainGetAutostart(virDomainPtr dom,
int *autostart) { int *autostart) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) dom->conn->privateData;
req.header.type = QEMUD_PKT_DOMAIN_GET_AUTOSTART; req.header.type = QEMUD_PKT_DOMAIN_GET_AUTOSTART;
req.header.dataSize = sizeof(req.data.domainGetAutostartRequest); req.header.dataSize = sizeof(req.data.domainGetAutostartRequest);
memmove(req.data.domainGetAutostartRequest.uuid, dom->uuid, QEMUD_UUID_RAW_LEN); memmove(req.data.domainGetAutostartRequest.uuid, dom->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(dom->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(dom->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -856,13 +909,14 @@ static int qemuDomainGetAutostart(virDomainPtr dom,
static int qemuDomainSetAutostart(virDomainPtr dom, static int qemuDomainSetAutostart(virDomainPtr dom,
int autostart) { int autostart) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuPrivatePtr priv = (qemuPrivatePtr) dom->conn->privateData;
req.header.type = QEMUD_PKT_DOMAIN_SET_AUTOSTART; req.header.type = QEMUD_PKT_DOMAIN_SET_AUTOSTART;
req.header.dataSize = sizeof(req.data.domainSetAutostartRequest); req.header.dataSize = sizeof(req.data.domainSetAutostartRequest);
req.data.domainSetAutostartRequest.autostart = (autostart != 0); req.data.domainSetAutostartRequest.autostart = (autostart != 0);
memmove(req.data.domainSetAutostartRequest.uuid, dom->uuid, QEMUD_UUID_RAW_LEN); memmove(req.data.domainSetAutostartRequest.uuid, dom->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(dom->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(dom->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -870,37 +924,62 @@ static int qemuDomainSetAutostart(virDomainPtr dom,
} }
static int qemuNetworkOpen(virConnectPtr conn, static int qemuNetworkOpen(virConnectPtr conn,
const char *name, const char *name ATTRIBUTE_UNUSED,
int flags) { int flags) {
xmlURIPtr uri = NULL; qemuNetworkPrivatePtr netpriv = NULL;
int ret = -1;
if (conn->qemud_fd != -1) if (!(netpriv = malloc(sizeof(struct _qemuNetworkPrivate)))) {
qemuError (conn, NULL, VIR_ERR_NO_MEMORY, __FUNCTION__);
return VIR_DRV_OPEN_ERROR;
}
if (!strcmp(conn->driver->name, "QEMU")) {
/* QEMU driver is active - just re-use existing connection */
qemuPrivatePtr priv = (qemuPrivatePtr) conn->privateData;
netpriv->qemud_fd = priv->qemud_fd;
netpriv->shared = 1;
conn->networkPrivateData = netpriv;
return 0; return 0;
} else {
if (name) /* Non-QEMU driver is active - open a new connection */
uri = xmlParseURI(name); const char *drvname = geteuid() == 0 ? "qemu:///system" : "qemu://session";
xmlURIPtr uri = xmlParseURI(drvname);
if (uri && uri->scheme && !strcmp(uri->scheme, "qemu")) int ret = qemuOpenConnection(conn, uri, flags & VIR_DRV_OPEN_RO ? 1 : 0);
ret = qemuOpen(conn, name, flags);
else if (geteuid() == 0)
ret = qemuOpen(conn, "qemu:///system", flags);
else
ret = qemuOpen(conn, "qemu:///session", flags);
if (uri)
xmlFreeURI(uri); xmlFreeURI(uri);
return ret; if (ret < 0) {
free(netpriv);
return ret;
} else {
netpriv->qemud_fd = ret;
netpriv->shared = 0;
conn->networkPrivateData = netpriv;
return 0;
}
}
}
static int
qemuNetworkClose (virConnectPtr conn)
{
qemuNetworkPrivatePtr netpriv = (qemuNetworkPrivatePtr) conn->networkPrivateData;
if (!netpriv->shared)
close(netpriv->qemud_fd);
free(netpriv);
conn->networkPrivateData = NULL;
return 0;
} }
static int qemuNumOfNetworks(virConnectPtr conn) { static int qemuNumOfNetworks(virConnectPtr conn) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) conn->networkPrivateData;
req.header.type = QEMUD_PKT_NUM_NETWORKS; req.header.type = QEMUD_PKT_NUM_NETWORKS;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -912,11 +991,12 @@ static int qemuListNetworks(virConnectPtr conn,
int maxnames) { int maxnames) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
int i, nNetworks; int i, nNetworks;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) conn->networkPrivateData;
req.header.type = QEMUD_PKT_LIST_NETWORKS; req.header.type = QEMUD_PKT_LIST_NETWORKS;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -934,11 +1014,12 @@ static int qemuListNetworks(virConnectPtr conn,
static int qemuNumOfDefinedNetworks(virConnectPtr conn) { static int qemuNumOfDefinedNetworks(virConnectPtr conn) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) conn->networkPrivateData;
req.header.type = QEMUD_PKT_NUM_DEFINED_NETWORKS; req.header.type = QEMUD_PKT_NUM_DEFINED_NETWORKS;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -950,11 +1031,12 @@ static int qemuListDefinedNetworks(virConnectPtr conn,
int maxnames) { int maxnames) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
int i, nNetworks; int i, nNetworks;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) conn->networkPrivateData;
req.header.type = QEMUD_PKT_LIST_DEFINED_NETWORKS; req.header.type = QEMUD_PKT_LIST_DEFINED_NETWORKS;
req.header.dataSize = 0; req.header.dataSize = 0;
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -974,12 +1056,13 @@ static virNetworkPtr qemuNetworkLookupByUUID(virConnectPtr conn,
const unsigned char *uuid) { const unsigned char *uuid) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
virNetworkPtr network; virNetworkPtr network;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) conn->networkPrivateData;
req.header.type = QEMUD_PKT_NETWORK_LOOKUP_BY_UUID; req.header.type = QEMUD_PKT_NETWORK_LOOKUP_BY_UUID;
req.header.dataSize = sizeof(req.data.networkLookupByUUIDRequest); req.header.dataSize = sizeof(req.data.networkLookupByUUIDRequest);
memmove(req.data.networkLookupByUUIDRequest.uuid, uuid, QEMUD_UUID_RAW_LEN); memmove(req.data.networkLookupByUUIDRequest.uuid, uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -997,6 +1080,7 @@ static virNetworkPtr qemuNetworkLookupByName(virConnectPtr conn,
const char *name) { const char *name) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
virNetworkPtr network; virNetworkPtr network;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) conn->networkPrivateData;
if (strlen(name) > (QEMUD_MAX_NAME_LEN-1)) if (strlen(name) > (QEMUD_MAX_NAME_LEN-1))
return NULL; return NULL;
@ -1005,7 +1089,7 @@ static virNetworkPtr qemuNetworkLookupByName(virConnectPtr conn,
req.header.dataSize = sizeof(req.data.networkLookupByNameRequest); req.header.dataSize = sizeof(req.data.networkLookupByNameRequest);
strcpy(req.data.networkLookupByNameRequest.name, name); strcpy(req.data.networkLookupByNameRequest.name, name);
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -1022,6 +1106,7 @@ static virNetworkPtr qemuNetworkCreateXML(virConnectPtr conn,
struct qemud_packet req, reply; struct qemud_packet req, reply;
virNetworkPtr network; virNetworkPtr network;
int len = strlen(xmlDesc); int len = strlen(xmlDesc);
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) conn->networkPrivateData;
if (len > (QEMUD_MAX_XML_LEN-1)) { if (len > (QEMUD_MAX_XML_LEN-1)) {
return NULL; return NULL;
@ -1032,7 +1117,7 @@ static virNetworkPtr qemuNetworkCreateXML(virConnectPtr conn,
strcpy(req.data.networkCreateRequest.xml, xmlDesc); strcpy(req.data.networkCreateRequest.xml, xmlDesc);
req.data.networkCreateRequest.xml[QEMUD_MAX_XML_LEN-1] = '\0'; req.data.networkCreateRequest.xml[QEMUD_MAX_XML_LEN-1] = '\0';
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -1052,6 +1137,7 @@ static virNetworkPtr qemuNetworkDefineXML(virConnectPtr conn,
struct qemud_packet req, reply; struct qemud_packet req, reply;
virNetworkPtr network; virNetworkPtr network;
int len = strlen(xml); int len = strlen(xml);
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) conn->networkPrivateData;
if (len > (QEMUD_MAX_XML_LEN-1)) { if (len > (QEMUD_MAX_XML_LEN-1)) {
return NULL; return NULL;
@ -1062,7 +1148,7 @@ static virNetworkPtr qemuNetworkDefineXML(virConnectPtr conn,
strcpy(req.data.networkDefineRequest.xml, xml); strcpy(req.data.networkDefineRequest.xml, xml);
req.data.networkDefineRequest.xml[QEMUD_MAX_XML_LEN-1] = '\0'; req.data.networkDefineRequest.xml[QEMUD_MAX_XML_LEN-1] = '\0';
if (qemuProcessRequest(conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -1079,12 +1165,13 @@ static virNetworkPtr qemuNetworkDefineXML(virConnectPtr conn,
static int qemuNetworkUndefine(virNetworkPtr network) { static int qemuNetworkUndefine(virNetworkPtr network) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
int ret = 0; int ret = 0;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) network->conn->networkPrivateData;
req.header.type = QEMUD_PKT_NETWORK_UNDEFINE; req.header.type = QEMUD_PKT_NETWORK_UNDEFINE;
req.header.dataSize = sizeof(req.data.networkUndefineRequest); req.header.dataSize = sizeof(req.data.networkUndefineRequest);
memcpy(req.data.networkUndefineRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN); memcpy(req.data.networkUndefineRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(network->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(network->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
ret = -1; ret = -1;
goto cleanup; goto cleanup;
} }
@ -1098,12 +1185,13 @@ static int qemuNetworkUndefine(virNetworkPtr network) {
static int qemuNetworkCreate(virNetworkPtr network) { static int qemuNetworkCreate(virNetworkPtr network) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) network->conn->networkPrivateData;
req.header.type = QEMUD_PKT_NETWORK_START; req.header.type = QEMUD_PKT_NETWORK_START;
req.header.dataSize = sizeof(req.data.networkStartRequest); req.header.dataSize = sizeof(req.data.networkStartRequest);
memcpy(req.data.networkStartRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN); memcpy(req.data.networkStartRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(network->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(network->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -1112,12 +1200,13 @@ static int qemuNetworkCreate(virNetworkPtr network) {
static int qemuNetworkDestroy(virNetworkPtr network) { static int qemuNetworkDestroy(virNetworkPtr network) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) network->conn->networkPrivateData;
req.header.type = QEMUD_PKT_NETWORK_DESTROY; req.header.type = QEMUD_PKT_NETWORK_DESTROY;
req.header.dataSize = sizeof(req.data.networkDestroyRequest); req.header.dataSize = sizeof(req.data.networkDestroyRequest);
memcpy(req.data.networkDestroyRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN); memcpy(req.data.networkDestroyRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(network->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(network->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -1126,12 +1215,13 @@ static int qemuNetworkDestroy(virNetworkPtr network) {
static char * qemuNetworkDumpXML(virNetworkPtr network, int flags ATTRIBUTE_UNUSED) { static char * qemuNetworkDumpXML(virNetworkPtr network, int flags ATTRIBUTE_UNUSED) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) network->conn->networkPrivateData;
req.header.type = QEMUD_PKT_NETWORK_DUMP_XML; req.header.type = QEMUD_PKT_NETWORK_DUMP_XML;
req.header.dataSize = sizeof(req.data.networkDumpXMLRequest); req.header.dataSize = sizeof(req.data.networkDumpXMLRequest);
memmove(req.data.networkDumpXMLRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN); memmove(req.data.networkDumpXMLRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(network->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(network->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -1142,12 +1232,13 @@ static char * qemuNetworkDumpXML(virNetworkPtr network, int flags ATTRIBUTE_UNUS
static char * qemuNetworkGetBridgeName(virNetworkPtr network) { static char * qemuNetworkGetBridgeName(virNetworkPtr network) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) network->conn->networkPrivateData;
req.header.type = QEMUD_PKT_NETWORK_GET_BRIDGE_NAME; req.header.type = QEMUD_PKT_NETWORK_GET_BRIDGE_NAME;
req.header.dataSize = sizeof(req.data.networkGetBridgeNameRequest); req.header.dataSize = sizeof(req.data.networkGetBridgeNameRequest);
memmove(req.data.networkGetBridgeNameRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN); memmove(req.data.networkGetBridgeNameRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(network->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(network->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return NULL; return NULL;
} }
@ -1159,12 +1250,13 @@ static char * qemuNetworkGetBridgeName(virNetworkPtr network) {
static int qemuNetworkGetAutostart(virNetworkPtr network, static int qemuNetworkGetAutostart(virNetworkPtr network,
int *autostart) { int *autostart) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) network->conn->networkPrivateData;
req.header.type = QEMUD_PKT_NETWORK_GET_AUTOSTART; req.header.type = QEMUD_PKT_NETWORK_GET_AUTOSTART;
req.header.dataSize = sizeof(req.data.networkGetAutostartRequest); req.header.dataSize = sizeof(req.data.networkGetAutostartRequest);
memmove(req.data.networkGetAutostartRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN); memmove(req.data.networkGetAutostartRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(network->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(network->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -1176,13 +1268,14 @@ static int qemuNetworkGetAutostart(virNetworkPtr network,
static int qemuNetworkSetAutostart(virNetworkPtr network, static int qemuNetworkSetAutostart(virNetworkPtr network,
int autostart) { int autostart) {
struct qemud_packet req, reply; struct qemud_packet req, reply;
qemuNetworkPrivatePtr priv = (qemuNetworkPrivatePtr) network->conn->networkPrivateData;
req.header.type = QEMUD_PKT_NETWORK_SET_AUTOSTART; req.header.type = QEMUD_PKT_NETWORK_SET_AUTOSTART;
req.header.dataSize = sizeof(req.data.networkSetAutostartRequest); req.header.dataSize = sizeof(req.data.networkSetAutostartRequest);
req.data.networkSetAutostartRequest.autostart = (autostart != 0); req.data.networkSetAutostartRequest.autostart = (autostart != 0);
memmove(req.data.networkSetAutostartRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN); memmove(req.data.networkSetAutostartRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN);
if (qemuProcessRequest(network->conn, NULL, &req, &reply) < 0) { if (qemuProcessRequest(network->conn, priv->qemud_fd, NULL, &req, &reply) < 0) {
return -1; return -1;
} }
@ -1237,7 +1330,7 @@ static virDriver qemuDriver = {
static virNetworkDriver qemuNetworkDriver = { static virNetworkDriver qemuNetworkDriver = {
qemuNetworkOpen, /* open */ qemuNetworkOpen, /* open */
qemuClose, /* close */ qemuNetworkClose, /* close */
qemuNumOfNetworks, /* numOfNetworks */ qemuNumOfNetworks, /* numOfNetworks */
qemuListNetworks, /* listNetworks */ qemuListNetworks, /* listNetworks */
qemuNumOfDefinedNetworks, /* numOfDefinedNetworks */ qemuNumOfDefinedNetworks, /* numOfDefinedNetworks */
@ -1260,9 +1353,15 @@ static virNetworkDriver qemuNetworkDriver = {
* *
* Registers QEmu/KVM in libvirt driver system * Registers QEmu/KVM in libvirt driver system
*/ */
void qemuRegister(void) { int
virRegisterDriver(&qemuDriver); qemuRegister (void)
virRegisterNetworkDriver(&qemuNetworkDriver); {
if (virRegisterDriver(&qemuDriver) == -1)
return -1;
if (virRegisterNetworkDriver(&qemuNetworkDriver) == -1)
return -1;
return 0;
} }
#endif /* WITH_QEMU */ #endif /* WITH_QEMU */

View File

@ -30,7 +30,7 @@
extern "C" { extern "C" {
#endif #endif
void qemuRegister(void); int qemuRegister(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -134,6 +134,12 @@ static virDriver testDriver = {
NULL, /* domainSetAutostart */ NULL, /* domainSetAutostart */
}; };
/* Per-connection private data. */
struct _testPrivate {
int handle;
};
typedef struct _testPrivate *testPrivatePtr;
typedef struct _testDev { typedef struct _testDev {
char name[20]; char name[20];
virDeviceMode mode; virDeviceMode mode;
@ -244,9 +250,10 @@ static const char *testRestartFlagToString(int flag) {
* *
* Registers the test driver * Registers the test driver
*/ */
void testRegister(void) int
testRegister(void)
{ {
virRegisterDriver(&testDriver); return virRegisterDriver(&testDriver);
} }
static int testLoadDomain(virConnectPtr conn, static int testLoadDomain(virConnectPtr conn,
@ -268,6 +275,7 @@ static int testLoadDomain(virConnectPtr conn,
virDomainRestart onReboot = VIR_DOMAIN_RESTART; virDomainRestart onReboot = VIR_DOMAIN_RESTART;
virDomainRestart onPoweroff = VIR_DOMAIN_DESTROY; virDomainRestart onPoweroff = VIR_DOMAIN_DESTROY;
virDomainRestart onCrash = VIR_DOMAIN_RENAME_RESTART; virDomainRestart onCrash = VIR_DOMAIN_RENAME_RESTART;
testPrivatePtr priv;
if (gettimeofday(&tv, NULL) < 0) { if (gettimeofday(&tv, NULL) < 0) {
testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day")); testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
@ -336,9 +344,6 @@ static int testLoadDomain(virConnectPtr conn,
if (obj) if (obj)
xmlXPathFreeObject(obj); xmlXPathFreeObject(obj);
obj = xmlXPathEval(BAD_CAST "string(/domain/vcpu[1])", ctxt); obj = xmlXPathEval(BAD_CAST "string(/domain/vcpu[1])", ctxt);
if ((obj == NULL) || (obj->type != XPATH_STRING) || if ((obj == NULL) || (obj->type != XPATH_STRING) ||
(obj->stringval == NULL) || (obj->stringval[0] == 0)) { (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
@ -386,7 +391,8 @@ static int testLoadDomain(virConnectPtr conn,
if (obj) if (obj)
xmlXPathFreeObject(obj); xmlXPathFreeObject(obj);
con = &node->connections[conn->handle]; priv = (testPrivatePtr) conn->privateData;
con = &node->connections[priv->handle];
for (i = 0 ; i < MAX_DOMAINS ; i++) { for (i = 0 ; i < MAX_DOMAINS ; i++) {
if (!con->domains[i].active) { if (!con->domains[i].active) {
@ -479,13 +485,14 @@ static int testOpenDefault(virConnectPtr conn,
int connid) { int connid) {
int u; int u;
struct timeval tv; struct timeval tv;
testPrivatePtr priv = (testPrivatePtr) conn->privateData;
if (gettimeofday(&tv, NULL) < 0) { if (gettimeofday(&tv, NULL) < 0) {
testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day")); testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
return (-1); return VIR_DRV_OPEN_ERROR;
} }
conn->handle = connid; priv->handle = connid;
node->connections[connid].active = 1; node->connections[connid].active = 1;
memmove(&node->connections[connid].nodeInfo, &defaultNodeInfo, sizeof(defaultNodeInfo)); memmove(&node->connections[connid].nodeInfo, &defaultNodeInfo, sizeof(defaultNodeInfo));
@ -538,10 +545,11 @@ static int testOpenFromFile(virConnectPtr conn,
xmlXPathContextPtr ctxt = NULL; xmlXPathContextPtr ctxt = NULL;
xmlXPathObjectPtr obj = NULL; xmlXPathObjectPtr obj = NULL;
virNodeInfoPtr nodeInfo; virNodeInfoPtr nodeInfo;
testPrivatePtr priv = (testPrivatePtr) conn->privateData;
if ((fd = open(file, O_RDONLY)) < 0) { if ((fd = open(file, O_RDONLY)) < 0) {
testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("loading host definition file")); testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("loading host definition file"));
return (-1); return VIR_DRV_OPEN_ERROR;
} }
if (!(xml = xmlReadFd(fd, file, NULL, if (!(xml = xmlReadFd(fd, file, NULL,
@ -565,7 +573,7 @@ static int testOpenFromFile(virConnectPtr conn,
goto error; goto error;
} }
conn->handle = connid; priv->handle = connid;
node->connections[connid].active = 1; node->connections[connid].active = 1;
node->connections[connid].numDomains = 0; node->connections[connid].numDomains = 0;
memmove(&node->connections[connid].nodeInfo, &defaultNodeInfo, sizeof(defaultNodeInfo)); memmove(&node->connections[connid].nodeInfo, &defaultNodeInfo, sizeof(defaultNodeInfo));
@ -707,7 +715,7 @@ static int testOpenFromFile(virConnectPtr conn,
xmlFreeDoc(xml); xmlFreeDoc(xml);
if (fd != -1) if (fd != -1)
close(fd); close(fd);
return (-1); return VIR_DRV_OPEN_ERROR;
} }
static int getNextConnection(void) { static int getNextConnection(void) {
@ -732,7 +740,9 @@ static int getNextConnection(void) {
static int getDomainIndex(virDomainPtr domain) { static int getDomainIndex(virDomainPtr domain) {
int i; int i;
testCon *con; testCon *con;
con = &node->connections[domain->conn->handle]; testPrivatePtr priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
for (i = 0 ; i < MAX_DOMAINS ; i++) { for (i = 0 ; i < MAX_DOMAINS ; i++) {
if (domain->id >= 0) { if (domain->id >= 0) {
if (domain->id == con->domains[i].id) if (domain->id == con->domains[i].id)
@ -751,31 +761,39 @@ int testOpen(virConnectPtr conn,
{ {
xmlURIPtr uri; xmlURIPtr uri;
int ret, connid; int ret, connid;
testPrivatePtr priv;
if (!name) { if (!name)
return (-1); return VIR_DRV_OPEN_DECLINED;
}
uri = xmlParseURI(name); uri = xmlParseURI(name);
if (uri == NULL) { if (uri == NULL) {
if (!(flags & VIR_DRV_OPEN_QUIET)) if (!(flags & VIR_DRV_OPEN_QUIET))
testError(conn, NULL, VIR_ERR_NO_SUPPORT, name); testError(conn, NULL, VIR_ERR_NO_SUPPORT, name);
return(-1); return VIR_DRV_OPEN_DECLINED;
} }
if (!uri->scheme || if (!uri->scheme ||
strcmp(uri->scheme, "test") || strcmp(uri->scheme, "test") ||
!uri->path) { !uri->path) {
xmlFreeURI(uri); xmlFreeURI(uri);
return (-1); return VIR_DRV_OPEN_DECLINED;
} }
if ((connid = getNextConnection()) < 0) { if ((connid = getNextConnection()) < 0) {
testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("too many connections")); testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("too many connections"));
return (-1); return VIR_DRV_OPEN_ERROR;
} }
/* Allocate per-connection private data. */
priv = conn->privateData = malloc (sizeof (struct _testPrivate));
if (!priv) {
testError(NULL, NULL, VIR_ERR_NO_MEMORY, "allocating private data");
return VIR_DRV_OPEN_ERROR;
}
priv->handle = -1;
if (!strcmp(uri->path, "/default")) { if (!strcmp(uri->path, "/default")) {
ret = testOpenDefault(conn, ret = testOpenDefault(conn,
connid); connid);
@ -787,16 +805,34 @@ int testOpen(virConnectPtr conn,
xmlFreeURI(uri); xmlFreeURI(uri);
if (ret < 0) free (conn->privateData);
return (ret); return (ret);
} }
int testClose(virConnectPtr conn) int testClose(virConnectPtr conn)
{ {
testCon *con = &node->connections[conn->handle]; testPrivatePtr priv;
con->active = 0;
conn->handle = -1; if (!conn) {
memset(con, 0, sizeof(testCon)); testError (NULL, NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
return (0); return -1;
}
priv = (testPrivatePtr) conn->privateData;
if (!priv) {
testError (NULL, NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
return -1;
}
if (priv->handle >= 0) {
testCon *con = &node->connections[priv->handle];
con->active = 0;
memset (con, 0, sizeof *con); // RWMJ - why?
}
free (priv);
return 0;
} }
int testGetVersion(virConnectPtr conn ATTRIBUTE_UNUSED, int testGetVersion(virConnectPtr conn ATTRIBUTE_UNUSED,
@ -809,7 +845,8 @@ int testGetVersion(virConnectPtr conn ATTRIBUTE_UNUSED,
int testNodeGetInfo(virConnectPtr conn, int testNodeGetInfo(virConnectPtr conn,
virNodeInfoPtr info) virNodeInfoPtr info)
{ {
testCon *con = &node->connections[conn->handle]; testPrivatePtr priv = (testPrivatePtr) conn->privateData;
testCon *con = &node->connections[priv->handle];
memcpy(info, &con->nodeInfo, sizeof(virNodeInfo)); memcpy(info, &con->nodeInfo, sizeof(virNodeInfo));
return (0); return (0);
} }
@ -854,7 +891,8 @@ testGetCapabilities (virConnectPtr conn)
int testNumOfDomains(virConnectPtr conn) int testNumOfDomains(virConnectPtr conn)
{ {
int numActive = 0, i; int numActive = 0, i;
testCon *con = &node->connections[conn->handle]; testPrivatePtr priv = (testPrivatePtr) conn->privateData;
testCon *con = &node->connections[priv->handle];
for (i = 0 ; i < MAX_DOMAINS ; i++) { for (i = 0 ; i < MAX_DOMAINS ; i++) {
if (!con->domains[i].active || if (!con->domains[i].active ||
con->domains[i].info.state == VIR_DOMAIN_SHUTOFF) con->domains[i].info.state == VIR_DOMAIN_SHUTOFF)
@ -871,6 +909,7 @@ testDomainCreateLinux(virConnectPtr conn, const char *xmlDesc,
testCon *con; testCon *con;
int domid, handle = -1, i; int domid, handle = -1, i;
virDomainPtr dom; virDomainPtr dom;
testPrivatePtr priv;
if (!VIR_IS_CONNECT(conn)) { if (!VIR_IS_CONNECT(conn)) {
testError(conn, NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); testError(conn, NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
@ -884,8 +923,10 @@ testDomainCreateLinux(virConnectPtr conn, const char *xmlDesc,
testError(conn, NULL, VIR_ERR_OPERATION_DENIED, __FUNCTION__); testError(conn, NULL, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
return (NULL); return (NULL);
} }
priv = (testPrivatePtr) conn->privateData;
con = &node->connections[conn->handle]; con = &node->connections[priv->handle];
if (con->numDomains == MAX_DOMAINS) { if (con->numDomains == MAX_DOMAINS) {
testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("too many domains")); testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("too many domains"));
@ -914,7 +955,8 @@ testDomainCreateLinux(virConnectPtr conn, const char *xmlDesc,
virDomainPtr testLookupDomainByID(virConnectPtr conn, virDomainPtr testLookupDomainByID(virConnectPtr conn,
int id) int id)
{ {
testCon *con = &node->connections[conn->handle]; testPrivatePtr priv = (testPrivatePtr) conn->privateData;
testCon *con = &node->connections[priv->handle];
virDomainPtr dom; virDomainPtr dom;
int i, idx = -1; int i, idx = -1;
@ -942,7 +984,8 @@ virDomainPtr testLookupDomainByID(virConnectPtr conn,
virDomainPtr testLookupDomainByUUID(virConnectPtr conn, virDomainPtr testLookupDomainByUUID(virConnectPtr conn,
const unsigned char *uuid) const unsigned char *uuid)
{ {
testCon *con = &node->connections[conn->handle]; testPrivatePtr priv = (testPrivatePtr) conn->privateData;
testCon *con = &node->connections[priv->handle];
virDomainPtr dom = NULL; virDomainPtr dom = NULL;
int i, idx = -1; int i, idx = -1;
for (i = 0 ; i < MAX_DOMAINS ; i++) { for (i = 0 ; i < MAX_DOMAINS ; i++) {
@ -966,7 +1009,8 @@ virDomainPtr testLookupDomainByUUID(virConnectPtr conn,
virDomainPtr testLookupDomainByName(virConnectPtr conn, virDomainPtr testLookupDomainByName(virConnectPtr conn,
const char *name) const char *name)
{ {
testCon *con = &node->connections[conn->handle]; testPrivatePtr priv = (testPrivatePtr) conn->privateData;
testCon *con = &node->connections[priv->handle];
virDomainPtr dom = NULL; virDomainPtr dom = NULL;
int i, idx = -1; int i, idx = -1;
for (i = 0 ; i < MAX_DOMAINS ; i++) { for (i = 0 ; i < MAX_DOMAINS ; i++) {
@ -991,7 +1035,8 @@ int testListDomains (virConnectPtr conn,
int *ids, int *ids,
int maxids) int maxids)
{ {
testCon *con = &node->connections[conn->handle]; testPrivatePtr priv = (testPrivatePtr) conn->privateData;
testCon *con = &node->connections[priv->handle];
int n, i; int n, i;
for (i = 0, n = 0 ; i < MAX_DOMAINS && n < maxids ; i++) { for (i = 0, n = 0 ; i < MAX_DOMAINS && n < maxids ; i++) {
@ -1007,6 +1052,8 @@ int testDestroyDomain (virDomainPtr domain)
{ {
testCon *con; testCon *con;
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1018,7 +1065,9 @@ int testDestroyDomain (virDomainPtr domain)
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
con->domains[domidx].active = 0; con->domains[domidx].active = 0;
return (0); return (0);
} }
@ -1027,6 +1076,8 @@ int testResumeDomain (virDomainPtr domain)
{ {
testCon *con; testCon *con;
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1038,7 +1089,9 @@ int testResumeDomain (virDomainPtr domain)
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
con->domains[domidx].info.state = VIR_DOMAIN_RUNNING; con->domains[domidx].info.state = VIR_DOMAIN_RUNNING;
return (0); return (0);
} }
@ -1047,6 +1100,8 @@ int testPauseDomain (virDomainPtr domain)
{ {
testCon *con;\ testCon *con;\
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1058,7 +1113,9 @@ int testPauseDomain (virDomainPtr domain)
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
con->domains[domidx].info.state = VIR_DOMAIN_PAUSED; con->domains[domidx].info.state = VIR_DOMAIN_PAUSED;
return (0); return (0);
} }
@ -1072,6 +1129,8 @@ int testShutdownDomain (virDomainPtr domain)
testCon *con; testCon *con;
int domidx; int domidx;
struct timeval tv; struct timeval tv;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1083,7 +1142,9 @@ int testShutdownDomain (virDomainPtr domain)
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
if (gettimeofday(&tv, NULL) < 0) { if (gettimeofday(&tv, NULL) < 0) {
testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day")); testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
@ -1103,6 +1164,8 @@ int testRebootDomain (virDomainPtr domain, virDomainRestart action)
testCon *con; testCon *con;
int domidx; int domidx;
struct timeval tv; struct timeval tv;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1114,7 +1177,8 @@ int testRebootDomain (virDomainPtr domain, virDomainRestart action)
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
if (gettimeofday(&tv, NULL) < 0) { if (gettimeofday(&tv, NULL) < 0) {
testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day")); testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
@ -1158,6 +1222,8 @@ int testGetDomainInfo (virDomainPtr domain,
struct timeval tv; struct timeval tv;
testCon *con; testCon *con;
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1165,7 +1231,8 @@ int testGetDomainInfo (virDomainPtr domain,
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
if (gettimeofday(&tv, NULL) < 0) { if (gettimeofday(&tv, NULL) < 0) {
testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day")); testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
@ -1189,6 +1256,8 @@ char *testGetOSType(virDomainPtr dom ATTRIBUTE_UNUSED) {
unsigned long testGetMaxMemory(virDomainPtr domain) { unsigned long testGetMaxMemory(virDomainPtr domain) {
testCon *con; testCon *con;
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1196,7 +1265,8 @@ unsigned long testGetMaxMemory(virDomainPtr domain) {
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
return con->domains[domidx].info.maxMem; return con->domains[domidx].info.maxMem;
} }
@ -1205,6 +1275,8 @@ int testSetMaxMemory(virDomainPtr domain,
{ {
testCon *con; testCon *con;
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1216,7 +1288,8 @@ int testSetMaxMemory(virDomainPtr domain,
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
/* XXX validate not over host memory wrt to other domains */ /* XXX validate not over host memory wrt to other domains */
con->domains[domidx].info.maxMem = memory; con->domains[domidx].info.maxMem = memory;
return (0); return (0);
@ -1227,6 +1300,8 @@ int testSetMemory(virDomainPtr domain,
{ {
testCon *con; testCon *con;
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1238,7 +1313,8 @@ int testSetMemory(virDomainPtr domain,
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
if (memory > con->domains[domidx].info.maxMem) { if (memory > con->domains[domidx].info.maxMem) {
testError(domain->conn, domain, VIR_ERR_INVALID_ARG, __FUNCTION__); testError(domain->conn, domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
@ -1253,6 +1329,8 @@ int testSetVcpus(virDomainPtr domain,
unsigned int nrCpus) { unsigned int nrCpus) {
testCon *con; testCon *con;
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1264,7 +1342,8 @@ int testSetVcpus(virDomainPtr domain,
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
/* We allow more cpus in guest than host */ /* We allow more cpus in guest than host */
if (nrCpus > 32) { if (nrCpus > 32) {
@ -1283,6 +1362,8 @@ char * testDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED)
unsigned char *uuid; unsigned char *uuid;
testCon *con; testCon *con;
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1290,7 +1371,8 @@ char * testDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED)
return (NULL); return (NULL);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
if (!(buf = virBufferNew(4000))) { if (!(buf = virBufferNew(4000))) {
return (NULL); return (NULL);
@ -1323,7 +1405,8 @@ char * testDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED)
int testNumOfDefinedDomains(virConnectPtr conn) { int testNumOfDefinedDomains(virConnectPtr conn) {
int numInactive = 0, i; int numInactive = 0, i;
testCon *con = &node->connections[conn->handle]; testPrivatePtr priv = (testPrivatePtr) conn->privateData;
testCon *con = &node->connections[priv->handle];
for (i = 0 ; i < MAX_DOMAINS ; i++) { for (i = 0 ; i < MAX_DOMAINS ; i++) {
if (!con->domains[i].active || if (!con->domains[i].active ||
con->domains[i].info.state != VIR_DOMAIN_SHUTOFF) con->domains[i].info.state != VIR_DOMAIN_SHUTOFF)
@ -1336,7 +1419,8 @@ int testNumOfDefinedDomains(virConnectPtr conn) {
int testListDefinedDomains(virConnectPtr conn, int testListDefinedDomains(virConnectPtr conn,
char **const names, char **const names,
int maxnames) { int maxnames) {
testCon *con = &node->connections[conn->handle]; testPrivatePtr priv = (testPrivatePtr) conn->privateData;
testCon *con = &node->connections[priv->handle];
int n = 0, i; int n = 0, i;
for (i = 0, n = 0 ; i < MAX_DOMAINS && n < maxnames ; i++) { for (i = 0, n = 0 ; i < MAX_DOMAINS && n < maxnames ; i++) {
@ -1375,6 +1459,8 @@ virDomainPtr testDomainDefineXML(virConnectPtr conn,
int testDomainCreate(virDomainPtr domain) { int testDomainCreate(virDomainPtr domain) {
testCon *con; testCon *con;
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1382,7 +1468,8 @@ int testDomainCreate(virDomainPtr domain) {
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
if (con->domains[domidx].info.state != VIR_DOMAIN_SHUTOFF) { if (con->domains[domidx].info.state != VIR_DOMAIN_SHUTOFF) {
testError(domain->conn, domain, VIR_ERR_INTERNAL_ERROR, testError(domain->conn, domain, VIR_ERR_INTERNAL_ERROR,
@ -1399,6 +1486,8 @@ int testDomainCreate(virDomainPtr domain) {
int testDomainUndefine(virDomainPtr domain) { int testDomainUndefine(virDomainPtr domain) {
testCon *con; testCon *con;
int domidx; int domidx;
testPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
((domidx = getDomainIndex(domain)) < 0)) { ((domidx = getDomainIndex(domain)) < 0)) {
testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG, testError((domain ? domain->conn : NULL), domain, VIR_ERR_INVALID_ARG,
@ -1406,7 +1495,8 @@ int testDomainUndefine(virDomainPtr domain) {
return (-1); return (-1);
} }
con = &node->connections[domain->conn->handle]; priv = (testPrivatePtr) domain->conn->privateData;
con = &node->connections[priv->handle];
if (con->domains[domidx].info.state != VIR_DOMAIN_SHUTOFF) { if (con->domains[domidx].info.state != VIR_DOMAIN_SHUTOFF) {
testError(domain->conn, domain, VIR_ERR_INTERNAL_ERROR, testError(domain->conn, domain, VIR_ERR_INTERNAL_ERROR,

View File

@ -30,7 +30,7 @@
extern "C" { extern "C" {
#endif #endif
void testRegister(void); int testRegister(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -426,6 +426,7 @@ typedef struct xen_op_v2_dom xen_op_v2_dom;
#include "internal.h" #include "internal.h"
#include "driver.h" #include "driver.h"
#include "xen_unified.h"
#include "xen_internal.h" #include "xen_internal.h"
#define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd" #define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd"
@ -436,8 +437,8 @@ static unsigned long xenHypervisorGetMaxMemory(virDomainPtr domain);
#endif #endif
#ifndef PROXY #ifndef PROXY
static virDriver xenHypervisorDriver = { virDriver xenHypervisorDriver = {
VIR_DRV_XEN_HYPERVISOR, -1,
"Xen", "Xen",
(DOM0_INTERFACE_VERSION >> 24) * 1000000 + (DOM0_INTERFACE_VERSION >> 24) * 1000000 +
((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + ((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 +
@ -446,7 +447,7 @@ static virDriver xenHypervisorDriver = {
xenHypervisorClose, /* close */ xenHypervisorClose, /* close */
xenHypervisorGetType, /* type */ xenHypervisorGetType, /* type */
xenHypervisorGetVersion, /* version */ xenHypervisorGetVersion, /* version */
xenHypervisorNumOfMaxVcpus, /* getMaxVcpus */ xenHypervisorGetMaxVcpus, /* getMaxVcpus */
NULL, /* nodeGetInfo */ NULL, /* nodeGetInfo */
xenHypervisorGetCapabilities, /* getCapabilities */ xenHypervisorGetCapabilities, /* getCapabilities */
xenHypervisorListDomains, /* listDomains */ xenHypervisorListDomains, /* listDomains */
@ -1176,7 +1177,7 @@ virXen_getvcpusinfo(int handle, int id, unsigned int vcpu, virVcpuInfoPtr ipt,
* Initialize the hypervisor layer. Try to detect the kind of interface * Initialize the hypervisor layer. Try to detect the kind of interface
* used i.e. pre or post changeset 10277 * used i.e. pre or post changeset 10277
*/ */
static int int
xenHypervisorInit(void) xenHypervisorInit(void)
{ {
int fd, ret, cmd, errcode; int fd, ret, cmd, errcode;
@ -1187,7 +1188,7 @@ xenHypervisorInit(void)
if (initialized) { if (initialized) {
if (hypervisor_version == -1) if (hypervisor_version == -1)
return(-1); return (-1);
return(0); return(0);
} }
initialized = 1; initialized = 1;
@ -1232,7 +1233,7 @@ xenHypervisorInit(void)
ret = open(XEN_HYPERVISOR_SOCKET, O_RDWR); ret = open(XEN_HYPERVISOR_SOCKET, O_RDWR);
if (ret < 0) { if (ret < 0) {
hypervisor_version = -1; hypervisor_version = -1;
return (-1); return(-1);
} }
fd = ret; fd = ret;
@ -1295,7 +1296,7 @@ xenHypervisorInit(void)
ipt = malloc(sizeof(virVcpuInfo)); ipt = malloc(sizeof(virVcpuInfo));
if (ipt == NULL){ if (ipt == NULL){
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "Memory allocation failed at xenHypervisorIniti()\n"); fprintf(stderr, "Memory allocation failed at xenHypervisorInit()\n");
#endif #endif
return(-1); return(-1);
} }
@ -1357,21 +1358,6 @@ xenHypervisorInit(void)
return(0); return(0);
} }
#ifndef PROXY
/**
* xenHypervisorRegister:
*
* Registers the xenHypervisor driver
*/
void xenHypervisorRegister(void)
{
if (initialized == 0)
xenHypervisorInit();
virRegisterDriver(&xenHypervisorDriver);
}
#endif /* !PROXY */
/** /**
* xenHypervisorOpen: * xenHypervisorOpen:
* @conn: pointer to the connection block * @conn: pointer to the connection block
@ -1383,17 +1369,17 @@ void xenHypervisorRegister(void)
* Returns 0 or -1 in case of error. * Returns 0 or -1 in case of error.
*/ */
int int
xenHypervisorOpen(virConnectPtr conn, const char *name, int flags) xenHypervisorOpen(virConnectPtr conn ATTRIBUTE_UNUSED,
const char *name ATTRIBUTE_UNUSED, int flags)
{ {
int ret; int ret;
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
if (initialized == 0) if (initialized == 0)
xenHypervisorInit(); if (xenHypervisorInit() == -1)
return -1;
if ((name != NULL) && (strcasecmp(name, "xen"))) priv->handle = -1;
return(-1);
conn->handle = -1;
ret = open(XEN_HYPERVISOR_SOCKET, O_RDWR); ret = open(XEN_HYPERVISOR_SOCKET, O_RDWR);
if (ret < 0) { if (ret < 0) {
@ -1401,7 +1387,8 @@ xenHypervisorOpen(virConnectPtr conn, const char *name, int flags)
virXenError(VIR_ERR_NO_XEN, XEN_HYPERVISOR_SOCKET, 0); virXenError(VIR_ERR_NO_XEN, XEN_HYPERVISOR_SOCKET, 0);
return (-1); return (-1);
} }
conn->handle = ret;
priv->handle = ret;
return(0); return(0);
} }
@ -1418,13 +1405,20 @@ int
xenHypervisorClose(virConnectPtr conn) xenHypervisorClose(virConnectPtr conn)
{ {
int ret; int ret;
xenUnifiedPrivatePtr priv;
if ((conn == NULL) || (conn->handle < 0)) if (conn == NULL)
return (-1); return (-1);
ret = close(conn->handle); priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->handle < 0)
return -1;
ret = close(priv->handle);
if (ret < 0) if (ret < 0)
return (-1); return (-1);
return (0); return (0);
} }
@ -1463,7 +1457,12 @@ xenHypervisorGetType(virConnectPtr conn)
int int
xenHypervisorGetVersion(virConnectPtr conn, unsigned long *hvVer) xenHypervisorGetVersion(virConnectPtr conn, unsigned long *hvVer)
{ {
if ((conn == NULL) || (conn->handle < 0) || (hvVer == NULL)) xenUnifiedPrivatePtr priv;
if (conn == NULL)
return -1;
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->handle < 0 || hvVer == NULL)
return (-1); return (-1);
*hvVer = (hv_version >> 16) * 1000000 + (hv_version & 0xFFFF) * 1000; *hvVer = (hv_version >> 16) * 1000000 + (hv_version & 0xFFFF) * 1000;
return(0); return(0);
@ -1778,8 +1777,12 @@ xenHypervisorNumOfDomains(virConnectPtr conn)
int ret, nbids; int ret, nbids;
static int last_maxids = 2; static int last_maxids = 2;
int maxids = last_maxids; int maxids = last_maxids;
xenUnifiedPrivatePtr priv;
if ((conn == NULL) || (conn->handle < 0)) if (conn == NULL)
return -1;
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->handle < 0)
return (-1); return (-1);
retry: retry:
@ -1791,7 +1794,7 @@ xenHypervisorNumOfDomains(virConnectPtr conn)
XEN_GETDOMAININFOLIST_CLEAR(dominfos, maxids); XEN_GETDOMAININFOLIST_CLEAR(dominfos, maxids);
ret = virXen_getdomaininfolist(conn->handle, 0, maxids, &dominfos); ret = virXen_getdomaininfolist(priv->handle, 0, maxids, &dominfos);
XEN_GETDOMAININFOLIST_FREE(dominfos); XEN_GETDOMAININFOLIST_FREE(dominfos);
@ -1824,8 +1827,13 @@ xenHypervisorListDomains(virConnectPtr conn, int *ids, int maxids)
{ {
xen_getdomaininfolist dominfos; xen_getdomaininfolist dominfos;
int ret, nbids, i; int ret, nbids, i;
xenUnifiedPrivatePtr priv;
if ((conn == NULL) || (conn->handle < 0) || if (conn == NULL)
return -1;
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->handle < 0 ||
(ids == NULL) || (maxids < 1)) (ids == NULL) || (maxids < 1))
return (-1); return (-1);
@ -1838,7 +1846,7 @@ xenHypervisorListDomains(virConnectPtr conn, int *ids, int maxids)
XEN_GETDOMAININFOLIST_CLEAR(dominfos, maxids); XEN_GETDOMAININFOLIST_CLEAR(dominfos, maxids);
memset(ids, 0, maxids * sizeof(int)); memset(ids, 0, maxids * sizeof(int));
ret = virXen_getdomaininfolist(conn->handle, 0, maxids, &dominfos); ret = virXen_getdomaininfolist(priv->handle, 0, maxids, &dominfos);
if (ret < 0) { if (ret < 0) {
XEN_GETDOMAININFOLIST_FREE(dominfos); XEN_GETDOMAININFOLIST_FREE(dominfos);
@ -1860,14 +1868,20 @@ xenHypervisorListDomains(virConnectPtr conn, int *ids, int maxids)
} }
/** /**
* xenHypervisorNumOfMaxVcpus: * xenHypervisorGetMaxVcpus:
* *
* Returns the maximum of CPU defined by Xen. * Returns the maximum of CPU defined by Xen.
*/ */
int int
xenHypervisorNumOfMaxVcpus(virConnectPtr conn) xenHypervisorGetMaxVcpus(virConnectPtr conn,
const char *type ATTRIBUTE_UNUSED)
{ {
if ((conn == NULL) || (conn->handle < 0)) xenUnifiedPrivatePtr priv;
if (conn == NULL)
return -1;
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->handle < 0)
return (-1); return (-1);
return MAX_VIRT_CPUS; return MAX_VIRT_CPUS;
@ -1886,11 +1900,16 @@ xenHypervisorNumOfMaxVcpus(virConnectPtr conn)
unsigned long unsigned long
xenHypervisorGetDomMaxMemory(virConnectPtr conn, int id) xenHypervisorGetDomMaxMemory(virConnectPtr conn, int id)
{ {
xenUnifiedPrivatePtr priv;
xen_getdomaininfo dominfo; xen_getdomaininfo dominfo;
int ret; int ret;
if ((conn == NULL) || (conn->handle < 0)) if (conn == NULL)
return (0); return 0;
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->handle < 0)
return 0;
if (kb_per_pages == 0) { if (kb_per_pages == 0) {
kb_per_pages = sysconf(_SC_PAGESIZE) / 1024; kb_per_pages = sysconf(_SC_PAGESIZE) / 1024;
@ -1900,7 +1919,7 @@ xenHypervisorGetDomMaxMemory(virConnectPtr conn, int id)
XEN_GETDOMAININFO_CLEAR(dominfo); XEN_GETDOMAININFO_CLEAR(dominfo);
ret = virXen_getdomaininfo(conn->handle, id, &dominfo); ret = virXen_getdomaininfo(priv->handle, id, &dominfo);
if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != id)) if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != id))
return (0); return (0);
@ -1922,8 +1941,13 @@ xenHypervisorGetDomMaxMemory(virConnectPtr conn, int id)
static unsigned long static unsigned long
xenHypervisorGetMaxMemory(virDomainPtr domain) xenHypervisorGetMaxMemory(virDomainPtr domain)
{ {
if ((domain == NULL) || (domain->conn == NULL) || xenUnifiedPrivatePtr priv;
(domain->conn->handle < 0) || (domain->id < 0))
if ((domain == NULL) || (domain->conn == NULL))
return 0;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->handle < 0 || domain->id < 0)
return (0); return (0);
return(xenHypervisorGetDomMaxMemory(domain->conn, domain->id)); return(xenHypervisorGetDomMaxMemory(domain->conn, domain->id));
@ -1943,6 +1967,7 @@ xenHypervisorGetMaxMemory(virDomainPtr domain)
int int
xenHypervisorGetDomInfo(virConnectPtr conn, int id, virDomainInfoPtr info) xenHypervisorGetDomInfo(virConnectPtr conn, int id, virDomainInfoPtr info)
{ {
xenUnifiedPrivatePtr priv;
xen_getdomaininfo dominfo; xen_getdomaininfo dominfo;
int ret; int ret;
uint32_t domain_flags, domain_state, domain_shutdown_cause; uint32_t domain_flags, domain_state, domain_shutdown_cause;
@ -1953,13 +1978,17 @@ xenHypervisorGetDomInfo(virConnectPtr conn, int id, virDomainInfoPtr info)
kb_per_pages = 4; kb_per_pages = 4;
} }
if ((conn == NULL) || (conn->handle < 0) || (info == NULL)) if (conn == NULL)
return -1;
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->handle < 0 || info == NULL)
return (-1); return (-1);
memset(info, 0, sizeof(virDomainInfo)); memset(info, 0, sizeof(virDomainInfo));
XEN_GETDOMAININFO_CLEAR(dominfo); XEN_GETDOMAININFO_CLEAR(dominfo);
ret = virXen_getdomaininfo(conn->handle, id, &dominfo); ret = virXen_getdomaininfo(priv->handle, id, &dominfo);
if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != id)) if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != id))
return (-1); return (-1);
@ -2020,8 +2049,13 @@ xenHypervisorGetDomInfo(virConnectPtr conn, int id, virDomainInfoPtr info)
int int
xenHypervisorGetDomainInfo(virDomainPtr domain, virDomainInfoPtr info) xenHypervisorGetDomainInfo(virDomainPtr domain, virDomainInfoPtr info)
{ {
if ((domain == NULL) || (domain->conn == NULL) || xenUnifiedPrivatePtr priv;
(domain->conn->handle < 0) || (info == NULL) ||
if ((domain == NULL) || (domain->conn == NULL))
return -1;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->handle < 0 || info == NULL ||
(domain->id < 0)) (domain->id < 0))
return (-1); return (-1);
@ -2042,12 +2076,16 @@ int
xenHypervisorPauseDomain(virDomainPtr domain) xenHypervisorPauseDomain(virDomainPtr domain)
{ {
int ret; int ret;
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || if ((domain == NULL) || (domain->conn == NULL))
(domain->conn->handle < 0) || (domain->id < 0)) return -1;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->handle < 0 || domain->id < 0)
return (-1); return (-1);
ret = virXen_pausedomain(domain->conn->handle, domain->id); ret = virXen_pausedomain(priv->handle, domain->id);
if (ret < 0) if (ret < 0)
return (-1); return (-1);
return (0); return (0);
@ -2065,12 +2103,16 @@ int
xenHypervisorResumeDomain(virDomainPtr domain) xenHypervisorResumeDomain(virDomainPtr domain)
{ {
int ret; int ret;
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || if ((domain == NULL) || (domain->conn == NULL))
(domain->conn->handle < 0) || (domain->id < 0)) return -1;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->handle < 0 || domain->id < 0)
return (-1); return (-1);
ret = virXen_unpausedomain(domain->conn->handle, domain->id); ret = virXen_unpausedomain(priv->handle, domain->id);
if (ret < 0) if (ret < 0)
return (-1); return (-1);
return (0); return (0);
@ -2088,12 +2130,16 @@ int
xenHypervisorDestroyDomain(virDomainPtr domain) xenHypervisorDestroyDomain(virDomainPtr domain)
{ {
int ret; int ret;
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || if (domain == NULL || domain->conn == NULL)
(domain->conn->handle < 0) || (domain->id < 0)) return -1;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->handle < 0 || domain->id < 0)
return (-1); return (-1);
ret = virXen_destroydomain(domain->conn->handle, domain->id); ret = virXen_destroydomain(priv->handle, domain->id);
if (ret < 0) if (ret < 0)
return (-1); return (-1);
return (0); return (0);
@ -2112,12 +2158,16 @@ int
xenHypervisorSetMaxMemory(virDomainPtr domain, unsigned long memory) xenHypervisorSetMaxMemory(virDomainPtr domain, unsigned long memory)
{ {
int ret; int ret;
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || if (domain == NULL || domain->conn == NULL)
(domain->conn->handle < 0) || (domain->id < 0)) return -1;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->handle < 0 || domain->id < 0)
return (-1); return (-1);
ret = virXen_setmaxmem(domain->conn->handle, domain->id, memory); ret = virXen_setmaxmem(priv->handle, domain->id, memory);
if (ret < 0) if (ret < 0)
return (-1); return (-1);
return (0); return (0);
@ -2139,13 +2189,16 @@ int
xenHypervisorSetVcpus(virDomainPtr domain, unsigned int nvcpus) xenHypervisorSetVcpus(virDomainPtr domain, unsigned int nvcpus)
{ {
int ret; int ret;
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || if (domain == NULL || domain->conn == NULL)
(domain->conn->handle < 0) || (domain->id < 0) || return -1;
(nvcpus < 1))
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->handle < 0 || domain->id < 0 || nvcpus < 1)
return (-1); return (-1);
ret = virXen_setmaxvcpus(domain->conn->handle, domain->id, nvcpus); ret = virXen_setmaxvcpus(priv->handle, domain->id, nvcpus);
if (ret < 0) if (ret < 0)
return (-1); return (-1);
return (0); return (0);
@ -2168,13 +2221,17 @@ xenHypervisorPinVcpu(virDomainPtr domain, unsigned int vcpu,
unsigned char *cpumap, int maplen) unsigned char *cpumap, int maplen)
{ {
int ret; int ret;
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || if (domain == NULL || domain->conn == NULL)
(domain->conn->handle < 0) || (domain->id < 0) || return -1;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->handle < 0 || (domain->id < 0) ||
(cpumap == NULL) || (maplen < 1)) (cpumap == NULL) || (maplen < 1))
return (-1); return (-1);
ret = virXen_setvcpumap(domain->conn->handle, domain->id, vcpu, ret = virXen_setvcpumap(priv->handle, domain->id, vcpu,
cpumap, maplen); cpumap, maplen);
if (ret < 0) if (ret < 0)
return (-1); return (-1);
@ -2208,12 +2265,15 @@ xenHypervisorGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo,
{ {
xen_getdomaininfo dominfo; xen_getdomaininfo dominfo;
int ret; int ret;
xenUnifiedPrivatePtr priv;
virVcpuInfoPtr ipt; virVcpuInfoPtr ipt;
int nbinfo, i; int nbinfo, i;
if ((domain == NULL) || (domain->conn == NULL) || if (domain == NULL || domain->conn == NULL)
(domain->conn->handle < 0) || (domain->id < 0) || return -1;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->handle < 0 || (domain->id < 0) ||
(info == NULL) || (maxinfo < 1) || (info == NULL) || (maxinfo < 1) ||
(sizeof(cpumap_t) & 7)) (sizeof(cpumap_t) & 7))
return (-1); return (-1);
@ -2222,7 +2282,7 @@ xenHypervisorGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo,
/* first get the number of virtual CPUs in this domain */ /* first get the number of virtual CPUs in this domain */
XEN_GETDOMAININFO_CLEAR(dominfo); XEN_GETDOMAININFO_CLEAR(dominfo);
ret = virXen_getdomaininfo(domain->conn->handle, domain->id, ret = virXen_getdomaininfo(priv->handle, domain->id,
&dominfo); &dominfo);
if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != domain->id)) if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != domain->id))
@ -2235,14 +2295,14 @@ xenHypervisorGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo,
for (i = 0, ipt = info; i < nbinfo; i++, ipt++) { for (i = 0, ipt = info; i < nbinfo; i++, ipt++) {
if ((cpumaps != NULL) && (i < maxinfo)) { if ((cpumaps != NULL) && (i < maxinfo)) {
ret = virXen_getvcpusinfo(domain->conn->handle, domain->id, i, ret = virXen_getvcpusinfo(priv->handle, domain->id, i,
ipt, ipt,
(unsigned char *)VIR_GET_CPUMAP(cpumaps, maplen, i), (unsigned char *)VIR_GET_CPUMAP(cpumaps, maplen, i),
maplen); maplen);
if (ret < 0) if (ret < 0)
return(-1); return(-1);
} else { } else {
ret = virXen_getvcpusinfo(domain->conn->handle, domain->id, i, ret = virXen_getvcpusinfo(priv->handle, domain->id, i,
ipt, NULL, 0); ipt, NULL, 0);
if (ret < 0) if (ret < 0)
return(-1); return(-1);
@ -2266,9 +2326,13 @@ xenHypervisorGetVcpuMax(virDomainPtr domain)
xen_getdomaininfo dominfo; xen_getdomaininfo dominfo;
int ret; int ret;
int maxcpu; int maxcpu;
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || if (domain == NULL || domain->conn == NULL)
(domain->conn->handle < 0)) return -1;
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->handle < 0)
return (-1); return (-1);
/* inactive domain */ /* inactive domain */
@ -2276,7 +2340,7 @@ xenHypervisorGetVcpuMax(virDomainPtr domain)
maxcpu = MAX_VIRT_CPUS; maxcpu = MAX_VIRT_CPUS;
} else { } else {
XEN_GETDOMAININFO_CLEAR(dominfo); XEN_GETDOMAININFO_CLEAR(dominfo);
ret = virXen_getdomaininfo(domain->conn->handle, domain->id, ret = virXen_getdomaininfo(priv->handle, domain->id,
&dominfo); &dominfo);
if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != domain->id)) if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != domain->id))

View File

@ -15,7 +15,11 @@
extern "C" { extern "C" {
#endif #endif
void xenHypervisorRegister (void); extern virDriver xenHypervisorDriver;
int xenHypervisorInit (void);
/* The following calls are made directly by the Xen proxy: */
int xenHypervisorOpen (virConnectPtr conn, int xenHypervisorOpen (virConnectPtr conn,
const char *name, const char *name,
int flags); int flags);
@ -36,7 +40,7 @@ int xenHypervisorNumOfDomains (virConnectPtr conn);
int xenHypervisorListDomains (virConnectPtr conn, int xenHypervisorListDomains (virConnectPtr conn,
int *ids, int *ids,
int maxids); int maxids);
int xenHypervisorNumOfMaxVcpus (virConnectPtr conn); int xenHypervisorGetMaxVcpus (virConnectPtr conn, const char *type);
int xenHypervisorDestroyDomain (virDomainPtr domain); int xenHypervisorDestroyDomain (virDomainPtr domain);
int xenHypervisorResumeDomain (virDomainPtr domain); int xenHypervisorResumeDomain (virDomainPtr domain);
int xenHypervisorPauseDomain (virDomainPtr domain); int xenHypervisorPauseDomain (virDomainPtr domain);

778
src/xen_unified.c Normal file
View File

@ -0,0 +1,778 @@
/*
* xen_unified.c: Unified Xen driver.
*
* Copyright (C) 2007 Red Hat, Inc.
*
* See COPYING.LIB for the License of this software
*
* Richard W.M. Jones <rjones@redhat.com>
*/
#ifdef WITH_XEN
/* Note:
*
* This driver provides a unified interface to the five
* separate underlying Xen drivers (xen_internal, proxy_internal,
* xend_internal, xs_internal and xm_internal). Historically
* the body of libvirt.c handled the five Xen drivers,
* and contained Xen-specific code.
*
* The interface between Xen drivers and xen_unified is
* the same as for "ordinary" libvirt drivers (ie. virDriverPtr),
* however this is just for convenience and may be changed
* in future. Libvirt.c should no longer call directly
* to the five underlying Xen drivers.
*/
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <xen/dom0_ops.h>
#include "internal.h"
#include "xen_unified.h"
#include "xen_internal.h"
#include "proxy_internal.h"
#include "xend_internal.h"
#include "xs_internal.h"
#include "xm_internal.h"
/* The five Xen drivers below us. */
static virDriverPtr drivers[] = {
&xenHypervisorDriver,
&xenProxyDriver,
&xenDaemonDriver,
&xenStoreDriver,
&xenXMDriver
};
static const int nb_drivers = sizeof drivers / sizeof drivers[0];
static const int hypervisor_offset = 0;
static const int proxy_offset = 1;
/**
* xenUnifiedError:
* @conn: the connection
* @error: the error number
* @info: extra information string
*
* Handle an error at the xend daemon interface
*/
static void
xenUnifiedError (virConnectPtr conn, virErrorNumber error, const char *info)
{
const char *errmsg;
errmsg = __virErrorMsg (error, info);
__virRaiseError (conn, NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR,
errmsg, info, NULL, 0, 0, errmsg, info);
}
/*----- Dispatch functions. -----*/
/* These dispatch functions follow the model used historically
* by libvirt.c -- trying each low-level Xen driver in turn
* until one succeeds. However since we know what low-level
* drivers can perform which functions, it is probably better
* in future to optimise these dispatch functions to just call
* the single function (or small number of appropriate functions)
* in the low level drivers directly.
*/
static int
xenUnifiedOpen (virConnectPtr conn, const char *name, int flags)
{
int i, j;
xenUnifiedPrivatePtr priv;
/* If name == NULL, name == "", or begins with "xen", then it's for us. */
if (!name || name[0] == '\0')
name = "xen";
if (strncasecmp (name, "xen", 3) != 0)
return VIR_DRV_OPEN_DECLINED;
/* Allocate per-connection private data. */
priv = malloc (sizeof *priv);
if (!priv) {
xenUnifiedError (conn, VIR_ERR_NO_MEMORY, "allocating private data");
return VIR_DRV_OPEN_ERROR;
}
conn->privateData = priv;
priv->handle = -1;
priv->xendConfigVersion = -1;
priv->type = -1;
priv->len = -1;
priv->addr = NULL;
priv->xshandle = NULL;
priv->proxy = -1;
for (i = 0; i < nb_drivers; ++i) {
int failed_to_open = 1;
/* Ignore proxy for root */
if (i == proxy_offset && getuid() == 0)
continue;
if (drivers[i]->open &&
drivers[i]->open (conn, name, flags) == VIR_DRV_OPEN_SUCCESS)
failed_to_open = 0;
/* If as root, then all drivers must succeed.
If non-root, then only proxy must succeed */
if (failed_to_open && (getuid() == 0 || i == proxy_offset)) {
for (j = 0; j < i; ++j)
drivers[j]->close (conn);
return VIR_DRV_OPEN_ERROR;
}
}
return VIR_DRV_OPEN_SUCCESS;
}
static int
xenUnifiedClose (virConnectPtr conn)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->close)
(void) drivers[i]->close (conn);
free (conn->privateData);
conn->privateData = NULL;
return 0;
}
static const char *
xenUnifiedType (virConnectPtr conn)
{
int i;
const char *ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->type) {
ret = drivers[i]->type (conn);
if (ret) return ret;
}
return NULL;
}
static int
xenUnifiedVersion (virConnectPtr conn, unsigned long *hvVer)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->version &&
drivers[i]->version (conn, hvVer) == 0)
return 0;
return -1;
}
static int
xenUnifiedGetMaxVcpus (virConnectPtr conn, const char *type)
{
int i;
if (!type)
type = "Xen";
for (i = 0; i < nb_drivers; ++i)
if (strcmp (drivers[i]->name, type) == 0)
return drivers[i]->getMaxVcpus (conn, type);
return -1;
}
static int
xenUnifiedNodeGetInfo (virConnectPtr conn, virNodeInfoPtr info)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->nodeGetInfo &&
drivers[i]->nodeGetInfo (conn, info) == 0)
return 0;
return -1;
}
static char *
xenUnifiedGetCapabilities (virConnectPtr conn)
{
int i;
char *ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->getCapabilities) {
ret = drivers[i]->getCapabilities (conn);
if (ret) return ret;
}
return NULL;
}
static int
xenUnifiedListDomains (virConnectPtr conn, int *ids, int maxids)
{
int i, ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->listDomains) {
ret = drivers[i]->listDomains (conn, ids, maxids);
if (ret >= 0) return ret;
}
return -1;
}
static int
xenUnifiedNumOfDomains (virConnectPtr conn)
{
int i, ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->numOfDomains) {
ret = drivers[i]->numOfDomains (conn);
if (ret >= 0) return ret;
}
return -1;
}
static virDomainPtr
xenUnifiedDomainCreateLinux (virConnectPtr conn,
const char *xmlDesc, unsigned int flags)
{
int i;
virDomainPtr ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainCreateLinux) {
ret = drivers[i]->domainCreateLinux (conn, xmlDesc, flags);
if (ret) return ret;
}
return NULL;
}
static virDomainPtr
xenUnifiedDomainLookupByID (virConnectPtr conn, int id)
{
int i;
virDomainPtr ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainLookupByID) {
ret = drivers[i]->domainLookupByID (conn, id);
if (ret) return ret;
}
return NULL;
}
static virDomainPtr
xenUnifiedDomainLookupByUUID (virConnectPtr conn,
const unsigned char *uuid)
{
int i;
virDomainPtr ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainLookupByUUID) {
ret = drivers[i]->domainLookupByUUID (conn, uuid);
if (ret) return ret;
}
return NULL;
}
static virDomainPtr
xenUnifiedDomainLookupByName (virConnectPtr conn,
const char *name)
{
int i;
virDomainPtr ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainLookupByName) {
ret = drivers[i]->domainLookupByName (conn, name);
if (ret) return ret;
}
return NULL;
}
static int
xenUnifiedDomainSuspend (virDomainPtr dom)
{
int i;
/* Try non-hypervisor methods first, then hypervisor direct method
* as a last resort.
*/
for (i = 0; i < nb_drivers; ++i)
if (i != hypervisor_offset &&
drivers[i]->domainSuspend &&
drivers[i]->domainSuspend (dom) == 0)
return 0;
if (drivers[hypervisor_offset]->domainSuspend &&
drivers[hypervisor_offset]->domainSuspend (dom) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainResume (virDomainPtr dom)
{
int i;
/* Try non-hypervisor methods first, then hypervisor direct method
* as a last resort.
*/
for (i = 0; i < nb_drivers; ++i)
if (i != hypervisor_offset &&
drivers[i]->domainResume &&
drivers[i]->domainResume (dom) == 0)
return 0;
if (drivers[hypervisor_offset]->domainResume &&
drivers[hypervisor_offset]->domainResume (dom) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainShutdown (virDomainPtr dom)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainShutdown &&
drivers[i]->domainShutdown (dom) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainReboot (virDomainPtr dom, unsigned int flags)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainReboot &&
drivers[i]->domainReboot (dom, flags) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainDestroy (virDomainPtr dom)
{
int i;
/* Try non-hypervisor methods first, then hypervisor direct method
* as a last resort.
*/
for (i = 0; i < nb_drivers; ++i)
if (i != hypervisor_offset &&
drivers[i]->domainDestroy &&
drivers[i]->domainDestroy (dom) == 0)
return 0;
if (drivers[hypervisor_offset]->domainDestroy &&
drivers[hypervisor_offset]->domainDestroy (dom) == 0)
return 0;
return -1;
}
static char *
xenUnifiedDomainGetOSType (virDomainPtr dom)
{
int i;
char *ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainGetOSType) {
ret = drivers[i]->domainGetOSType (dom);
if (ret) return ret;
}
return NULL;
}
static unsigned long
xenUnifiedDomainGetMaxMemory (virDomainPtr dom)
{
int i;
unsigned long ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainGetMaxMemory) {
ret = drivers[i]->domainGetMaxMemory (dom);
if (ret != 0) return ret;
}
return 0;
}
static int
xenUnifiedDomainSetMaxMemory (virDomainPtr dom, unsigned long memory)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainSetMaxMemory &&
drivers[i]->domainSetMaxMemory (dom, memory) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainSetMemory (virDomainPtr dom, unsigned long memory)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainSetMemory &&
drivers[i]->domainSetMemory (dom, memory) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainGetInfo (virDomainPtr dom, virDomainInfoPtr info)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainGetInfo &&
drivers[i]->domainGetInfo (dom, info) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainSave (virDomainPtr dom, const char *to)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainSave &&
drivers[i]->domainSave (dom, to) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainRestore (virConnectPtr conn, const char *from)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainRestore &&
drivers[i]->domainRestore (conn, from) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainCoreDump (virDomainPtr dom, const char *to, int flags)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainCoreDump &&
drivers[i]->domainCoreDump (dom, to, flags) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
{
int i;
/* Try non-hypervisor methods first, then hypervisor direct method
* as a last resort.
*/
for (i = 0; i < nb_drivers; ++i)
if (i != hypervisor_offset &&
drivers[i]->domainSetVcpus &&
drivers[i]->domainSetVcpus (dom, nvcpus) == 0)
return 0;
if (drivers[hypervisor_offset]->domainSetVcpus &&
drivers[hypervisor_offset]->domainSetVcpus (dom, nvcpus) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainPinVcpu (virDomainPtr dom, unsigned int vcpu,
unsigned char *cpumap, int maplen)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainPinVcpu &&
drivers[i]->domainPinVcpu (dom, vcpu, cpumap, maplen) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainGetVcpus (virDomainPtr dom,
virVcpuInfoPtr info, int maxinfo,
unsigned char *cpumaps, int maplen)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainGetVcpus &&
drivers[i]->domainGetVcpus (dom, info, maxinfo, cpumaps, maplen) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
{
int i, ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainGetMaxVcpus) {
ret = drivers[i]->domainGetMaxVcpus (dom);
if (ret != 0) return ret;
}
return -1;
}
static char *
xenUnifiedDomainDumpXML (virDomainPtr dom, int flags)
{
int i;
char *ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainDumpXML) {
ret = drivers[i]->domainDumpXML (dom, flags);
if (ret) return ret;
}
return NULL;
}
static int
xenUnifiedListDefinedDomains (virConnectPtr conn, char **const names,
int maxnames)
{
int i;
int ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->listDefinedDomains) {
ret = drivers[i]->listDefinedDomains (conn, names, maxnames);
if (ret >= 0) return ret;
}
return -1;
}
static int
xenUnifiedNumOfDefinedDomains (virConnectPtr conn)
{
int i;
int ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->numOfDefinedDomains) {
ret = drivers[i]->numOfDefinedDomains (conn);
if (ret >= 0) return ret;
}
return -1;
}
static int
xenUnifiedDomainCreate (virDomainPtr dom)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainCreate &&
drivers[i]->domainCreate (dom) == 0)
return 0;
return -1;
}
static virDomainPtr
xenUnifiedDomainDefineXML (virConnectPtr conn, const char *xml)
{
int i;
virDomainPtr ret;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainDefineXML) {
ret = drivers[i]->domainDefineXML (conn, xml);
if (ret) return ret;
}
return NULL;
}
static int
xenUnifiedDomainUndefine (virDomainPtr dom)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainUndefine &&
drivers[i]->domainUndefine (dom) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainAttachDevice (virDomainPtr dom, char *xml)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainAttachDevice &&
drivers[i]->domainAttachDevice (dom, xml) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainDetachDevice (virDomainPtr dom, char *xml)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainDetachDevice &&
drivers[i]->domainDetachDevice (dom, xml) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainGetAutostart (virDomainPtr dom, int *autostart)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainGetAutostart &&
drivers[i]->domainGetAutostart (dom, autostart) == 0)
return 0;
return -1;
}
static int
xenUnifiedDomainSetAutostart (virDomainPtr dom, int autostart)
{
int i;
for (i = 0; i < nb_drivers; ++i)
if (drivers[i]->domainSetAutostart &&
drivers[i]->domainSetAutostart (dom, autostart) == 0)
return 0;
return -1;
}
/*----- Register with libvirt.c, and initialise Xen drivers. -----*/
#define VERSION ((DOM0_INTERFACE_VERSION >> 24) * 1000000 + \
((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + \
(DOM0_INTERFACE_VERSION & 0xFFFF))
/* The interface which we export upwards to libvirt.c. */
static virDriver xenUnifiedDriver = {
.no = VIR_DRV_XEN_UNIFIED,
.name = "xen",
.ver = VERSION,
.open = xenUnifiedOpen,
.close = xenUnifiedClose,
.type = xenUnifiedType,
.version = xenUnifiedVersion,
.getMaxVcpus = xenUnifiedGetMaxVcpus,
.nodeGetInfo = xenUnifiedNodeGetInfo,
.getCapabilities = xenUnifiedGetCapabilities,
.listDomains = xenUnifiedListDomains,
.numOfDomains = xenUnifiedNumOfDomains,
.domainCreateLinux = xenUnifiedDomainCreateLinux,
.domainLookupByID = xenUnifiedDomainLookupByID,
.domainLookupByUUID = xenUnifiedDomainLookupByUUID,
.domainLookupByName = xenUnifiedDomainLookupByName,
.domainSuspend = xenUnifiedDomainSuspend,
.domainResume = xenUnifiedDomainResume,
.domainShutdown = xenUnifiedDomainShutdown,
.domainReboot = xenUnifiedDomainReboot,
.domainDestroy = xenUnifiedDomainDestroy,
.domainGetOSType = xenUnifiedDomainGetOSType,
.domainGetMaxMemory = xenUnifiedDomainGetMaxMemory,
.domainSetMaxMemory = xenUnifiedDomainSetMaxMemory,
.domainSetMemory = xenUnifiedDomainSetMemory,
.domainGetInfo = xenUnifiedDomainGetInfo,
.domainSave = xenUnifiedDomainSave,
.domainRestore = xenUnifiedDomainRestore,
.domainCoreDump = xenUnifiedDomainCoreDump,
.domainSetVcpus = xenUnifiedDomainSetVcpus,
.domainPinVcpu = xenUnifiedDomainPinVcpu,
.domainGetVcpus = xenUnifiedDomainGetVcpus,
.domainGetMaxVcpus = xenUnifiedDomainGetMaxVcpus,
.domainDumpXML = xenUnifiedDomainDumpXML,
.listDefinedDomains = xenUnifiedListDefinedDomains,
.numOfDefinedDomains = xenUnifiedNumOfDefinedDomains,
.domainCreate = xenUnifiedDomainCreate,
.domainDefineXML = xenUnifiedDomainDefineXML,
.domainUndefine = xenUnifiedDomainUndefine,
.domainAttachDevice = xenUnifiedDomainAttachDevice,
.domainDetachDevice = xenUnifiedDomainDetachDevice,
.domainGetAutostart = xenUnifiedDomainGetAutostart,
.domainSetAutostart = xenUnifiedDomainSetAutostart,
};
int
xenUnifiedRegister (void)
{
/* Ignore failures here. */
(void) xenHypervisorInit ();
(void) xenProxyInit ();
(void) xenDaemonInit ();
(void) xenStoreInit ();
(void) xenXMInit ();
return virRegisterDriver (&xenUnifiedDriver);
}
#endif /* WITH_XEN */

53
src/xen_unified.h Normal file
View File

@ -0,0 +1,53 @@
/*
* xen_unified.c: Unified Xen driver.
*
* Copyright (C) 2007 Red Hat, Inc.
*
* See COPYING.LIB for the License of this software
*
* Richard W.M. Jones <rjones@redhat.com>
*/
#ifndef __VIR_XEN_UNIFIED_H__
#define __VIR_XEN_UNIFIED_H__
#include "internal.h"
#ifdef __cplusplus
extern "C" {
#endif
extern int xenUnifiedRegister (void);
/* xenUnifiedPrivatePtr:
*
* Per-connection private data, stored in conn->privateData. All Xen
* low-level drivers access parts of this structure.
*/
struct _xenUnifiedPrivate {
#ifdef WITH_XEN
int handle; /* Xen hypervisor handle */
int xendConfigVersion; /* XenD config version */
/* XXX This code is not IPv6 aware. */
/* connection to xend */
int type; /* PF_UNIX or PF_INET */
int len; /* length of addr */
struct sockaddr *addr; /* type of address used */
struct sockaddr_un addr_un; /* the unix address */
struct sockaddr_in addr_in; /* the inet address */
struct xs_handle *xshandle; /* handle to talk to the xenstore */
#endif /* WITH_XEN */
int proxy; /* fd of proxy. */
};
typedef struct _xenUnifiedPrivate *xenUnifiedPrivatePtr;
#ifdef __cplusplus
}
#endif
#endif /* __VIR_XEN_UNIFIED_H__ */

View File

@ -34,6 +34,7 @@
#include "internal.h" #include "internal.h"
#include "sexpr.h" #include "sexpr.h"
#include "xml.h" #include "xml.h"
#include "xen_unified.h"
#include "xend_internal.h" #include "xend_internal.h"
#include "xen_internal.h" /* for DOM0_INTERFACE_VERSION */ #include "xen_internal.h" /* for DOM0_INTERFACE_VERSION */
#include "xs_internal.h" /* To extract VNC port & Serial console TTY */ #include "xs_internal.h" /* To extract VNC port & Serial console TTY */
@ -60,8 +61,8 @@ static int xenDaemonDomainCoreDump(virDomainPtr domain, const char *filename,
#endif /* PROXY */ #endif /* PROXY */
#ifndef PROXY #ifndef PROXY
static virDriver xenDaemonDriver = { virDriver xenDaemonDriver = {
VIR_DRV_XEN_DAEMON, -1,
"XenDaemon", "XenDaemon",
(DOM0_INTERFACE_VERSION >> 24) * 1000000 + (DOM0_INTERFACE_VERSION >> 24) * 1000000 +
((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + ((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 +
@ -109,13 +110,14 @@ static virDriver xenDaemonDriver = {
}; };
/** /**
* xenDaemonRegister: * xenDaemonInit:
* *
* Registers the xenDaemon driver * Initialise the xenDaemon driver.
*/ */
void xenDaemonRegister(void) int
xenDaemonInit (void)
{ {
virRegisterDriver(&xenDaemonDriver); return 0;
} }
#endif /* !PROXY */ #endif /* !PROXY */
@ -210,8 +212,9 @@ do_connect(virConnectPtr xend)
int s; int s;
int serrno; int serrno;
int no_slow_start = 1; int no_slow_start = 1;
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) xend->privateData;
s = socket(xend->type, SOCK_STREAM, 0); s = socket(priv->type, SOCK_STREAM, 0);
if (s == -1) { if (s == -1) {
virXendError(xend, VIR_ERR_INTERNAL_ERROR, virXendError(xend, VIR_ERR_INTERNAL_ERROR,
"failed to create a socket"); "failed to create a socket");
@ -225,7 +228,7 @@ do_connect(virConnectPtr xend)
sizeof(no_slow_start)); sizeof(no_slow_start));
if (connect(s, xend->addr, xend->len) == -1) { if (connect(s, priv->addr, priv->len) == -1) {
serrno = errno; serrno = errno;
close(s); close(s);
errno = serrno; errno = serrno;
@ -830,21 +833,22 @@ int
xenDaemonOpen_unix(virConnectPtr conn, const char *path) xenDaemonOpen_unix(virConnectPtr conn, const char *path)
{ {
struct sockaddr_un *addr; struct sockaddr_un *addr;
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
if ((conn == NULL) || (path == NULL)) if ((conn == NULL) || (path == NULL))
return (-1); return (-1);
addr = &conn->addr_un; addr = &priv->addr_un;
addr->sun_family = AF_UNIX; addr->sun_family = AF_UNIX;
memset(addr->sun_path, 0, sizeof(addr->sun_path)); memset(addr->sun_path, 0, sizeof(addr->sun_path));
strncpy(addr->sun_path, path, sizeof(addr->sun_path)); strncpy(addr->sun_path, path, sizeof(addr->sun_path));
conn->len = sizeof(addr->sun_family) + strlen(addr->sun_path); priv->len = sizeof(addr->sun_family) + strlen(addr->sun_path);
if ((unsigned int) conn->len > sizeof(addr->sun_path)) if ((unsigned int) priv->len > sizeof(addr->sun_path))
conn->len = sizeof(addr->sun_path); priv->len = sizeof(addr->sun_path);
conn->addr = (struct sockaddr *) addr; priv->addr = (struct sockaddr *) addr;
conn->type = PF_UNIX; priv->type = PF_UNIX;
return (0); return (0);
} }
@ -866,10 +870,13 @@ xenDaemonOpen_tcp(virConnectPtr conn, const char *host, int port)
{ {
struct in_addr ip; struct in_addr ip;
struct hostent *pent; struct hostent *pent;
xenUnifiedPrivatePtr priv;
if ((conn == NULL) || (host == NULL) || (port <= 0)) if ((conn == NULL) || (host == NULL) || (port <= 0))
return (-1); return (-1);
priv = (xenUnifiedPrivatePtr) conn->privateData;
pent = gethostbyname(host); pent = gethostbyname(host);
if (pent == NULL) { if (pent == NULL) {
if (inet_aton(host, &ip) == 0) { if (inet_aton(host, &ip) == 0) {
@ -881,13 +888,13 @@ xenDaemonOpen_tcp(virConnectPtr conn, const char *host, int port)
memcpy(&ip, pent->h_addr_list[0], sizeof(ip)); memcpy(&ip, pent->h_addr_list[0], sizeof(ip));
} }
conn->len = sizeof(struct sockaddr_in); priv->len = sizeof(struct sockaddr_in);
conn->addr = (struct sockaddr *) &conn->addr_in; priv->addr = (struct sockaddr *) &priv->addr_in;
conn->type = PF_INET; priv->type = PF_INET;
conn->addr_in.sin_family = AF_INET; priv->addr_in.sin_family = AF_INET;
conn->addr_in.sin_port = htons(port); priv->addr_in.sin_port = htons(port);
memcpy(&conn->addr_in.sin_addr, &ip, sizeof(ip)); memcpy(&priv->addr_in.sin_addr, &ip, sizeof(ip));
return (0); return (0);
} }
@ -1121,12 +1128,15 @@ static int
xend_detect_config_version(virConnectPtr conn) { xend_detect_config_version(virConnectPtr conn) {
struct sexpr *root; struct sexpr *root;
const char *value; const char *value;
xenUnifiedPrivatePtr priv;
if (!VIR_IS_CONNECT(conn)) { if (!VIR_IS_CONNECT(conn)) {
virXendError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__); virXendError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
return (-1); return (-1);
} }
priv = (xenUnifiedPrivatePtr) conn->privateData;
root = sexpr_get(conn, "/xend/node/"); root = sexpr_get(conn, "/xend/node/");
if (root == NULL) if (root == NULL)
return (-1); return (-1);
@ -1134,14 +1144,14 @@ xend_detect_config_version(virConnectPtr conn) {
value = sexpr_node(root, "node/xend_config_format"); value = sexpr_node(root, "node/xend_config_format");
if (value) { if (value) {
conn->xendConfigVersion = strtol(value, NULL, 10); priv->xendConfigVersion = strtol(value, NULL, 10);
} else { } else {
/* Xen prior to 3.0.3 did not have the xend_config_format /* Xen prior to 3.0.3 did not have the xend_config_format
field, and is implicitly version 1. */ field, and is implicitly version 1. */
conn->xendConfigVersion = 1; priv->xendConfigVersion = 1;
} }
sexpr_free(root); sexpr_free(root);
return conn->xendConfigVersion; return priv->xendConfigVersion;
} }
/** /**
@ -1804,10 +1814,13 @@ sexpr_to_domain(virConnectPtr conn, struct sexpr *root)
char uuid[VIR_UUID_BUFLEN]; char uuid[VIR_UUID_BUFLEN];
const char *name; const char *name;
const char *tmp; const char *tmp;
xenUnifiedPrivatePtr priv;
if ((conn == NULL) || (root == NULL)) if ((conn == NULL) || (root == NULL))
return(NULL); return(NULL);
priv = (xenUnifiedPrivatePtr) conn->privateData;
dst_uuid = (char *) &uuid[0]; dst_uuid = (char *) &uuid[0];
if (sexpr_uuid(&dst_uuid, root, "domain/uuid") == NULL) if (sexpr_uuid(&dst_uuid, root, "domain/uuid") == NULL)
goto error; goto error;
@ -1824,7 +1837,7 @@ sexpr_to_domain(virConnectPtr conn, struct sexpr *root)
/* New 3.0.4 XenD will not report a domid for inactive domains, /* New 3.0.4 XenD will not report a domid for inactive domains,
* so only error out for old XenD * so only error out for old XenD
*/ */
if (!tmp && conn->xendConfigVersion < 3) if (!tmp && priv->xendConfigVersion < 3)
goto error; goto error;
if (tmp) if (tmp)
@ -1873,79 +1886,85 @@ xenDaemonOpen(virConnectPtr conn, const char *name, int flags)
int ret; int ret;
unsigned long version; unsigned long version;
if ((name == NULL) || (name[0] == 0) || (!strcasecmp(name, "xen"))) { /* If the name is just "xen" (it might originally have been NULL, see
/* * xenUnifiedOpen) then try default paths and methods to get to the
* try first to open the unix socket * xend socket.
*/ */
ret = xenDaemonOpen_unix(conn, "/var/lib/xend/xend-socket"); if (strcasecmp (name, "xen") == 0) {
if (ret < 0)
goto try_http;
ret = xenDaemonGetVersion(conn, &version);
if (ret == 0)
goto done;
try_http:
/* /*
* try though http on port 8000 * try first to open the unix socket
*/ */
ret = xenDaemonOpen_tcp(conn, "localhost", 8000); ret = xenDaemonOpen_unix(conn, "/var/lib/xend/xend-socket");
if (ret < 0) if (ret < 0)
goto failed; goto try_http;
ret = xenDaemonGetVersion(conn, &version); ret = xenDaemonGetVersion(conn, &version);
if (ret < 0) if (ret == 0)
goto failed; goto done;
try_http:
/*
* try though http on port 8000
*/
ret = xenDaemonOpen_tcp(conn, "localhost", 8000);
if (ret < 0)
goto failed;
ret = xenDaemonGetVersion(conn, &version);
if (ret < 0)
goto failed;
} else { } else {
/* /*
* We were given a connection name, expected to be an URL * We were given a connection name, expected to be an URL
*/ */
uri = xmlParseURI(name); uri = xmlParseURI(name);
if (uri == NULL) { if (uri == NULL) {
if (!(flags & VIR_DRV_OPEN_QUIET)) if (!(flags & VIR_DRV_OPEN_QUIET))
virXendError(conn, VIR_ERR_NO_SUPPORT, name); virXendError(conn, VIR_ERR_NO_SUPPORT, name);
goto failed; goto failed;
} }
if (uri->scheme == NULL) { if (uri->scheme == NULL) {
/* It should be a file access */ /* It should be a file access */
if (uri->path == NULL) { if (uri->path == NULL) {
if (!(flags & VIR_DRV_OPEN_QUIET)) if (!(flags & VIR_DRV_OPEN_QUIET))
virXendError(conn, VIR_ERR_NO_SUPPORT, name); virXendError(conn, VIR_ERR_NO_SUPPORT, name);
goto failed; goto failed;
} }
ret = xenDaemonOpen_unix(conn, uri->path); ret = xenDaemonOpen_unix(conn, uri->path);
if (ret < 0)
goto failed;
ret = xenDaemonGetVersion(conn, &version);
if (ret < 0)
goto failed;
} else if (!strcasecmp(uri->scheme, "http")) {
ret = xenDaemonOpen_tcp(conn, uri->server, uri->port);
if (ret < 0) if (ret < 0)
goto failed; goto failed;
ret = xenDaemonGetVersion(conn, &version);
if (ret < 0) ret = xenDaemonGetVersion(conn, &version);
goto failed; if (ret < 0)
} else { goto failed;
if (!(flags & VIR_DRV_OPEN_QUIET)) } else if (!strcasecmp(uri->scheme, "http")) {
virXendError(conn, VIR_ERR_NO_SUPPORT, name); ret = xenDaemonOpen_tcp(conn, uri->server, uri->port);
goto failed; if (ret < 0)
} goto failed;
ret = xenDaemonGetVersion(conn, &version);
if (ret < 0)
goto failed;
} else {
if (!(flags & VIR_DRV_OPEN_QUIET))
virXendError(conn, VIR_ERR_NO_SUPPORT, name);
goto failed;
}
} }
done: done:
/* The XenD config version is used to determine /* The XenD config version is used to determine
* which APIs / features to activate. Lookup & cache * which APIs / features to activate. Lookup & cache
* it now to avoid repeated HTTP calls * it now to avoid repeated HTTP calls
*/ */
if (xend_detect_config_version(conn) < 0) { if (xend_detect_config_version(conn) < 0) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR, "cannot determine xend config version"); virXendError(conn, VIR_ERR_INTERNAL_ERROR,
"cannot determine xend config version");
goto failed; goto failed;
} }
if (uri != NULL) if (uri != NULL)
xmlFreeURI(uri); xmlFreeURI(uri);
return(ret); return(ret);
failed: failed:
if (uri != NULL) if (uri != NULL)
xmlFreeURI(uri); xmlFreeURI(uri);
@ -1961,12 +1980,12 @@ failed:
* initialized with xenDaemonOpen is no longer needed * initialized with xenDaemonOpen is no longer needed
* to free the associated resources. * to free the associated resources.
* *
* Returns 0 in case of succes, -1 in case of error * Returns 0 in case of success, -1 in case of error
*/ */
int int
xenDaemonClose(virConnectPtr conn ATTRIBUTE_UNUSED) xenDaemonClose(virConnectPtr conn ATTRIBUTE_UNUSED)
{ {
return(0); return 0;
} }
/** /**
@ -2177,13 +2196,17 @@ xenDaemonDomainGetMaxMemory(virDomainPtr domain)
{ {
unsigned long ret = 0; unsigned long ret = 0;
struct sexpr *root; struct sexpr *root;
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) { if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG, virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
__FUNCTION__); __FUNCTION__);
return(-1); return(-1);
} }
if (domain->id < 0 && domain->conn->xendConfigVersion < 3)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (domain->id < 0 && priv->xendConfigVersion < 3)
return(-1); return(-1);
/* can we ask for a subset ? worth it ? */ /* can we ask for a subset ? worth it ? */
@ -2213,13 +2236,17 @@ int
xenDaemonDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) xenDaemonDomainSetMaxMemory(virDomainPtr domain, unsigned long memory)
{ {
char buf[1024]; char buf[1024];
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) { if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG, virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
__FUNCTION__); __FUNCTION__);
return(-1); return(-1);
} }
if (domain->id < 0 && domain->conn->xendConfigVersion < 3)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (domain->id < 0 && priv->xendConfigVersion < 3)
return(-1); return(-1);
snprintf(buf, sizeof(buf), "%lu", memory >> 10); snprintf(buf, sizeof(buf), "%lu", memory >> 10);
@ -2247,13 +2274,17 @@ int
xenDaemonDomainSetMemory(virDomainPtr domain, unsigned long memory) xenDaemonDomainSetMemory(virDomainPtr domain, unsigned long memory)
{ {
char buf[1024]; char buf[1024];
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) { if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG, virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
__FUNCTION__); __FUNCTION__);
return(-1); return(-1);
} }
if (domain->id < 0 && domain->conn->xendConfigVersion < 3)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (domain->id < 0 && priv->xendConfigVersion < 3)
return(-1); return(-1);
snprintf(buf, sizeof(buf), "%lu", memory >> 10); snprintf(buf, sizeof(buf), "%lu", memory >> 10);
@ -2271,12 +2302,15 @@ xenDaemonDomainDumpXMLByID(virConnectPtr conn, int domid)
{ {
char *ret = NULL; char *ret = NULL;
struct sexpr *root; struct sexpr *root;
xenUnifiedPrivatePtr priv;
root = sexpr_get(conn, "/xend/domain/%d?detail=1", domid); root = sexpr_get(conn, "/xend/domain/%d?detail=1", domid);
if (root == NULL) if (root == NULL)
return (NULL); return (NULL);
ret = xend_parse_sexp_desc(conn, root, conn->xendConfigVersion); priv = (xenUnifiedPrivatePtr) conn->privateData;
ret = xend_parse_sexp_desc(conn, root, priv->xendConfigVersion);
sexpr_free(root); sexpr_free(root);
return (ret); return (ret);
@ -2287,12 +2321,15 @@ xenDaemonDomainDumpXMLByName(virConnectPtr conn, const char *name)
{ {
char *ret = NULL; char *ret = NULL;
struct sexpr *root; struct sexpr *root;
xenUnifiedPrivatePtr priv;
root = sexpr_get(conn, "/xend/domain/%s?detail=1", name); root = sexpr_get(conn, "/xend/domain/%s?detail=1", name);
if (root == NULL) if (root == NULL)
return (NULL); return (NULL);
ret = xend_parse_sexp_desc(conn, root, conn->xendConfigVersion); priv = (xenUnifiedPrivatePtr) conn->privateData;
ret = xend_parse_sexp_desc(conn, root, priv->xendConfigVersion);
sexpr_free(root); sexpr_free(root);
return (ret); return (ret);
@ -2312,12 +2349,16 @@ xenDaemonDomainDumpXMLByName(virConnectPtr conn, const char *name)
char * char *
xenDaemonDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED) xenDaemonDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED)
{ {
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) { if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG, virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
__FUNCTION__); __FUNCTION__);
return(NULL); return(NULL);
} }
if (domain->id < 0 && domain->conn->xendConfigVersion < 3) priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (domain->id < 0 && priv->xendConfigVersion < 3)
return(NULL); return(NULL);
if (domain->id < 0) if (domain->id < 0)
return xenDaemonDomainDumpXMLByName(domain->conn, domain->name); return xenDaemonDomainDumpXMLByName(domain->conn, domain->name);
@ -2341,6 +2382,7 @@ xenDaemonDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
{ {
struct sexpr *root; struct sexpr *root;
int ret; int ret;
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) || if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
(info == NULL)) { (info == NULL)) {
@ -2348,7 +2390,10 @@ xenDaemonDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
__FUNCTION__); __FUNCTION__);
return(-1); return(-1);
} }
if (domain->id < 0 && domain->conn->xendConfigVersion < 3)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (domain->id < 0 && priv->xendConfigVersion < 3)
return(-1); return(-1);
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name); root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
@ -2625,6 +2670,7 @@ int
xenDaemonDomainSetVcpus(virDomainPtr domain, unsigned int vcpus) xenDaemonDomainSetVcpus(virDomainPtr domain, unsigned int vcpus)
{ {
char buf[VIR_UUID_BUFLEN]; char buf[VIR_UUID_BUFLEN];
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
|| (vcpus < 1)) { || (vcpus < 1)) {
@ -2632,7 +2678,10 @@ xenDaemonDomainSetVcpus(virDomainPtr domain, unsigned int vcpus)
__FUNCTION__); __FUNCTION__);
return (-1); return (-1);
} }
if (domain->id < 0 && domain->conn->xendConfigVersion < 3)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (domain->id < 0 && priv->xendConfigVersion < 3)
return(-1); return(-1);
snprintf(buf, sizeof(buf), "%d", vcpus); snprintf(buf, sizeof(buf), "%d", vcpus);
@ -2790,8 +2839,10 @@ xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
virDomainPtr ret; virDomainPtr ret;
char *name = NULL; char *name = NULL;
int id = -1; int id = -1;
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
/* Old approach for xen <= 3.0.3 */ /* Old approach for xen <= 3.0.3 */
if (conn->xendConfigVersion < 3) { if (priv->xendConfigVersion < 3) {
char **names, **tmp; char **names, **tmp;
unsigned char ident[VIR_UUID_BUFLEN]; unsigned char ident[VIR_UUID_BUFLEN];
names = xenDaemonListDomainsOld(conn); names = xenDaemonListDomainsOld(conn);
@ -2871,6 +2922,7 @@ xenDaemonCreateLinux(virConnectPtr conn, const char *xmlDesc,
char *sexpr; char *sexpr;
char *name = NULL; char *name = NULL;
virDomainPtr dom = NULL; virDomainPtr dom = NULL;
xenUnifiedPrivatePtr priv;
if (!VIR_IS_CONNECT(conn)) { if (!VIR_IS_CONNECT(conn)) {
virXendError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__); virXendError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
@ -2881,7 +2933,9 @@ xenDaemonCreateLinux(virConnectPtr conn, const char *xmlDesc,
return (NULL); return (NULL);
} }
sexpr = virDomainParseXMLDesc(conn, xmlDesc, &name, conn->xendConfigVersion); priv = (xenUnifiedPrivatePtr) conn->privateData;
sexpr = virDomainParseXMLDesc(conn, xmlDesc, &name, priv->xendConfigVersion);
if ((sexpr == NULL) || (name == NULL)) { if ((sexpr == NULL) || (name == NULL)) {
virXendError(conn, VIR_ERR_XML_ERROR, "domain"); virXendError(conn, VIR_ERR_XML_ERROR, "domain");
if (sexpr != NULL) if (sexpr != NULL)
@ -2939,6 +2993,7 @@ xenDaemonAttachDevice(virDomainPtr domain, char *xml)
{ {
char *sexpr, *conf; char *sexpr, *conf;
int hvm = 0, ret; int hvm = 0, ret;
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) { if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG, virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
@ -2946,9 +3001,11 @@ xenDaemonAttachDevice(virDomainPtr domain, char *xml)
return (-1); return (-1);
} }
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (strcmp(virDomainGetOSType(domain), "linux")) if (strcmp(virDomainGetOSType(domain), "linux"))
hvm = 1; hvm = 1;
sexpr = virParseXMLDevice(domain->conn, xml, hvm, domain->conn->xendConfigVersion); sexpr = virParseXMLDevice(domain->conn, xml, hvm, priv->xendConfigVersion);
if (sexpr == NULL) if (sexpr == NULL)
return (-1); return (-1);
if (!memcmp(sexpr, "(device ", 8)) { if (!memcmp(sexpr, "(device ", 8)) {
@ -2993,6 +3050,7 @@ virDomainPtr xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc) {
char *sexpr; char *sexpr;
char *name = NULL; char *name = NULL;
virDomainPtr dom; virDomainPtr dom;
xenUnifiedPrivatePtr priv;
if (!VIR_IS_CONNECT(conn)) { if (!VIR_IS_CONNECT(conn)) {
virXendError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__); virXendError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
@ -3002,10 +3060,13 @@ virDomainPtr xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc) {
virXendError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); virXendError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
return (NULL); return (NULL);
} }
if (conn->xendConfigVersion < 3)
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->xendConfigVersion < 3)
return(NULL); return(NULL);
sexpr = virDomainParseXMLDesc(conn, xmlDesc, &name, conn->xendConfigVersion); sexpr = virDomainParseXMLDesc(conn, xmlDesc, &name, priv->xendConfigVersion);
if ((sexpr == NULL) || (name == NULL)) { if ((sexpr == NULL) || (name == NULL)) {
virXendError(conn, VIR_ERR_XML_ERROR, "domain"); virXendError(conn, VIR_ERR_XML_ERROR, "domain");
if (sexpr != NULL) if (sexpr != NULL)
@ -3034,25 +3095,37 @@ virDomainPtr xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc) {
free(name); free(name);
return (NULL); return (NULL);
} }
int xenDaemonDomainCreate(virDomainPtr domain) { int xenDaemonDomainCreate(virDomainPtr domain)
{
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) { if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG, virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
__FUNCTION__); __FUNCTION__);
return(-1); return(-1);
} }
if (domain->conn->xendConfigVersion < 3)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->xendConfigVersion < 3)
return(-1); return(-1);
return xend_op(domain->conn, domain->name, "op", "start", NULL); return xend_op(domain->conn, domain->name, "op", "start", NULL);
} }
int xenDaemonDomainUndefine(virDomainPtr domain) { int xenDaemonDomainUndefine(virDomainPtr domain)
{
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) { if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG, virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
__FUNCTION__); __FUNCTION__);
return(-1); return(-1);
} }
if (domain->conn->xendConfigVersion < 3)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->xendConfigVersion < 3)
return(-1); return(-1);
return xend_op(domain->conn, domain->name, "op", "delete", NULL); return xend_op(domain->conn, domain->name, "op", "delete", NULL);
@ -3072,8 +3145,9 @@ xenDaemonNumOfDefinedDomains(virConnectPtr conn)
struct sexpr *root = NULL; struct sexpr *root = NULL;
int ret = -1; int ret = -1;
struct sexpr *_for_i, *node; struct sexpr *_for_i, *node;
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
if (conn->xendConfigVersion < 3) if (priv->xendConfigVersion < 3)
return(-1); return(-1);
root = sexpr_get(conn, "/xend/domain?state=halted"); root = sexpr_get(conn, "/xend/domain?state=halted");
@ -3099,8 +3173,9 @@ int xenDaemonListDefinedDomains(virConnectPtr conn, char **const names, int maxn
struct sexpr *root = NULL; struct sexpr *root = NULL;
int ret = -1; int ret = -1;
struct sexpr *_for_i, *node; struct sexpr *_for_i, *node;
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
if (conn->xendConfigVersion < 3) if (priv->xendConfigVersion < 3)
return(-1); return(-1);
if ((names == NULL) || (maxnames <= 0)) if ((names == NULL) || (maxnames <= 0))

View File

@ -177,8 +177,10 @@ char *xenDaemonDomainDumpXMLByName(virConnectPtr xend,
char *xend_parse_domain_sexp(virConnectPtr conn, char *root, int xendConfigVersion); char *xend_parse_domain_sexp(virConnectPtr conn, char *root, int xendConfigVersion);
extern virDriver xenDaemonDriver;
int xenDaemonInit (void);
/* refactored ones */ /* refactored ones */
void xenDaemonRegister(void);
int xenDaemonOpen(virConnectPtr conn, const char *name, int flags); int xenDaemonOpen(virConnectPtr conn, const char *name, int flags);
int xenDaemonClose(virConnectPtr conn); int xenDaemonClose(virConnectPtr conn);
int xenDaemonGetVersion(virConnectPtr conn, unsigned long *hvVer); int xenDaemonGetVersion(virConnectPtr conn, unsigned long *hvVer);

View File

@ -36,6 +36,7 @@
#include <libxml/xpath.h> #include <libxml/xpath.h>
#include "xen_unified.h"
#include "xm_internal.h" #include "xm_internal.h"
#include "xend_internal.h" #include "xend_internal.h"
#include "conf.h" #include "conf.h"
@ -66,8 +67,8 @@ static time_t lastRefresh = 0;
#define XEND_PCI_CONFIG_PREFIX "xend-pci-" #define XEND_PCI_CONFIG_PREFIX "xend-pci-"
#define QEMU_IF_SCRIPT "qemu-ifup" #define QEMU_IF_SCRIPT "qemu-ifup"
static virDriver xenXMDriver = { virDriver xenXMDriver = {
VIR_DRV_XEN_XM, -1,
"XenXM", "XenXM",
(DOM0_INTERFACE_VERSION >> 24) * 1000000 + (DOM0_INTERFACE_VERSION >> 24) * 1000000 +
((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + ((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 +
@ -127,11 +128,11 @@ xenXMError(virConnectPtr conn, virErrorNumber error, const char *info)
errmsg, info, NULL, 0, 0, errmsg, info); errmsg, info, NULL, 0, 0, errmsg, info);
} }
void xenXMRegister(void) int
xenXMInit (void)
{ {
char *envConfigDir; char *envConfigDir;
int safeMode = 0; int safeMode = 0;
virRegisterDriver(&xenXMDriver);
/* Disable use of env variable if running setuid */ /* Disable use of env variable if running setuid */
if ((geteuid() != getuid()) || if ((geteuid() != getuid()) ||
@ -145,6 +146,8 @@ void xenXMRegister(void)
} else { } else {
strcpy(configDir, XM_CONFIG_DIR); strcpy(configDir, XM_CONFIG_DIR);
} }
return 0;
} }
@ -472,12 +475,10 @@ static int xenXMConfigCacheRefresh(void) {
* We only support a single directory, so repeated calls * We only support a single directory, so repeated calls
* to open all end up using the same cache of files * to open all end up using the same cache of files
*/ */
int xenXMOpen(virConnectPtr conn ATTRIBUTE_UNUSED, const char *name, int flags ATTRIBUTE_UNUSED) { int
if (name && xenXMOpen (virConnectPtr conn ATTRIBUTE_UNUSED,
strcasecmp(name, "xen")) { const char *name ATTRIBUTE_UNUSED, int flags ATTRIBUTE_UNUSED)
return (-1); {
}
if (nconnections == 0) { if (nconnections == 0) {
configCache = virHashCreate(50); configCache = virHashCreate(50);
if (!configCache) if (!configCache)
@ -584,6 +585,7 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) {
const char *vnclisten = NULL; const char *vnclisten = NULL;
const char *vncpasswd = NULL; const char *vncpasswd = NULL;
const char *keymap = NULL; const char *keymap = NULL;
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
if (xenXMConfigGetString(conf, "name", &name) < 0) if (xenXMConfigGetString(conf, "name", &name) < 0)
return (NULL); return (NULL);
@ -798,7 +800,7 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) {
} }
} }
if (hvm && conn->xendConfigVersion == 1) { if (hvm && priv->xendConfigVersion == 1) {
if (xenXMConfigGetString(conf, "cdrom", &str) == 0) { if (xenXMConfigGetString(conf, "cdrom", &str) == 0) {
virBufferAdd(buf, " <disk type='file' device='cdrom'>\n", -1); virBufferAdd(buf, " <disk type='file' device='cdrom'>\n", -1);
virBufferAdd(buf, " <driver name='file'/>\n", -1); virBufferAdd(buf, " <driver name='file'/>\n", -1);
@ -884,7 +886,7 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) {
} }
/* HVM guests, or old PV guests use this config format */ /* HVM guests, or old PV guests use this config format */
if (hvm || conn->xendConfigVersion < 3) { if (hvm || priv->xendConfigVersion < 3) {
if (xenXMConfigGetInt(conf, "vnc", &val) == 0 && val) { if (xenXMConfigGetInt(conf, "vnc", &val) == 0 && val) {
vnc = 1; vnc = 1;
if (xenXMConfigGetInt(conf, "vncunused", &vncunused) < 0) if (xenXMConfigGetInt(conf, "vncunused", &vncunused) < 0)
@ -1282,6 +1284,7 @@ int xenXMDomainCreate(virDomainPtr domain) {
char *sexpr; char *sexpr;
int ret; int ret;
unsigned char uuid[VIR_UUID_BUFLEN]; unsigned char uuid[VIR_UUID_BUFLEN];
xenUnifiedPrivatePtr priv;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) { if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
xenXMError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG, xenXMError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
@ -1297,7 +1300,9 @@ int xenXMDomainCreate(virDomainPtr domain) {
if (!(xml = xenXMDomainDumpXML(domain, 0))) if (!(xml = xenXMDomainDumpXML(domain, 0)))
return (-1); return (-1);
if (!(sexpr = virDomainParseXMLDesc(domain->conn, xml, NULL, domain->conn->xendConfigVersion))) { priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (!(sexpr = virDomainParseXMLDesc(domain->conn, xml, NULL, priv->xendConfigVersion))) {
free(xml); free(xml);
return (-1); return (-1);
} }
@ -1714,6 +1719,7 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) {
xmlChar *prop = NULL; xmlChar *prop = NULL;
virConfPtr conf = NULL; virConfPtr conf = NULL;
int hvm = 0, i; int hvm = 0, i;
xenUnifiedPrivatePtr priv;
doc = xmlReadDoc((const xmlChar *) xml, "domain.xml", NULL, doc = xmlReadDoc((const xmlChar *) xml, "domain.xml", NULL,
XML_PARSE_NOENT | XML_PARSE_NONET | XML_PARSE_NOENT | XML_PARSE_NONET |
@ -1778,6 +1784,8 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) {
hvm = 1; hvm = 1;
xmlXPathFreeObject(obj); xmlXPathFreeObject(obj);
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (hvm) { if (hvm) {
const char *boot = "c"; const char *boot = "c";
if (xenXMConfigSetString(conf, "builder", "hvm") < 0) if (xenXMConfigSetString(conf, "builder", "hvm") < 0)
@ -1813,7 +1821,7 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) {
"cannot set the apic parameter") < 0) "cannot set the apic parameter") < 0)
goto error; goto error;
if (conn->xendConfigVersion == 1) { if (priv->xendConfigVersion == 1) {
if (xenXMConfigSetStringFromXPath(conn, conf, ctxt, "cdrom", "string(/domain/devices/disk[@device='cdrom']/source/@file)", 1, if (xenXMConfigSetStringFromXPath(conn, conf, ctxt, "cdrom", "string(/domain/devices/disk[@device='cdrom']/source/@file)", 1,
"cannot set the cdrom parameter") < 0) "cannot set the cdrom parameter") < 0)
goto error; goto error;
@ -1854,7 +1862,7 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) {
} }
if (hvm || conn->xendConfigVersion < 3) { if (hvm || priv->xendConfigVersion < 3) {
if (xenXMConfigSetIntFromXPath(conn, conf, ctxt, "sdl", "string(count(/domain/devices/graphics[@type='sdl']))", 0, 0, if (xenXMConfigSetIntFromXPath(conn, conf, ctxt, "sdl", "string(count(/domain/devices/graphics[@type='sdl']))", 0, 0,
"cannot set the sdl parameter") < 0) "cannot set the sdl parameter") < 0)
goto error; goto error;
@ -1977,7 +1985,7 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) {
for (i = obj->nodesetval->nodeNr -1 ; i >= 0 ; i--) { for (i = obj->nodesetval->nodeNr -1 ; i >= 0 ; i--) {
virConfValuePtr thisDisk; virConfValuePtr thisDisk;
char *disk = NULL; char *disk = NULL;
if (xenXMParseXMLDisk(obj->nodesetval->nodeTab[i], hvm, conn->xendConfigVersion, &disk) < 0) if (xenXMParseXMLDisk(obj->nodesetval->nodeTab[i], hvm, priv->xendConfigVersion, &disk) < 0)
goto error; goto error;
if (disk) { if (disk) {
if (!(thisDisk = malloc(sizeof(virConfValue)))) { if (!(thisDisk = malloc(sizeof(virConfValue)))) {

View File

@ -27,12 +27,15 @@
#include "libvirt/libvirt.h" #include "libvirt/libvirt.h"
#include "conf.h" #include "conf.h"
#include "internal.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
void xenXMRegister(void); extern virDriver xenXMDriver;
int xenXMInit (void);
int xenXMOpen(virConnectPtr conn, const char *name, int flags); int xenXMOpen(virConnectPtr conn, const char *name, int flags);
int xenXMClose(virConnectPtr conn); int xenXMClose(virConnectPtr conn);
const char *xenXMGetType(virConnectPtr conn); const char *xenXMGetType(virConnectPtr conn);

View File

@ -27,6 +27,7 @@
#include "internal.h" #include "internal.h"
#include "driver.h" #include "driver.h"
#include "xen_unified.h"
#include "xs_internal.h" #include "xs_internal.h"
#include "xen_internal.h" /* for xenHypervisorCheckID */ #include "xen_internal.h" /* for xenHypervisorCheckID */
@ -35,8 +36,8 @@
#ifndef PROXY #ifndef PROXY
static char *xenStoreDomainGetOSType(virDomainPtr domain); static char *xenStoreDomainGetOSType(virDomainPtr domain);
static virDriver xenStoreDriver = { virDriver xenStoreDriver = {
VIR_DRV_XEN_STORE, -1,
"XenStore", "XenStore",
(DOM0_INTERFACE_VERSION >> 24) * 1000000 + (DOM0_INTERFACE_VERSION >> 24) * 1000000 +
((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 + ((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 +
@ -84,13 +85,14 @@ static virDriver xenStoreDriver = {
}; };
/** /**
* xenStoreRegister: * xenStoreInit:
* *
* Registers the xenStore driver * Initialisation.
*/ */
void xenStoreRegister(void) int
xenStoreInit ()
{ {
virRegisterDriver(&xenStoreDriver); return 0;
} }
#endif /* ! PROXY */ #endif /* ! PROXY */
@ -135,11 +137,16 @@ static char **
virConnectDoStoreList(virConnectPtr conn, const char *path, virConnectDoStoreList(virConnectPtr conn, const char *path,
unsigned int *nb) unsigned int *nb)
{ {
if ((conn == NULL) || (conn->xshandle == NULL) || (path == NULL) || xenUnifiedPrivatePtr priv;
(nb == NULL))
if (conn == NULL)
return NULL;
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->xshandle == NULL || path == NULL || nb == NULL)
return (NULL); return (NULL);
return xs_directory(conn->xshandle, 0, path, nb); return xs_directory (priv->xshandle, 0, path, nb);
} }
#endif /* ! PROXY */ #endif /* ! PROXY */
@ -158,14 +165,19 @@ virDomainDoStoreQuery(virConnectPtr conn, int domid, const char *path)
{ {
char s[256]; char s[256];
unsigned int len = 0; unsigned int len = 0;
xenUnifiedPrivatePtr priv;
if (!conn || conn->xshandle == NULL) if (!conn)
return NULL;
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->xshandle == NULL)
return (NULL); return (NULL);
snprintf(s, 255, "/local/domain/%d/%s", domid, path); snprintf(s, 255, "/local/domain/%d/%s", domid, path);
s[255] = 0; s[255] = 0;
return xs_read(conn->xshandle, 0, &s[0], &len); return xs_read(priv->xshandle, 0, &s[0], &len);
} }
#ifndef PROXY #ifndef PROXY
@ -184,12 +196,14 @@ virDomainDoStoreWrite(virDomainPtr domain, const char *path,
const char *value) const char *value)
{ {
char s[256]; char s[256];
xenUnifiedPrivatePtr priv;
int ret = -1; int ret = -1;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) if (!VIR_IS_CONNECTED_DOMAIN(domain))
return (-1); return (-1);
if (domain->conn->xshandle == NULL)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->xshandle == NULL)
return (-1); return (-1);
if (domain->conn->flags & VIR_CONNECT_RO) if (domain->conn->flags & VIR_CONNECT_RO)
return (-1); return (-1);
@ -197,7 +211,7 @@ virDomainDoStoreWrite(virDomainPtr domain, const char *path,
snprintf(s, 255, "/local/domain/%d/%s", domain->id, path); snprintf(s, 255, "/local/domain/%d/%s", domain->id, path);
s[255] = 0; s[255] = 0;
if (xs_write(domain->conn->xshandle, 0, &s[0], value, strlen(value))) if (xs_write(priv->xshandle, 0, &s[0], value, strlen(value)))
ret = 0; ret = 0;
return (ret); return (ret);
@ -217,16 +231,19 @@ virDomainGetVM(virDomainPtr domain)
char *vm; char *vm;
char query[200]; char query[200];
unsigned int len; unsigned int len;
xenUnifiedPrivatePtr priv;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) if (!VIR_IS_CONNECTED_DOMAIN(domain))
return (NULL); return (NULL);
if (domain->conn->xshandle == NULL)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->xshandle == NULL)
return (NULL); return (NULL);
snprintf(query, 199, "/local/domain/%d/vm", virDomainGetID(domain)); snprintf(query, 199, "/local/domain/%d/vm", virDomainGetID(domain));
query[199] = 0; query[199] = 0;
vm = xs_read(domain->conn->xshandle, 0, &query[0], &len); vm = xs_read(priv->xshandle, 0, &query[0], &len);
return (vm); return (vm);
} }
@ -248,16 +265,19 @@ virDomainGetVMInfo(virDomainPtr domain, const char *vm, const char *name)
char s[256]; char s[256];
char *ret = NULL; char *ret = NULL;
unsigned int len = 0; unsigned int len = 0;
xenUnifiedPrivatePtr priv;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) if (!VIR_IS_CONNECTED_DOMAIN(domain))
return (NULL); return (NULL);
if (domain->conn->xshandle == NULL)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->xshandle == NULL)
return (NULL); return (NULL);
snprintf(s, 255, "%s/%s", vm, name); snprintf(s, 255, "%s/%s", vm, name);
s[255] = 0; s[255] = 0;
ret = xs_read(domain->conn->xshandle, 0, &s[0], &len); ret = xs_read(priv->xshandle, 0, &s[0], &len);
return (ret); return (ret);
} }
@ -304,21 +324,21 @@ virConnectCheckStoreID(virConnectPtr conn, int id)
* Returns 0 or -1 in case of error. * Returns 0 or -1 in case of error.
*/ */
int int
xenStoreOpen(virConnectPtr conn, const char *name, int flags) xenStoreOpen(virConnectPtr conn,
const char *name ATTRIBUTE_UNUSED, int flags)
{ {
if ((name != NULL) && (strcasecmp(name, "xen"))) xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
return(-1);
#ifdef PROXY #ifdef PROXY
conn->xshandle = xs_daemon_open_readonly(); priv->xshandle = xs_daemon_open_readonly();
#else #else
if (flags & VIR_DRV_OPEN_RO) if (flags & VIR_DRV_OPEN_RO)
conn->xshandle = xs_daemon_open_readonly(); priv->xshandle = xs_daemon_open_readonly();
else else
conn->xshandle = xs_daemon_open(); priv->xshandle = xs_daemon_open();
#endif /* ! PROXY */ #endif /* ! PROXY */
if (conn->xshandle == NULL) { if (priv->xshandle == NULL) {
if (!(flags & VIR_DRV_OPEN_QUIET)) if (!(flags & VIR_DRV_OPEN_QUIET))
virXenStoreError(conn, VIR_ERR_NO_XEN, virXenStoreError(conn, VIR_ERR_NO_XEN,
_("failed to connect to Xen Store")); _("failed to connect to Xen Store"));
@ -338,14 +358,18 @@ xenStoreOpen(virConnectPtr conn, const char *name, int flags)
int int
xenStoreClose(virConnectPtr conn) xenStoreClose(virConnectPtr conn)
{ {
xenUnifiedPrivatePtr priv;
if (conn == NULL) { if (conn == NULL) {
virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
return(-1); return(-1);
} }
if (conn->xshandle == NULL)
return(-1);
xs_daemon_close(conn->xshandle); priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->xshandle == NULL)
return(-1);
xs_daemon_close(priv->xshandle);
return (0); return (0);
} }
@ -365,6 +389,7 @@ xenStoreGetDomainInfo(virDomainPtr domain, virDomainInfoPtr info)
char *tmp, **tmp2; char *tmp, **tmp2;
unsigned int nb_vcpus; unsigned int nb_vcpus;
char request[200]; char request[200];
xenUnifiedPrivatePtr priv;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) if (!VIR_IS_CONNECTED_DOMAIN(domain))
return (-1); return (-1);
@ -374,8 +399,11 @@ xenStoreGetDomainInfo(virDomainPtr domain, virDomainInfoPtr info)
__FUNCTION__); __FUNCTION__);
return(-1); return(-1);
} }
if (domain->conn->xshandle == NULL)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->xshandle == NULL)
return(-1); return(-1);
if (domain->id == -1) if (domain->id == -1)
return(-1); return(-1);
@ -490,12 +518,19 @@ xenStoreNumOfDomains(virConnectPtr conn)
unsigned int num; unsigned int num;
char **idlist; char **idlist;
int ret = -1; int ret = -1;
xenUnifiedPrivatePtr priv;
if ((conn == NULL) || (conn->xshandle == NULL)) { if (conn == NULL) {
virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
return(-1); return -1;
} }
idlist = xs_directory(conn->xshandle, 0, "/local/domain", &num);
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->xshandle == NULL) {
virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
return(-1);
}
idlist = xs_directory(priv->xshandle, 0, "/local/domain", &num);
if (idlist) { if (idlist) {
free(idlist); free(idlist);
ret = num; ret = num;
@ -520,15 +555,18 @@ xenStoreListDomains(virConnectPtr conn, int *ids, int maxids)
unsigned int num, i; unsigned int num, i;
int ret; int ret;
long id; long id;
xenUnifiedPrivatePtr priv;
if ((conn == NULL) || (ids == NULL)) { if ((conn == NULL) || (ids == NULL)) {
virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
return(-1); return(-1);
} }
if (conn->xshandle == NULL)
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->xshandle == NULL)
return(-1); return(-1);
idlist = xs_directory(conn->xshandle, 0, "/local/domain", &num); idlist = xs_directory (priv->xshandle, 0, "/local/domain", &num);
if (idlist == NULL) if (idlist == NULL)
return(-1); return(-1);
@ -566,15 +604,18 @@ xenStoreDomainLookupByName(virConnectPtr conn, const char *name)
char prop[200], *tmp, *path = NULL; char prop[200], *tmp, *path = NULL;
int found = 0; int found = 0;
struct xend_domain *xenddomain = NULL; struct xend_domain *xenddomain = NULL;
xenUnifiedPrivatePtr priv;
if ((conn == NULL) || (name == NULL)) { if ((conn == NULL) || (name == NULL)) {
virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
return(NULL); return(NULL);
} }
if (conn->xshandle == NULL)
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->xshandle == NULL)
return(NULL); return(NULL);
idlist = xs_directory(conn->xshandle, 0, "/local/domain", &num); idlist = xs_directory(priv->xshandle, 0, "/local/domain", &num);
if (idlist == NULL) if (idlist == NULL)
goto done; goto done;
@ -589,7 +630,7 @@ xenStoreDomainLookupByName(virConnectPtr conn, const char *name)
#endif #endif
snprintf(prop, 199, "/local/domain/%s/name", idlist[i]); snprintf(prop, 199, "/local/domain/%s/name", idlist[i]);
prop[199] = 0; prop[199] = 0;
tmp = xs_read(conn->xshandle, 0, prop, &len); tmp = xs_read(priv->xshandle, 0, prop, &len);
if (tmp != NULL) { if (tmp != NULL) {
found = !strcmp(name, tmp); found = !strcmp(name, tmp);
free(tmp); free(tmp);
@ -597,7 +638,7 @@ xenStoreDomainLookupByName(virConnectPtr conn, const char *name)
break; break;
} }
} }
path = xs_get_domain_path(conn->xshandle, (unsigned int) id); path = xs_get_domain_path(priv->xshandle, (unsigned int) id);
if (!found) if (!found)
return(NULL); return(NULL);
@ -764,22 +805,23 @@ xenStoreDomainGetOSTypeID(virConnectPtr conn, int id) {
char *vm, *str = NULL; char *vm, *str = NULL;
char query[200]; char query[200];
unsigned int len; unsigned int len;
xenUnifiedPrivatePtr priv;
if (id < 0) if (id < 0)
return(NULL); return(NULL);
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (conn->xshandle == NULL) if (priv->xshandle == NULL)
return (NULL); return (NULL);
snprintf(query, 199, "/local/domain/%d/vm", id); snprintf(query, 199, "/local/domain/%d/vm", id);
query[199] = 0; query[199] = 0;
vm = xs_read(conn->xshandle, 0, &query[0], &len); vm = xs_read(priv->xshandle, 0, &query[0], &len);
if (vm) { if (vm) {
snprintf(query, 199, "%s/image/ostype", vm); snprintf(query, 199, "%s/image/ostype", vm);
str = xs_read(conn->xshandle, 0, &query[0], &len); str = xs_read(priv->xshandle, 0, &query[0], &len);
free(vm); free(vm);
} }
if (str == NULL) if (str == NULL)
@ -807,10 +849,13 @@ xenStoreDomainGetNetworkID(virConnectPtr conn, int id, const char *mac) {
char dir[80], path[128], **list = NULL, *val = NULL; char dir[80], path[128], **list = NULL, *val = NULL;
unsigned int maclen, len, i, num; unsigned int maclen, len, i, num;
char *ret = NULL; char *ret = NULL;
xenUnifiedPrivatePtr priv;
if (id < 0) if (id < 0)
return(NULL); return(NULL);
if (conn->xshandle == NULL)
priv = (xenUnifiedPrivatePtr) conn->privateData;
if (priv->xshandle == NULL)
return (NULL); return (NULL);
if (mac == NULL) if (mac == NULL)
return (NULL); return (NULL);
@ -819,12 +864,12 @@ xenStoreDomainGetNetworkID(virConnectPtr conn, int id, const char *mac) {
return (NULL); return (NULL);
snprintf(dir, sizeof(dir), "/local/domain/0/backend/vif/%d", id); snprintf(dir, sizeof(dir), "/local/domain/0/backend/vif/%d", id);
list = xs_directory(conn->xshandle, 0, dir, &num); list = xs_directory(priv->xshandle, 0, dir, &num);
if (list == NULL) if (list == NULL)
return(NULL); return(NULL);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
snprintf(path, sizeof(path), "%s/%s/%s", dir, list[i], "mac"); snprintf(path, sizeof(path), "%s/%s/%s", dir, list[i], "mac");
val = xs_read(conn->xshandle, 0, path, &len); val = xs_read(priv->xshandle, 0, path, &len);
if (val == NULL) if (val == NULL)
break; break;
if ((maclen != len) || memcmp(val, mac, len)) { if ((maclen != len) || memcmp(val, mac, len)) {

View File

@ -15,7 +15,9 @@
extern "C" { extern "C" {
#endif #endif
void xenStoreRegister (void); extern virDriver xenStoreDriver;
int xenStoreInit (void);
int xenStoreOpen (virConnectPtr conn, int xenStoreOpen (virConnectPtr conn,
const char *name, const char *name,
int flags); int flags);

View File

@ -25,6 +25,7 @@
#include <string.h> #include <string.h>
#ifdef WITH_XEN #ifdef WITH_XEN
#include "xen_unified.h"
#include "xm_internal.h" #include "xm_internal.h"
#include "testutils.h" #include "testutils.h"
#include "internal.h" #include "internal.h"
@ -45,8 +46,12 @@ static int testCompareParseXML(const char *xmcfg, const char *xml, int xendConfi
int ret = -1; int ret = -1;
virConnectPtr conn; virConnectPtr conn;
int wrote = MAX_FILE; int wrote = MAX_FILE;
void *old_priv;
struct _xenUnifiedPrivate priv;
conn = virConnectOpen("test:///default"); conn = virConnectOpen("test:///default");
if (!conn) goto fail;
old_priv = conn->privateData;
if (virtTestLoadFile(xml, &xmlPtr, MAX_FILE) < 0) if (virtTestLoadFile(xml, &xmlPtr, MAX_FILE) < 0)
goto fail; goto fail;
@ -54,8 +59,9 @@ static int testCompareParseXML(const char *xmcfg, const char *xml, int xendConfi
if (virtTestLoadFile(xmcfg, &xmcfgPtr, MAX_FILE) < 0) if (virtTestLoadFile(xmcfg, &xmcfgPtr, MAX_FILE) < 0)
goto fail; goto fail;
/* Yes, a nasty hack, but this is only a test suite */ /* Many puppies died to bring you this code. */
conn->xendConfigVersion = xendConfigVersion; priv.xendConfigVersion = xendConfigVersion;
conn->privateData = &priv;
if (!(conf = xenXMParseXMLToConfig(conn, xmlPtr))) if (!(conf = xenXMParseXMLToConfig(conn, xmlPtr)))
goto fail; goto fail;
@ -77,7 +83,11 @@ static int testCompareParseXML(const char *xmcfg, const char *xml, int xendConfi
if (conf) if (conf)
virConfFree(conf); virConfFree(conf);
virConnectClose(conn); if (conn) {
conn->privateData = old_priv;
virConnectClose(conn);
}
return ret; return ret;
} }
@ -90,8 +100,12 @@ static int testCompareFormatXML(const char *xmcfg, const char *xml, int xendConf
virConfPtr conf = NULL; virConfPtr conf = NULL;
int ret = -1; int ret = -1;
virConnectPtr conn; virConnectPtr conn;
void *old_priv;
struct _xenUnifiedPrivate priv;
conn = virConnectOpen("test:///default"); conn = virConnectOpen("test:///default");
if (!conn) goto fail;
old_priv = conn->privateData;
if (virtTestLoadFile(xml, &xmlPtr, MAX_FILE) < 0) if (virtTestLoadFile(xml, &xmlPtr, MAX_FILE) < 0)
goto fail; goto fail;
@ -99,8 +113,9 @@ static int testCompareFormatXML(const char *xmcfg, const char *xml, int xendConf
if (virtTestLoadFile(xmcfg, &xmcfgPtr, MAX_FILE) < 0) if (virtTestLoadFile(xmcfg, &xmcfgPtr, MAX_FILE) < 0)
goto fail; goto fail;
/* Yes, a nasty hack, but this is only a test suite */ /* Many puppies died to bring you this code. */
conn->xendConfigVersion = xendConfigVersion; priv.xendConfigVersion = xendConfigVersion;
conn->privateData = &priv;
if (!(conf = virConfReadMem(xmcfgPtr, strlen(xmcfgPtr)))) if (!(conf = virConfReadMem(xmcfgPtr, strlen(xmcfgPtr))))
goto fail; goto fail;
@ -123,7 +138,11 @@ static int testCompareFormatXML(const char *xmcfg, const char *xml, int xendConf
if (gotxml) if (gotxml)
free(gotxml); free(gotxml);
virConnectClose(conn); if (conn) {
conn->privateData = old_priv;
virConnectClose(conn);
}
return ret; return ret;
} }