[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[Libvir] PATCH: Remove Xen Proxy driver
- From: "Daniel P. Berrange" <berrange redhat com>
- To: libvir-list redhat com
- Subject: [Libvir] PATCH: Remove Xen Proxy driver
- Date: Wed, 19 Sep 2007 04:05:53 +0100
Since the previous patch allows the remote daemon to serve all the functions
of the current Xen Proxy driver, this patch simply removes the Xen proxy
and its driver.
$ diffstat .hg/patches/remote-proxy
Makefile.am | 2
a/proxy/.cvsignore | 5
a/proxy/Makefile.am | 19
a/proxy/libvirt_proxy.c | 852 ------------------------------------
a/src/proxy_internal.c | 1124 ------------------------------------------------
a/src/proxy_internal.h | 116 ----
src/Makefile.am | 1
src/xen_unified.c | 51 --
src/xen_unified.h | 9
9 files changed, 15 insertions(+), 2164 deletions(-)
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
diff -r d676d6414f07 Makefile.am
--- a/Makefile.am Tue Sep 18 14:23:22 2007 -0400
+++ b/Makefile.am Tue Sep 18 14:29:40 2007 -0400
@@ -1,6 +1,6 @@
## Process this file with automake to produce Makefile.in
-SUBDIRS = src qemud proxy include docs @PYTHON_SUBDIR@ tests po m4 scripts
+SUBDIRS = src qemud include docs @PYTHON_SUBDIR@ tests po m4 scripts
ACLOCAL_AMFLAGS = -I m4
diff -r d676d6414f07 proxy/.cvsignore
--- a/proxy/.cvsignore Tue Sep 18 14:23:22 2007 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-Makefile
-Makefile.in
-.deps
-.libs
-libvirt_proxy
diff -r d676d6414f07 proxy/Makefile.am
--- a/proxy/Makefile.am Tue Sep 18 14:23:22 2007 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-INCLUDES = -I$(top_builddir)/include -I top_srcdir@/include \
- -I top_srcdir@/proxy -I top_srcdir@/src @LIBXML_CFLAGS@ \
- -DPROXY -DLOCALEBASEDIR=\""$(datadir)/locale"\" \
- -DGETTEXT_PACKAGE=\"$(PACKAGE)\" $(WARN_CFLAGS) $(LIBVIRT_FEATURES)
-
-libexec_PROGRAMS = libvirt_proxy
-
-libvirt_proxy_SOURCES = libvirt_proxy.c @top_srcdir@/src/xend_internal.c \
- @top_srcdir@/src/xen_internal.c @top_srcdir@/src/virterror.c \
- @top_srcdir@/src/sexpr.c @top_srcdir@/src/xml.c \
- @top_srcdir@/src/xs_internal.c @top_srcdir@/src/buf.c @top_srcdir@/src/uuid.c
-libvirt_proxy_LDFLAGS = $(WARN_CFLAGS)
-libvirt_proxy_DEPENDENCIES =
-libvirt_proxy_LDADD =
-
-install-exec-hook:
- chmod u+s $(DESTDIR)$(libexecdir)/libvirt_proxy
diff -r d676d6414f07 proxy/libvirt_proxy.c
--- a/proxy/libvirt_proxy.c Tue Sep 18 14:23:22 2007 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,852 +0,0 @@
-/*
- * proxy_svr.c: root suid proxy server for Xen access to APIs with no
- * side effects from unauthenticated clients.
- *
- * Copyright (C) 2006 Red Hat, Inc.
- *
- * See COPYING.LIB for the License of this software
- *
- * Daniel Veillard <veillard redhat com>
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/poll.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <locale.h>
-#include "internal.h"
-
-#ifdef WITH_XEN
-#include "proxy_internal.h"
-#include "xen_internal.h"
-#include "xend_internal.h"
-#include "xs_internal.h"
-#include "xen_unified.h"
-
-static int fdServer = -1;
-static int debug = 0;
-static int persist = 0;
-static int done = 0;
-
-#define MAX_CLIENT 64
-
-static int nbClients = 0; /* client 0 is the unix listen socket */
-static struct pollfd pollInfos[MAX_CLIENT + 1];
-
-static virConnect conninfos;
-static virConnectPtr conn = &conninfos;
-
-static unsigned long xenVersion = 0;
-
-/************************************************************************
- * *
- * Interfaces with the Xen hypervisor *
- * *
- ************************************************************************/
-
-/**
- * proxyInitXen:
- *
- * Initialize the communication layer with Xen
- *
- * Returns 0 or -1 in case of error
- */
-static int
-proxyInitXen(void) {
- int ret;
- 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, 0);
- if (ret < 0) {
- fprintf(stderr, "Failed to open Xen hypervisor\n");
- return(-1);
- } else {
- ret = xenHypervisorGetVersion(conn, &xenVersion);
- if (ret != 0) {
- fprintf(stderr, "Failed to get Xen hypervisor version\n");
- return(-1);
- }
- }
- ret = xenDaemonOpen_unix(conn, "/var/lib/xend/xend-socket");
- if (ret < 0) {
- fprintf(stderr, "Failed to connect to Xen daemon\n");
- return(-1);
- }
- ret = xenStoreOpen(conn, NULL, VIR_DRV_OPEN_RO);
- if (ret < 0) {
- fprintf(stderr, "Failed to open XenStore connection");
- return (-1);
- }
- ret = xenDaemonGetVersion(conn, &xenVersion2);
- if (ret != 0) {
- fprintf(stderr, "Failed to get Xen daemon version\n");
- return(-1);
- }
- if (debug)
- fprintf(stderr, "Connected to hypervisor %lu and daemon %lu\n",
- xenVersion, xenVersion2);
- if (xenVersion2 > xenVersion)
- xenVersion = xenVersion2;
- return(0);
-}
-
-/************************************************************************
- * *
- * Processing of the unix socket to listen for clients *
- * *
- ************************************************************************/
-
-/**
- * proxyCloseUnixSocket:
- *
- * close the unix socket
- *
- * Returns 0 or -1 in case of error
- */
-static int
-proxyCloseUnixSocket(void) {
- int ret;
-
- if (fdServer < 0)
- return(0);
-
- ret = close(fdServer);
- if (debug > 0)
- fprintf(stderr, "closing unix socket %d: %d\n", fdServer, ret);
- fdServer = -1;
- pollInfos[0].fd = -1;
- return(ret);
-}
-
-/**
- * proxyListenUnixSocket:
- * @path: the fileame for the socket
- *
- * create a new abstract socket based on that path and listen on it
- *
- * Returns the associated file descriptor or -1 in case of failure
- */
-static int
-proxyListenUnixSocket(const char *path) {
- int fd;
- struct sockaddr_un addr;
-
- if (fdServer >= 0)
- return(fdServer);
-
- fd = socket(PF_UNIX, SOCK_STREAM, 0);
- if (fd < 0) {
- fprintf(stderr, "Failed to create unix socket");
- return(-1);
- }
-
- /*
- * Abstract socket do not hit the filesystem, way more secure and
- * garanteed to be atomic
- */
- memset(&addr, 0, sizeof(addr));
- addr.sun_family = AF_UNIX;
- addr.sun_path[0] = '\0';
- strncpy(&addr.sun_path[1], path, (sizeof(addr) - 4) - 2);
-
- /*
- * now bind the socket to that address and listen on it
- */
- if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
- fprintf(stderr, "Failed to bind to socket %s\n", path);
- close(fd);
- return (-1);
- }
- if (listen(fd, 30 /* backlog */ ) < 0) {
- fprintf(stderr, "Failed to listen to socket %s\n", path);
- close(fd);
- return (-1);
- }
-
- if (debug > 0)
- fprintf(stderr, "opened and bound unix socket %d\n", fd);
-
- fdServer = fd;
- pollInfos[0].fd = fd;
- pollInfos[0].events = POLLIN | POLLERR | POLLHUP | POLLNVAL;
- return (fd);
-}
-
-/**
- * proxyAcceptClientSocket:
- *
- * Process a request to the unix socket
- *
- * Returns the filedescriptor of the new client or -1 in case of error
- */
-static int
-proxyAcceptClientSocket(void) {
- int client;
- socklen_t client_addrlen;
- struct sockaddr client_addr;
-
-retry:
- client_addrlen = sizeof(client_addr);
- client = accept(pollInfos[0].fd, &client_addr, &client_addrlen);
- if (client < 0) {
- if (errno == EINTR) {
- if (debug > 0)
- fprintf(stderr, "accept connection on socket %d interrupted\n",
- pollInfos[0].fd);
- goto retry;
- }
- fprintf(stderr, "Failed to accept incoming connection on socket %d\n",
- pollInfos[0].fd);
- done = 1;
- return(-1);
- }
-
- if (nbClients >= MAX_CLIENT) {
- fprintf(stderr, "Too many client registered\n");
- close(client);
- return(-1);
- }
- nbClients++;
- pollInfos[nbClients].fd = client;
- pollInfos[nbClients].events = POLLIN | POLLERR | POLLHUP | POLLNVAL;
- if (debug > 0)
- fprintf(stderr, "accept connection on socket %d for client %d\n",
- client, nbClients);
- return(client);
-}
-
-/************************************************************************
- * *
- * Processing of client sockets *
- * *
- ************************************************************************/
-
-/**
- * proxyCloseClientSocket:
- * @nr: client number
- *
- * Close the socket from that client, and recompact the pollInfo array
- *
- * Returns 0 in case of success and -1 in case of error
- */
-static int
-proxyCloseClientSocket(int nr) {
- int ret;
-
- ret = close(pollInfos[nr].fd);
- if (ret != 0)
- fprintf(stderr, "Failed to close socket %d from client %d\n",
- pollInfos[nr].fd, nr);
- else if (debug > 0)
- fprintf(stderr, "Closed socket %d from client %d\n",
- pollInfos[nr].fd, nr);
- if (nr < nbClients) {
- memmove(&pollInfos[nr], &pollInfos[nr + 1],
- (nbClients - nr) * sizeof(pollInfos[0]));
- }
- nbClients--;
- return(ret);
-}
-
-/**
- * proxyCloseClientSockets:
- *
- * Close all the sockets from the clients
- */
-static void
-proxyCloseClientSockets(void) {
- int i, ret;
-
- for (i = 1;i <= nbClients;i++) {
- ret = close(pollInfos[i].fd);
- if (ret != 0)
- fprintf(stderr, "Failed to close socket %d from client %d\n",
- pollInfos[i].fd, i);
- else if (debug > 0)
- fprintf(stderr, "Closed socket %d from client %d\n",
- pollInfos[i].fd, i);
- }
- nbClients = 0;
-}
-
-/**
- * proxyWriteClientSocket:
- * @nr: the client number
- * @req: pointer to the packet
- *
- * Send back a packet to the client. If it seems write would be blocking
- * then try to disconnect from it.
- *
- * Return 0 in case of success and -1 in case of error.
- */
-static int
-proxyWriteClientSocket(int nr, virProxyPacketPtr req) {
- int ret;
-
- if ((nr <= 0) || (nr > nbClients) || (req == NULL) ||
- (req->len < sizeof(virProxyPacket)) ||
- (req->len > sizeof(virProxyFullPacket)) ||
- (pollInfos[nr].fd < 0)) {
- fprintf(stderr, "write to client %d in error", nr);
- proxyCloseClientSocket(nr);
- return(-1);
- }
-
-retry:
- ret = write(pollInfos[nr].fd, (char *) req, req->len);
- if (ret < 0) {
- if (errno == EINTR) {
- if (debug > 0)
- fprintf(stderr, "write socket %d to client %d interrupted\n",
- pollInfos[nr].fd, nr);
- goto retry;
- }
- fprintf(stderr, "write %d bytes to socket %d from client %d failed\n",
- req->len, pollInfos[nr].fd, nr);
- proxyCloseClientSocket(nr);
- return(-1);
- }
- if (ret == 0) {
- if (debug)
- fprintf(stderr, "end of stream from client %d on socket %d\n",
- nr, pollInfos[nr].fd);
- proxyCloseClientSocket(nr);
- return(-1);
- }
-
- if (ret != req->len) {
- fprintf(stderr, "write %d of %d bytes to socket %d from client %d\n",
- ret, req->len, pollInfos[nr].fd, nr);
- proxyCloseClientSocket(nr);
- return(-1);
- }
- if (debug)
- fprintf(stderr, "wrote %d bytes to client %d on socket %d\n",
- ret, nr, pollInfos[nr].fd);
-
- return(0);
-}
-/**
- * proxyReadClientSocket:
- * @nr: the client number
- *
- * Process a read from a client socket
- */
-static int
-proxyReadClientSocket(int nr) {
- virProxyFullPacket request;
- virProxyPacketPtr req = (virProxyPacketPtr) &request;
- int ret;
- char *xml, *ostype;
-
-retry:
- ret = read(pollInfos[nr].fd, req, sizeof(virProxyPacket));
- if (ret < 0) {
- if (errno == EINTR) {
- if (debug > 0)
- fprintf(stderr, "read socket %d from client %d interrupted\n",
- pollInfos[nr].fd, nr);
- goto retry;
- }
- fprintf(stderr, "Failed to read socket %d from client %d\n",
- pollInfos[nr].fd, nr);
- proxyCloseClientSocket(nr);
- return(-1);
- }
- if (ret == 0) {
- if (debug)
- fprintf(stderr, "end of stream from client %d on socket %d\n",
- nr, pollInfos[nr].fd);
- proxyCloseClientSocket(nr);
- return(-1);
- }
-
- if (debug)
- fprintf(stderr, "read %d bytes from client %d on socket %d\n",
- ret, nr, pollInfos[nr].fd);
-
- if ((req->version != PROXY_PROTO_VERSION) ||
- (req->len < sizeof(virProxyPacket)) ||
- (req->len > sizeof(virProxyFullPacket)))
- goto comm_error;
-
-
- if (debug)
- fprintf(stderr, "Got command %d from client %d\n", req->command, nr);
-
- /*
- * complete reading the packet.
- * TODO: we should detect when blocking and abort connection if this happen
- */
- if (req->len > ret) {
- int total, extra;
- char *base = (char *) &request;
-
- total = ret;
- while (total < req->len) {
- extra = req->len - total;
-retry2:
- ret = read(pollInfos[nr].fd, base + total, extra);
- if (ret < 0) {
- if (errno == EINTR) {
- if (debug > 0)
- fprintf(stderr,
- "read socket %d from client %d interrupted\n",
- pollInfos[nr].fd, nr);
- goto retry2;
- }
- fprintf(stderr, "Failed to read socket %d from client %d\n",
- pollInfos[nr].fd, nr);
- proxyCloseClientSocket(nr);
- return(-1);
- }
- if (ret == 0) {
- if (debug)
- fprintf(stderr,
- "end of stream from client %d on socket %d\n",
- nr, pollInfos[nr].fd);
- proxyCloseClientSocket(nr);
- return(-1);
- }
- total += ret;
- }
- }
- switch (req->command) {
- case VIR_PROXY_NONE:
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
- break;
- case VIR_PROXY_VERSION:
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
- req->data.larg = xenVersion;
- break;
- case VIR_PROXY_LIST: {
- int maxids;
-
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
- maxids = sizeof(request.extra.arg) / sizeof(int);
- ret = xenHypervisorListDomains(conn, &request.extra.arg[0],
- maxids);
- if (ret < 0) {
- req->len = sizeof(virProxyPacket);
- req->data.arg = 0;
- } else {
- req->len = sizeof(virProxyPacket) + ret * sizeof(int);
- req->data.arg = ret;
- }
- break;
- }
- case VIR_PROXY_NUM_DOMAIN:
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
- req->data.arg = xenHypervisorNumOfDomains(conn);
- break;
- case VIR_PROXY_MAX_MEMORY:
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
- req->data.larg = xenHypervisorGetDomMaxMemory(conn, req->data.arg);
- break;
- case VIR_PROXY_DOMAIN_INFO:
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
- memset(&request.extra.dinfo, 0, sizeof(virDomainInfo));
- ret = xenHypervisorGetDomInfo(conn, req->data.arg,
- &request.extra.dinfo);
- if (ret < 0) {
- req->data.arg = -1;
- } else {
- req->len += sizeof(virDomainInfo);
- }
- break;
- case VIR_PROXY_LOOKUP_ID: {
- char *name = NULL;
- unsigned char uuid[VIR_UUID_BUFLEN];
- int len;
-
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
-
- if (xenDaemonDomainLookupByID(conn, req->data.arg, &name, uuid) < 0) {
- req->data.arg = -1;
- } else {
- len = strlen(name);
- if (len > 1000) {
- len = 1000;
- name[1000] = 0;
- }
- req->len += VIR_UUID_BUFLEN + len + 1;
- memcpy(&request.extra.str[0], uuid, VIR_UUID_BUFLEN);
- strcpy(&request.extra.str[VIR_UUID_BUFLEN], name);
- }
- if (name)
- free(name);
- break;
- }
- case VIR_PROXY_LOOKUP_UUID: {
- char **names;
- char **tmp;
- int ident, len;
- char *name = NULL;
- unsigned char uuid[VIR_UUID_BUFLEN];
-
- if (req->len != sizeof(virProxyPacket) + VIR_UUID_BUFLEN)
- goto comm_error;
-
- /*
- * Xend API forces to collect the full domain list by names, and
- * then query each of them until the id is found
- */
- names = xenDaemonListDomainsOld(conn);
- tmp = names;
-
- if (names != NULL) {
- while (*tmp != NULL) {
- ident = xenDaemonDomainLookupByName_ids(conn, *tmp, &uuid[0]);
- if (!memcmp(uuid, &request.extra.str[0], VIR_UUID_BUFLEN)) {
- name = *tmp;
- break;
- }
- tmp++;
- }
- }
- if (name == NULL) {
- /* not found */
- req->data.arg = -1;
- req->len = sizeof(virProxyPacket);
- } else {
- len = strlen(name);
- if (len > 1000) {
- len = 1000;
- name[1000] = 0;
- }
- req->len = sizeof(virProxyPacket) + len + 1;
- strcpy(&request.extra.str[0], name);
- req->data.arg = ident;
- }
- free(names);
- break;
- }
- case VIR_PROXY_LOOKUP_NAME: {
- int ident;
- unsigned char uuid[VIR_UUID_BUFLEN];
-
- if (req->len > sizeof(virProxyPacket) + 1000)
- goto comm_error;
-
- ident = xenDaemonDomainLookupByName_ids(conn,
- &request.extra.str[0], &uuid[0]);
- if (ident < 0) {
- /* not found */
- req->data.arg = -1;
- req->len = sizeof(virProxyPacket);
- } else {
- req->len = sizeof(virProxyPacket) + VIR_UUID_BUFLEN;
- memcpy(&request.extra.str[0], uuid, VIR_UUID_BUFLEN);
- req->data.arg = ident;
- }
- break;
- }
- case VIR_PROXY_NODE_INFO:
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
-
- /*
- * Hum, could we expect those informations to be unmutable and
- * cache them ? Since it's probably an unfrequent call better
- * not make assumption and do the xend RPC each call.
- */
- ret = xenDaemonNodeGetInfo(conn, &request.extra.ninfo);
- if (ret < 0) {
- req->data.arg = -1;
- req->len = sizeof(virProxyPacket);
- } else {
- req->data.arg = 0;
- req->len = sizeof(virProxyPacket) + sizeof(virNodeInfo);
- }
- break;
-
- case VIR_PROXY_GET_CAPABILITIES:
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
-
- xml = xenHypervisorGetCapabilities (conn);
- if (!xml) {
- req->data.arg = -1;
- req->len = sizeof (virProxyPacket);
- } else {
- int xmllen = strlen (xml);
- if (xmllen > (int) sizeof (request.extra.str)) {
- req->data.arg = -2;
- req->len = sizeof (virProxyPacket);
- } else {
- req->data.arg = 0;
- memmove (request.extra.str, xml, xmllen);
- req->len = sizeof (virProxyPacket) + xmllen;
- }
- free (xml);
- }
- break;
-
- case VIR_PROXY_DOMAIN_XML:
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
-
- xml = xenDaemonDomainDumpXMLByID(conn, request.data.arg);
- if (!xml) {
- req->data.arg = -1;
- req->len = sizeof(virProxyPacket);
- } else {
- int xmllen = strlen(xml);
- if (xmllen > (int) sizeof(request.extra.str)) {
- req->data.arg = -2;
- req->len = sizeof(virProxyPacket);
- } else {
- req->data.arg = 0;
- memmove(&request.extra.str[0], xml, xmllen);
- req->len = sizeof(virProxyPacket) + xmllen;
- }
- free(xml);
- }
- break;
- case VIR_PROXY_DOMAIN_OSTYPE:
- if (req->len != sizeof(virProxyPacket))
- goto comm_error;
-
- ostype = xenStoreDomainGetOSTypeID(conn, request.data.arg);
- if (!ostype) {
- req->data.arg = -1;
- req->len = sizeof(virProxyPacket);
- } else {
- int ostypelen = strlen(ostype);
- if (ostypelen > (int) sizeof(request.extra.str)) {
- req->data.arg = -2;
- req->len = sizeof(virProxyPacket);
- } else {
- req->data.arg = 0;
- memmove(&request.extra.str[0], ostype, ostypelen);
- req->len = sizeof(virProxyPacket) + ostypelen;
- }
- free(ostype);
- }
- break;
- default:
- goto comm_error;
- }
- ret = proxyWriteClientSocket(nr, req);
- return(ret);
-
-comm_error:
- fprintf(stderr,
- "Communication error with client %d: malformed packet\n", nr);
- proxyCloseClientSocket(nr);
- return(-1);
-}
-
-/************************************************************************
- * *
- * Main loop processing *
- * *
- ************************************************************************/
-
-/**
- * proxyProcessRequests:
- *
- * process requests and timers
- */
-static void
-proxyProcessRequests(void) {
- int exit_timeout = 30;
- int ret, i;
-
- while (!done) {
- /*
- * wait for requests, with a one second timeout
- */
- ret = poll(&pollInfos[0], nbClients + 1, 1000);
- if (ret == 0) { /* timeout */
- if ((nbClients == 0) && (persist == 0)) {
- exit_timeout--;
- if (exit_timeout == 0) {
- done = 1;
- if (debug > 0) {
- fprintf(stderr, "Exitting after 30s without clients\n");
- }
- }
- } else
- exit_timeout = 30;
- if (debug > 1)
- fprintf(stderr, "poll timeout\n");
- continue;
- } else if (ret < 0) {
- if (errno == EINTR) {
- if (debug > 0)
- fprintf(stderr, "poll syscall interrupted\n");
- continue;
- }
- fprintf(stderr, "poll syscall failed\n");
- break;
- }
- /*
- * there have been I/O to process
- */
- exit_timeout = 30;
- if (pollInfos[0].revents != 0) {
- if (pollInfos[0].revents & POLLIN) {
- proxyAcceptClientSocket();
- } else {
- fprintf(stderr, "Got an error %d on incoming socket %d\n",
- pollInfos[0].revents, pollInfos[0].fd);
- break;
- }
- }
-
- /*
- * process the clients in reverse order since on error or disconnect
- * pollInfos is compacted to remove the given client.
- */
- for (i = nbClients;i > 0;i--) {
- if (pollInfos[i].revents & POLLIN) {
- proxyReadClientSocket(i);
- } else if (pollInfos[i].revents != 0) {
- fprintf(stderr, "Got an error %d on client %d socket %d\n",
- pollInfos[i].revents, i, pollInfos[i].fd);
- proxyCloseClientSocket(i);
- }
- }
-
- }
-}
-
-/**
- * proxyMainLoop:
- *
- * main loop for the proxy, continually try to keep the unix socket
- * open, serve client requests, and process timing events.
- */
-
-static void
-proxyMainLoop(void) {
- while (! done) {
- if (proxyListenUnixSocket(PROXY_SOCKET_PATH) < 0)
- break;
- proxyProcessRequests();
- }
- proxyCloseClientSockets();
-}
-
-/**
- * usage:
- *
- * dump on stdout informations about the program
- */
-static void
-usage(const char *progname) {
- printf("Usage: %s [-v] [-v]\n", progname);
- printf(" option -v increase the verbosity level for debugging\n");
- printf("This is a proxy for xen services used by libvirt to offer\n");
- printf("safe and fast status information on the Xen virtualization.\n");
- printf("This need not be run manually it's started automatically.\n");
-}
-
-/**
- * main:
- *
- * Check that we are running with root priviledges, initialize the
- * connections to the daemon and or hypervisor, and then run the main loop
- */
-int main(int argc, char **argv) {
- int i;
-
- if (!setlocale(LC_ALL, "")) {
- perror("setlocale");
- return -1;
- }
- if (!bindtextdomain(GETTEXT_PACKAGE, LOCALEBASEDIR)) {
- perror("bindtextdomain");
- return -1;
- }
- if (!textdomain(GETTEXT_PACKAGE)) {
- perror("textdomain");
- return -1;
- }
-
- for (i = 1; i < argc; i++) {
- if (!strcmp(argv[i], "-v")) {
- debug++;
- } else if (!strcmp(argv[i], "-no-timeout")) {
- persist = 1;
- } else {
- usage(argv[0]);
- exit(1);
- }
- }
-
-
- if (geteuid() != 0) {
- fprintf(stderr, "%s must be run as root or suid\n", argv[0]);
- /* exit(1); */
- }
-
- /*
- * setup a connection block
- */
- memset(conn, 0, sizeof(conninfos));
- conn->magic = VIR_CONNECT_MAGIC;
-
- /*
- * very fist thing, use the socket as an exclusive lock, this then
- * allow to do timed exits, avoiding constant CPU usage in case of
- * failure.
- */
- if (proxyListenUnixSocket(PROXY_SOCKET_PATH) < 0)
- exit(0);
- if (proxyInitXen() == 0)
- proxyMainLoop();
- sleep(1);
- proxyCloseUnixSocket();
- exit(0);
-}
-
-#else /* WITHOUT_XEN */
-int main(void) {
- fprintf(stderr, "libvirt was compiled without Xen support\n");
- exit(1);
-}
-#endif /* WITH_XEN */
-
-/*
- * vim: set tabstop=4:
- * vim: set shiftwidth=4:
- * vim: set expandtab:
- */
-/*
- * Local variables:
- * indent-tabs-mode: nil
- * c-indent-level: 4
- * c-basic-offset: 4
- * tab-width: 4
- * End:
- */
diff -r d676d6414f07 src/Makefile.am
--- a/src/Makefile.am Tue Sep 18 14:23:22 2007 -0400
+++ b/src/Makefile.am Tue Sep 18 14:29:40 2007 -0400
@@ -41,7 +41,6 @@ CLIENT_SOURCES = \
sexpr.c sexpr.h \
virterror.c \
driver.h \
- proxy_internal.c proxy_internal.h \
conf.c conf.h \
xm_internal.c xm_internal.h \
remote_internal.c remote_internal.h \
diff -r d676d6414f07 src/proxy_internal.c
--- a/src/proxy_internal.c Tue Sep 18 14:23:22 2007 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1124 +0,0 @@
-/*
- * proxy_client.c: client side of the communication with the libvirt proxy.
- *
- * Copyright (C) 2006 Red Hat, Inc.
- *
- * See COPYING.LIB for the License of this software
- *
- * Daniel Veillard <veillard redhat com>
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/poll.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/wait.h>
-#include <string.h>
-#include "internal.h"
-#include "driver.h"
-#include "proxy_internal.h"
-#include "xen_unified.h"
-
-#define STANDALONE
-
-static int debug = 0;
-
-static int xenProxyClose(virConnectPtr conn);
-static int xenProxyOpen(virConnectPtr conn, const char *name, int flags);
-static int xenProxyGetVersion(virConnectPtr conn, unsigned long *hvVer);
-static int xenProxyNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
-static char *xenProxyGetCapabilities(virConnectPtr conn);
-static int xenProxyListDomains(virConnectPtr conn, int *ids, int maxids);
-static int xenProxyNumOfDomains(virConnectPtr conn);
-static unsigned long xenProxyDomainGetMaxMemory(virDomainPtr domain);
-static int xenProxyDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info);
-static char *xenProxyDomainDumpXML(virDomainPtr domain, int flags);
-static char *xenProxyDomainGetOSType(virDomainPtr domain);
-
-struct xenUnifiedDriver xenProxyDriver = {
- xenProxyOpen, /* open */
- xenProxyClose, /* close */
- NULL, /* type */
- xenProxyGetVersion, /* version */
- NULL, /* hostname */
- NULL, /* URI */
- xenProxyNodeGetInfo, /* nodeGetInfo */
- xenProxyGetCapabilities, /* getCapabilities */
- xenProxyListDomains, /* listDomains */
- xenProxyNumOfDomains, /* numOfDomains */
- NULL, /* domainCreateLinux */
- NULL, /* domainSuspend */
- NULL, /* domainResume */
- NULL, /* domainShutdown */
- NULL, /* domainReboot */
- NULL, /* domainDestroy */
- xenProxyDomainGetOSType, /* domainGetOSType */
- xenProxyDomainGetMaxMemory, /* domainGetMaxMemory */
- NULL, /* domainSetMaxMemory */
- NULL, /* domainSetMemory */
- xenProxyDomainGetInfo, /* domainGetInfo */
- NULL, /* domainSave */
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- NULL, /* domainSetVcpus */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- NULL, /* domainGetMaxVcpus */
- xenProxyDomainDumpXML, /* domainDumpXML */
- NULL, /* listDefinedDomains */
- NULL, /* numOfDefinedDomains */
- NULL, /* domainCreate */
- NULL, /* domainDefineXML */
- NULL, /* domainUndefine */
- NULL, /* domainAttachDevice */
- NULL, /* domainDetachDevice */
- NULL, /* domainGetAutostart */
- NULL, /* domainSetAutostart */
- NULL, /* domainGetSchedulerType */
- NULL, /* domainGetSchedulerParameters */
- NULL, /* domainSetSchedulerParameters */
-};
-
-/**
- * xenProxyInit:
- *
- * Initialise the xen proxy driver.
- */
-int
-xenProxyInit (void)
-{
- return 0;
-}
-
-/************************************************************************
- * *
- * Error handling *
- * *
- ************************************************************************/
-
-/**
- * virProxyError:
- * @conn: the connection if available
- * @error: the error noumber
- * @info: extra information string
- *
- * Handle an error at the xend daemon interface
- */
-static void
-virProxyError(virConnectPtr conn, virErrorNumber error, const char *info)
-{
- const char *errmsg;
-
- if (error == VIR_ERR_OK)
- return;
-
- errmsg = __virErrorMsg(error, info);
- __virRaiseError(conn, NULL, NULL, VIR_FROM_PROXY, error, VIR_ERR_ERROR,
- errmsg, info, NULL, 0, 0, errmsg, info);
-}
-
-/************************************************************************
- * *
- * Automatic startup of the proxy server if it is not running *
- * *
- ************************************************************************/
-/**
- * virProxyFindServerPath:
- *
- * Tries to find the path to the gam_server binary.
- *
- * Returns path on success or NULL in case of error.
- */
-static const char *
-virProxyFindServerPath(void)
-{
- static const char *serverPaths[] = {
- BINDIR "/libvirt_proxy",
- "/usr/bin/libvirt_proxy_dbg",
- NULL
- };
- int i;
- const char *debugProxy = getenv("LIBVIRT_DEBUG_PROXY");
-
- if (debugProxy)
- return(debugProxy);
-
- for (i = 0; serverPaths[i]; i++) {
- if (access(serverPaths[i], X_OK | R_OK) == 0) {
- return serverPaths[i];
- }
- }
- return NULL;
-}
-
-/**
- * virProxyForkServer:
- *
- * Forks and try to launch the proxy server processing the requests for
- * libvirt when communicating with Xen.
- *
- * Returns 0 in case of success or -1 in case of detected error.
- */
-static int
-virProxyForkServer(void)
-{
- const char *proxyPath = virProxyFindServerPath();
- int ret, pid, status;
-
- if (!proxyPath) {
- fprintf(stderr, "failed to find libvirt_proxy\n");
- return(-1);
- }
-
- if (debug)
- fprintf(stderr, "Asking to launch %s\n", proxyPath);
-
- /* Become a daemon */
- pid = fork();
- if (pid == 0) {
- long open_max;
- long i;
-
- /* don't hold open fd opened from the client of the library */
- open_max = sysconf (_SC_OPEN_MAX);
- for (i = 0; i < open_max; i++)
- fcntl (i, F_SETFD, FD_CLOEXEC);
-
- setsid();
- if (fork() == 0) {
- execl(proxyPath, proxyPath, NULL);
- fprintf(stderr, _("failed to exec %s\n"), proxyPath);
- }
- /*
- * calling exit() generate troubles for termination handlers
- */
- _exit(0);
- }
-
- /*
- * do a waitpid on the intermediate process to avoid zombies.
- */
-retry_wait:
- ret = waitpid(pid, &status, 0);
- if (ret < 0) {
- if (errno == EINTR)
- goto retry_wait;
- }
-
- return (0);
-}
-
-/************************************************************************
- * *
- * Processing of client sockets *
- * *
- ************************************************************************/
-
-/**
- * virProxyOpenClientSocket:
- * @path: the fileame for the socket
- *
- * try to connect to the socket open by libvirt_proxy
- *
- * Returns the associated file descriptor or -1 in case of failure
- */
-static int
-virProxyOpenClientSocket(const char *path) {
- int fd;
- struct sockaddr_un addr;
- int trials = 0;
-
-retry:
- fd = socket(PF_UNIX, SOCK_STREAM, 0);
- if (fd < 0) {
- return(-1);
- }
-
- /*
- * Abstract socket do not hit the filesystem, way more secure and
- * garanteed to be atomic
- */
- memset(&addr, 0, sizeof(addr));
- addr.sun_family = AF_UNIX;
- addr.sun_path[0] = '\0';
- strncpy(&addr.sun_path[1], path, (sizeof(addr) - 4) - 2);
-
- /*
- * now bind the socket to that address and listen on it
- */
- if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
- close(fd);
- if (trials < 3) {
- if (virProxyForkServer() < 0)
- return(-1);
- trials++;
- usleep(5000 * trials * trials);
- goto retry;
- }
- return (-1);
- }
-
- if (debug > 0)
- fprintf(stderr, "connected to unix socket %s via %d\n", path, fd);
-
- return (fd);
-}
-
-/**
- * virProxyCloseClientSocket:
- * @fd: the file descriptor for the socket
- *
- * Close the socket from that client
- *
- * Returns 0 in case of success and -1 in case of error
- */
-static int
-virProxyCloseClientSocket(int fd) {
- int ret;
-
- if (fd < 0)
- return(-1);
-
- ret = close(fd);
- if (ret != 0)
- fprintf(stderr, _("Failed to close socket %d\n"), fd);
- else if (debug > 0)
- fprintf(stderr, "Closed socket %d\n", fd);
- return(ret);
-}
-
-/**
- * virProxyReadClientSocket:
- * @fd: the socket
- * @buffer: the target memory area
- * @len: the lenght in bytes
- * @quiet: quiet access
- *
- * Process a read from a client socket
- *
- * Returns the number of byte read or -1 in case of error.
- */
-static int
-virProxyReadClientSocket(int fd, char *buffer, int len, int quiet) {
- int ret;
-
- if ((fd < 0) || (buffer == NULL) || (len < 0))
- return(-1);
-
-retry:
- ret = read(fd, buffer, len);
- if (ret < 0) {
- if (errno == EINTR) {
- if (debug > 0)
- fprintf(stderr, "read socket %d interrupted\n", fd);
- goto retry;
- }
- if (!quiet)
- fprintf(stderr, _("Failed to read socket %d\n"), fd);
- return(-1);
- }
-
- if (debug)
- fprintf(stderr, "read %d bytes from socket %d\n",
- ret, fd);
- return(ret);
-}
-
-/**
- * virProxyWriteClientSocket:
- * @fd: the socket
- * @data: the data
- * @len: the lenght of data in bytes
- *
- * Process a read from a client socket
- */
-static int
-virProxyWriteClientSocket(int fd, const char *data, int len) {
- int ret;
-
- if ((fd < 0) || (data == NULL) || (len < 0))
- return(-1);
-
-retry:
- ret = write(fd, data, len);
- if (ret < 0) {
- if (errno == EINTR) {
- if (debug > 0)
- fprintf(stderr, "write socket %d, %d bytes interrupted\n",
- fd, len);
- goto retry;
- }
- fprintf(stderr, _("Failed to write to socket %d\n"), fd);
- return(-1);
- }
- if (debug)
- fprintf(stderr, "wrote %d bytes to socket %d\n",
- len, fd);
-
- return(0);
-}
-
-/************************************************************************
- * *
- * Proxy commands processing *
- * *
- ************************************************************************/
-
-/**
- * xenProxyClose:
- * @conn: pointer to the hypervisor connection
- *
- * Shutdown the Xen proxy communication layer
- */
-static int
-xenProxyClose(virConnectPtr conn)
-{
- xenUnifiedPrivatePtr priv;
-
- if (conn == NULL) {
- 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
-xenProxyCommand(virConnectPtr conn, virProxyPacketPtr request,
- virProxyFullPacketPtr answer, int quiet) {
- static int serial = 0;
- int ret;
- virProxyPacketPtr res = NULL;
- xenUnifiedPrivatePtr priv;
-
- if (conn == NULL) {
- 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
- */
- ++serial;
- if (serial >= 4096)
- serial = 0;
- request->version = PROXY_PROTO_VERSION;
- request->serial = serial;
- ret = virProxyWriteClientSocket(priv->proxy, (const char *) request,
- request->len);
- if (ret < 0)
- return(-1);
-retry:
- if (answer == NULL) {
- /* read in situ */
- ret = virProxyReadClientSocket(priv->proxy, (char *) request,
- sizeof(virProxyPacket), quiet);
- if (ret < 0)
- return(-1);
- if (ret != sizeof(virProxyPacket)) {
- fprintf(stderr,
- _("Communication error with proxy: got %d bytes of %d\n"),
- ret, (int) sizeof(virProxyPacket));
- xenProxyClose(conn);
- return(-1);
- }
- res = request;
- if (res->len != sizeof(virProxyPacket)) {
- fprintf(stderr,
- _("Communication error with proxy: expected %d bytes got %d\n"),
- (int) sizeof(virProxyPacket), res->len);
- xenProxyClose(conn);
- return(-1);
- }
- } else {
- /* read in packet provided */
- ret = virProxyReadClientSocket(priv->proxy, (char *) answer,
- sizeof(virProxyPacket), quiet);
- if (ret < 0)
- return(-1);
- if (ret != sizeof(virProxyPacket)) {
- fprintf(stderr,
- _("Communication error with proxy: got %d bytes of %d\n"),
- ret, (int) sizeof(virProxyPacket));
- xenProxyClose(conn);
- return(-1);
- }
- res = (virProxyPacketPtr) answer;
- if ((res->len < sizeof(virProxyPacket)) ||
- (res->len > sizeof(virProxyFullPacket))) {
- fprintf(stderr,
- _("Communication error with proxy: got %d bytes packet\n"),
- res->len);
- xenProxyClose(conn);
- return(-1);
- }
- if (res->len > sizeof(virProxyPacket)) {
- ret = virProxyReadClientSocket(priv->proxy,
- (char *) &(answer->extra.arg[0]),
- res->len - ret, quiet);
- if (ret != (int) (res->len - sizeof(virProxyPacket))) {
- fprintf(stderr,
- _("Communication error with proxy: got %d bytes of %d\n"),
- ret, (int) sizeof(virProxyPacket));
- xenProxyClose(conn);
- return(-1);
- }
- }
- }
- /*
- * do more checks on the incoming packet.
- */
- if ((res == NULL) || (res->version != PROXY_PROTO_VERSION) ||
- (res->len < sizeof(virProxyPacket))) {
- fprintf(stderr,
- _("Communication error with proxy: malformed packet\n"));
- xenProxyClose(conn);
- return(-1);
- }
- if (res->serial != serial) {
- TODO /* Asynchronous communication */
- fprintf(stderr, _("got asynchronous packet number %d\n"), res->serial);
- goto retry;
- }
- return(0);
-}
-
-/**
- * xenProxyOpen:
- * @conn: pointer to the hypervisor connection
- * @name: URL for the target, NULL for local
- * @flags: combination of virDrvOpenFlag(s)
- *
- * Try to initialize the Xen proxy communication layer
- * This can be opened only for a read-only kind of access
- *
- * Returns 0 in case of success, and -1 in case of failure
- */
-int
-xenProxyOpen(virConnectPtr conn, const char *name ATTRIBUTE_UNUSED, int flags)
-{
- virProxyPacket req;
- int ret;
- int fd;
- xenUnifiedPrivatePtr priv;
-
- if (!(flags & VIR_DRV_OPEN_RO))
- return(-1);
-
- priv = (xenUnifiedPrivatePtr) conn->privateData;
- priv->proxy = -1;
-
- fd = virProxyOpenClientSocket(PROXY_SOCKET_PATH);
- if (fd < 0) {
- virProxyError(NULL, VIR_ERR_NO_XEN, PROXY_SOCKET_PATH);
- return(-1);
- }
- priv->proxy = fd;
-
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_NONE;
- req.len = sizeof(req);
- ret = xenProxyCommand(conn, &req, NULL, 1);
- if ((ret < 0) || (req.command != VIR_PROXY_NONE)) {
- virProxyError(NULL, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
- xenProxyClose(conn);
- return(-1);
- }
- return(0);
-}
-
-/************************************************************************
- * *
- * Driver entry points *
- * *
- ************************************************************************/
-
-/**
- * xenProxyGetVersion:
- * @conn: pointer to the Xen Daemon block
- * @hvVer: return value for the version of the running hypervisor (OUT)
- *
- * Get the version level of the Hypervisor running.
- *
- * Returns -1 in case of error, 0 otherwise. if the version can't be
- * extracted by lack of capacities returns 0 and @hvVer is 0, otherwise
- * @hvVer value is major * 1,000,000 + minor * 1,000 + release
- */
-static int
-xenProxyGetVersion(virConnectPtr conn, unsigned long *hvVer)
-{
- virProxyPacket req;
- int ret;
-
- if (!VIR_IS_CONNECT(conn)) {
- virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
- if (hvVer == NULL) {
- virProxyError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_VERSION;
- req.len = sizeof(req);
- ret = xenProxyCommand(conn, &req, NULL, 0);
- if (ret < 0) {
- xenProxyClose(conn);
- return(-1);
- }
- *hvVer = req.data.larg;
- return(0);
-}
-
-/**
- * xenProxyListDomains:
- * @conn: pointer to the hypervisor connection
- * @ids: array to collect the list of IDs of active domains
- * @maxids: size of @ids
- *
- * Collect the list of active domains, and store their ID in @maxids
- *
- * Returns the number of domain found or -1 in case of error
- */
-static int
-xenProxyListDomains(virConnectPtr conn, int *ids, int maxids)
-{
- virProxyPacket req;
- virProxyFullPacket ans;
- int ret;
- int nb;
-
- if (!VIR_IS_CONNECT(conn)) {
- virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
- if ((ids == NULL) || (maxids <= 0)) {
- virProxyError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_LIST;
- req.len = sizeof(req);
- ret = xenProxyCommand(conn, &req, &ans, 0);
- if (ret < 0) {
- xenProxyClose(conn);
- return(-1);
- }
- nb = ans.data.arg;
- if ((nb > 1020) || (nb <= 0) ||
- (ans.len <= sizeof(virProxyPacket)) ||
- (ans.len > sizeof(virProxyFullPacket))) {
- virProxyError(conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
- return(-1);
- }
- if (nb > maxids)
- nb = maxids;
- memmove(ids, &ans.extra.arg[0], nb * sizeof(int));
-
- return(nb);
-}
-
-/**
- * xenProxyNumOfDomains:
- * @conn: pointer to the hypervisor connection
- *
- * Provides the number of active domains.
- *
- * Returns the number of domain found or -1 in case of error
- */
-static int
-xenProxyNumOfDomains(virConnectPtr conn)
-{
- virProxyPacket req;
- int ret;
-
- if (!VIR_IS_CONNECT(conn)) {
- virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_NUM_DOMAIN;
- req.len = sizeof(req);
- ret = xenProxyCommand(conn, &req, NULL, 0);
- if (ret < 0) {
- xenProxyClose(conn);
- return(-1);
- }
- return(req.data.arg);
-}
-
-
-/**
- * xenProxyDomainGetDomMaxMemory:
- * @conn: pointer to the hypervisor connection
- * @id: the domain ID number
- *
- * Ask the Xen Daemon for the maximum memory allowed for a domain
- *
- * Returns the memory size in kilobytes or 0 in case of error.
- */
-static unsigned long
-xenProxyDomainGetDomMaxMemory(virConnectPtr conn, int id)
-{
- virProxyPacket req;
- int ret;
-
- if (!VIR_IS_CONNECT(conn)) {
- virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (0);
- }
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_MAX_MEMORY;
- req.data.arg = id;
- req.len = sizeof(req);
- ret = xenProxyCommand(conn, &req, NULL, 0);
- if (ret < 0) {
- xenProxyClose(conn);
- return(0);
- }
- return(req.data.larg);
-}
-
-/**
- * xenProxyDomainGetMaxMemory:
- * @domain: pointer to the domain block
- *
- * Ask the Xen Daemon for the maximum memory allowed for a domain
- *
- * Returns the memory size in kilobytes or 0 in case of error.
- */
-static unsigned long
-xenProxyDomainGetMaxMemory(virDomainPtr domain)
-{
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- if (domain == NULL)
- virProxyError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- else
- virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (0);
- }
- if (domain->id < 0)
- return (0);
- return(xenProxyDomainGetDomMaxMemory(domain->conn, domain->id));
-}
-
-/**
- * xenProxyDomainGetInfo:
- * @domain: a domain object
- * @info: pointer to a virDomainInfo structure allocated by the user
- *
- * This method looks up information about a domain and update the
- * information block provided.
- *
- * Returns 0 in case of success, -1 in case of error
- */
-static int
-xenProxyDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
-{
- virProxyPacket req;
- virProxyFullPacket ans;
- int ret;
-
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- if (domain == NULL)
- virProxyError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- else
- virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->id < 0)
- return (-1);
- if (info == NULL) {
- virProxyError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_DOMAIN_INFO;
- req.data.arg = domain->id;
- req.len = sizeof(req);
- ret = xenProxyCommand(domain->conn, &req, &ans, 0);
- if (ret < 0) {
- xenProxyClose(domain->conn);
- return(-1);
- }
- if (ans.len != sizeof(virProxyPacket) + sizeof(virDomainInfo)) {
- virProxyError(domain->conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
- return (-1);
- }
- memmove(info, &ans.extra.dinfo, sizeof(virDomainInfo));
-
- return(0);
-}
-
-/**
- * xenProxyLookupByID:
- * @conn: pointer to the hypervisor connection
- * @id: the domain ID number
- *
- * Try to find a domain based on the hypervisor ID number
- *
- * Returns a new domain object or NULL in case of failure
- */
-virDomainPtr
-xenProxyLookupByID(virConnectPtr conn, int id)
-{
- virProxyPacket req;
- virProxyFullPacket ans;
- unsigned char uuid[VIR_UUID_BUFLEN];
- const char *name;
- int ret;
- virDomainPtr res;
-
- if (!VIR_IS_CONNECT(conn)) {
- virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (NULL);
- }
- if (id < 0) {
- virProxyError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_LOOKUP_ID;
- req.data.arg = id;
- req.len = sizeof(req);
- ret = xenProxyCommand(conn, &req, &ans, 0);
- if (ret < 0) {
- xenProxyClose(conn);
- return(NULL);
- }
- if (ans.data.arg == -1) {
- return(NULL);
- }
- memcpy(uuid, &ans.extra.str[0], VIR_UUID_BUFLEN);
- name = &ans.extra.str[VIR_UUID_BUFLEN];
- res = virGetDomain(conn, name, uuid);
- if (res) res->id = id;
- return(res);
-}
-
-/**
- * xenProxyLookupByUUID:
- * @conn: pointer to the hypervisor connection
- * @uuid: the raw UUID for the domain
- *
- * Try to lookup a domain on xend based on its UUID.
- *
- * Returns a new domain object or NULL in case of failure
- */
-virDomainPtr
-xenProxyLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
-{
- virProxyFullPacket req;
- const char *name;
- int ret;
- virDomainPtr res;
-
- if (!VIR_IS_CONNECT(conn)) {
- virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (NULL);
- }
- if (uuid == NULL) {
- virProxyError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
- memset(&req, 0, sizeof(virProxyPacket));
- req.command = VIR_PROXY_LOOKUP_UUID;
- req.len = sizeof(virProxyPacket) + VIR_UUID_BUFLEN;
- memcpy(&req.extra.str[0], uuid, VIR_UUID_BUFLEN);
-
- ret = xenProxyCommand(conn, (virProxyPacketPtr) &req, &req, 0);
- if (ret < 0) {
- xenProxyClose(conn);
- return(NULL);
- }
- if (req.data.arg == -1) {
- return(NULL);
- }
- name = &req.extra.str[0];
- res = virGetDomain(conn, name, uuid);
- if (res) res->id = req.data.arg;
- return(res);
-}
-
-/**
- * xenProxyLookupByName:
- * @conn: A xend instance
- * @name: The name of the domain
- *
- * This method looks up information about a domain based on its name
- *
- * Returns a new domain object or NULL in case of failure
- */
-virDomainPtr
-xenProxyLookupByName(virConnectPtr conn, const char *name)
-{
- virProxyFullPacket req;
- int ret, len;
- virDomainPtr res;
-
- if (!VIR_IS_CONNECT(conn)) {
- virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (NULL);
- }
- if (name == NULL) {
- virProxyError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
- len = strlen(name);
- if (len > 1000) {
- virProxyError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
- memset(&req, 0, sizeof(virProxyPacket));
- req.command = VIR_PROXY_LOOKUP_NAME;
- req.len = sizeof(virProxyPacket) + len + 1;
- strcpy(&req.extra.str[0], name);
- ret = xenProxyCommand(conn, (virProxyPacketPtr) &req, &req, 0);
- if (ret < 0) {
- xenProxyClose(conn);
- return(NULL);
- }
- if (req.data.arg == -1) {
- return(NULL);
- }
- res = virGetDomain(conn, name, (const unsigned char *)&req.extra.str[0]);
- if (res) res->id = req.data.arg;
- return(res);
-}
-
-/**
- * xenProxyNodeGetInfo:
- * @conn: pointer to the Xen Daemon block
- * @info: pointer to a virNodeInfo structure allocated by the user
- *
- * Extract hardware information about the node.
- *
- * Returns 0 in case of success and -1 in case of failure.
- */
-static int
-xenProxyNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info) {
- virProxyPacket req;
- virProxyFullPacket ans;
- int ret;
-
- if (!VIR_IS_CONNECT(conn)) {
- virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
- if (info == NULL) {
- virProxyError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_NODE_INFO;
- req.data.arg = 0;
- req.len = sizeof(req);
- ret = xenProxyCommand(conn, &req, &ans, 0);
- if (ret < 0) {
- xenProxyClose(conn);
- return(-1);
- }
- if (ans.data.arg == -1) {
- return(-1);
- }
- if (ans.len != sizeof(virProxyPacket) + sizeof(virNodeInfo)) {
- return(-1);
- }
- memcpy(info, &ans.extra.ninfo, sizeof(virNodeInfo));
- return(0);
-}
-
-/**
- * xenProxyGetCapabilities:
- * @conn: pointer to the Xen Daemon block
- *
- * Extract capabilities of the hypervisor.
- *
- * Returns capabilities in case of success (freed by caller)
- * and NULL in case of failure.
- */
-static char *
-xenProxyGetCapabilities (virConnectPtr conn)
-{
- virProxyPacket req;
- virProxyFullPacket ans;
- int ret, xmllen;
- char *xml;
-
- if (!VIR_IS_CONNECT(conn)) {
- virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return NULL;
- }
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_GET_CAPABILITIES;
- req.data.arg = 0;
- req.len = sizeof(req);
- ret = xenProxyCommand(conn, &req, &ans, 0);
- if (ret < 0) {
- xenProxyClose(conn);
- return NULL;
- }
- if (ans.data.arg == -1)
- return NULL;
- if (ans.len <= sizeof(virProxyPacket)) {
- virProxyError(conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
- return NULL;
- }
-
- xmllen = ans.len - sizeof (virProxyPacket);
- xml = malloc (xmllen+1);
- if (!xml) {
- virProxyError (conn, VIR_ERR_NO_MEMORY, __FUNCTION__);
- return NULL;
- }
- memmove (xml, ans.extra.str, xmllen);
- xml[xmllen] = '\0';
-
- return xml;
-}
-
-/**
- * xenProxyDomainDumpXML:
- * @domain: a domain object
- * @flags: xml generation flags
- *
- * This method generates an XML description of a domain.
- *
- * Returns the XML document on success, NULL otherwise.
- */
-static char *
-xenProxyDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED)
-{
- virProxyPacket req;
- virProxyFullPacket ans;
- int ret;
- int xmllen;
- char *xml;
-
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- if (domain == NULL)
- virProxyError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- else
- virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (NULL);
- }
- if (domain->id < 0)
- return (NULL);
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_DOMAIN_XML;
- req.data.arg = domain->id;
- req.len = sizeof(req);
- ret = xenProxyCommand(domain->conn, &req, &ans, 0);
- if (ret < 0) {
- xenProxyClose(domain->conn);
- return(NULL);
- }
- if (ans.len <= sizeof(virProxyPacket)) {
- virProxyError(domain->conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
- return (NULL);
- }
- xmllen = ans.len - sizeof(virProxyPacket);
- if (!(xml = malloc(xmllen+1))) {
- virProxyError(domain->conn, VIR_ERR_NO_MEMORY, __FUNCTION__);
- return NULL;
- }
- memmove(xml, &ans.extra.dinfo, xmllen);
- xml[xmllen] = '\0';
-
- return(xml);
-}
-
-/**
- * xenProxyDomainGetOSType:
- * @domain: a domain object
- *
- * Get the type of domain operation system.
- *
- * Returns the new string or NULL in case of error, the string must be
- * freed by the caller.
- */
-static char *
-xenProxyDomainGetOSType(virDomainPtr domain)
-{
- virProxyPacket req;
- virProxyFullPacket ans;
- int ret;
- int oslen;
- char *ostype;
-
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- if (domain == NULL)
- virProxyError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- else
- virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (NULL);
- }
- memset(&req, 0, sizeof(req));
- req.command = VIR_PROXY_DOMAIN_OSTYPE;
- req.data.arg = domain->id;
- req.len = sizeof(req);
- ret = xenProxyCommand(domain->conn, &req, &ans, 0);
- if (ret < 0) {
- xenProxyClose(domain->conn);
- return(NULL);
- }
- if ((ans.len == sizeof(virProxyPacket)) && (ans.data.arg < 0)) {
- return(NULL);
- }
-
- if (ans.len <= sizeof(virProxyPacket)) {
- virProxyError(domain->conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
- return (NULL);
- }
- oslen = ans.len - sizeof(virProxyPacket);
- if (!(ostype = malloc(oslen+1))) {
- virProxyError(domain->conn, VIR_ERR_NO_MEMORY, __FUNCTION__);
- return NULL;
- }
- memmove(ostype, &ans.extra.dinfo, oslen);
- ostype[oslen] = '\0';
-
- return(ostype);
-}
-
-/*
- * vim: set tabstop=4:
- * vim: set shiftwidth=4:
- * vim: set expandtab:
- */
-/*
- * Local variables:
- * indent-tabs-mode: nil
- * c-indent-level: 4
- * c-basic-offset: 4
- * tab-width: 4
- * End:
- */
diff -r d676d6414f07 src/proxy_internal.h
--- a/src/proxy_internal.h Tue Sep 18 14:23:22 2007 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-/*
- * proxy.h: common definitions for proxy usage
- *
- * Copyright (C) 2006 Red Hat, Inc.
- *
- * See COPYING.LIB for the License of this software
- *
- * Daniel Veillard <veillard redhat com>
- */
-
-
-#ifndef __LIBVIR_PROXY_H__
-#define __LIBVIR_PROXY_H__
-
-#include <libvirt/libvirt.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define PROXY_SOCKET_PATH "/tmp/livirt_proxy_conn"
-#define PROXY_PROTO_VERSION 1
-
-/*
- * the command allowed though the proxy
- */
-typedef enum {
- VIR_PROXY_NONE = 0,
- VIR_PROXY_VERSION = 1,
- VIR_PROXY_NODE_INFO = 2,
- VIR_PROXY_LIST = 3,
- VIR_PROXY_NUM_DOMAIN = 4,
- VIR_PROXY_LOOKUP_ID = 5,
- VIR_PROXY_LOOKUP_UUID = 6,
- VIR_PROXY_LOOKUP_NAME = 7,
- VIR_PROXY_MAX_MEMORY = 8,
- VIR_PROXY_DOMAIN_INFO = 9,
- VIR_PROXY_DOMAIN_XML = 10,
- VIR_PROXY_DOMAIN_OSTYPE = 11,
- VIR_PROXY_GET_CAPABILITIES = 12
-} virProxyCommand;
-
-/*
- * structure used by the client to make a request to the proxy
- * and by the proxy when answering the client.
- * the size may not be fixed, it's passed as len.
- */
-struct _virProxyPacket {
- unsigned short version; /* version of the proxy protocol */
- unsigned short command; /* command number a virProxyCommand */
- unsigned short serial; /* command serial number */
- unsigned short len; /* the length of the request */
- union {
- char string[8]; /* string data */
- int arg; /* or int argument */
- long larg; /* or long argument */
- } data;
-};
-typedef struct _virProxyPacket virProxyPacket;
-typedef virProxyPacket *virProxyPacketPtr;
-
-/*
- * If there is extra data sent from the proxy to the client,
- * they are appended after the packet.
- * the size may not be fixed, it's passed as len and includes the
- * extra data.
- */
-struct _virProxyFullPacket {
- unsigned short version; /* version of the proxy protocol */
- unsigned short command; /* command number a virProxyCommand */
- unsigned short serial; /* command serial number */
- unsigned short len; /* the length of the request */
- union {
- char string[8]; /* string data */
- int arg; /* or int argument */
- long larg; /* or long argument */
- } data;
- /* that should be aligned on a 16bytes boundary */
- union {
- char str[4080]; /* extra char array */
- int arg[1020]; /* extra int array */
- virDomainInfo dinfo; /* domain information */
- virNodeInfo ninfo; /* node information */
- } extra;
-};
-typedef struct _virProxyFullPacket virProxyFullPacket;
-typedef virProxyFullPacket *virProxyFullPacketPtr;
-
-/* xen_unified makes direct calls or indirect calls through here. */
-extern struct xenUnifiedDriver xenProxyDriver;
-extern int xenProxyInit (void);
-
-extern virDomainPtr xenProxyLookupByID(virConnectPtr conn, int id);
-extern virDomainPtr xenProxyLookupByUUID(virConnectPtr conn,
- const unsigned char *uuid);
-extern virDomainPtr xenProxyLookupByName(virConnectPtr conn,
- const char *domname);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* __LIBVIR_PROXY_H__ */
-
-/*
- * vim: set tabstop=4:
- * vim: set shiftwidth=4:
- * vim: set expandtab:
- */
-/*
- * Local variables:
- * indent-tabs-mode: nil
- * c-indent-level: 4
- * c-basic-offset: 4
- * tab-width: 4
- * End:
- */
diff -r d676d6414f07 src/xen_unified.c
--- a/src/xen_unified.c Tue Sep 18 14:23:22 2007 -0400
+++ b/src/xen_unified.c Tue Sep 18 14:29:40 2007 -0400
@@ -12,10 +12,10 @@
/* Note:
*
- * This driver provides a unified interface to the five
- * separate underlying Xen drivers (xen_internal, proxy_internal,
+ * This driver provides a unified interface to the four
+ * separate underlying Xen drivers (xen_internal,
* xend_internal, xs_internal and xm_internal). Historically
- * the body of libvirt.c handled the five Xen drivers,
+ * the body of libvirt.c handled the four Xen drivers,
* and contained Xen-specific code.
*/
@@ -32,7 +32,6 @@
#include "xen_unified.h"
#include "xen_internal.h"
-#include "proxy_internal.h"
#include "xend_internal.h"
#include "xs_internal.h"
#include "xm_internal.h"
@@ -40,7 +39,6 @@
/* The five Xen drivers below us. */
static struct xenUnifiedDriver *drivers[XEN_UNIFIED_NR_DRIVERS] = {
[XEN_UNIFIED_HYPERVISOR_OFFSET] = &xenHypervisorDriver,
- [XEN_UNIFIED_PROXY_OFFSET] = &xenProxyDriver,
[XEN_UNIFIED_XEND_OFFSET] = &xenDaemonDriver,
[XEN_UNIFIED_XS_OFFSET] = &xenStoreDriver,
[XEN_UNIFIED_XM_OFFSET] = &xenXMDriver,
@@ -78,7 +76,7 @@ static int
static int
xenUnifiedOpen (virConnectPtr conn, const char *name, int flags)
{
- int i, j;
+ int i, j, success = 0;
xenUnifiedPrivatePtr priv;
xmlURIPtr uri;
@@ -134,7 +132,6 @@ xenUnifiedOpen (virConnectPtr conn, cons
priv->len = -1;
priv->addr = NULL;
priv->xshandle = NULL;
- priv->proxy = -1;
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i) {
priv->opened[i] = 0;
@@ -144,16 +141,14 @@ xenUnifiedOpen (virConnectPtr conn, cons
priv->xendConfigVersion > 2)
continue;
- /* Ignore proxy for root */
- if (i == XEN_UNIFIED_PROXY_OFFSET && getuid() == 0)
- continue;
-
if (drivers[i]->open) {
#ifdef ENABLE_DEBUG
fprintf (stderr, "libvirt: xenUnifiedOpen: trying Xen sub-driver %d\n", i);
#endif
- if (drivers[i]->open (conn, name, flags) == VIR_DRV_OPEN_SUCCESS)
+ if (drivers[i]->open (conn, name, flags) == VIR_DRV_OPEN_SUCCESS) {
priv->opened[i] = 1;
+ success = 1;
+ }
#ifdef ENABLE_DEBUG
fprintf (stderr, "libvirt: xenUnifiedOpen: Xen sub-driver %d open %s\n",
i, priv->opened[i] ? "ok" : "failed");
@@ -161,9 +156,8 @@ xenUnifiedOpen (virConnectPtr conn, cons
}
/* If as root, then all drivers must succeed.
- If non-root, then only proxy must succeed */
- if (!priv->opened[i] &&
- (getuid() == 0 || i == XEN_UNIFIED_PROXY_OFFSET)) {
+ If non-root, then pass off to remote driver */
+ if (!priv->opened[i] && getuid() == 0) {
for (j = 0; j < i; ++j)
if (priv->opened[j]) drivers[j]->close (conn);
free (priv->name);
@@ -175,7 +169,7 @@ xenUnifiedOpen (virConnectPtr conn, cons
}
}
- return VIR_DRV_OPEN_SUCCESS;
+ return success ? VIR_DRV_OPEN_SUCCESS : VIR_DRV_OPEN_DECLINED;
}
#define GET_PRIVATE(conn) \
@@ -239,9 +233,6 @@ xenUnifiedVersion (virConnectPtr conn, u
return -1;
}
-/* NB: Even if connected to the proxy, we're still on the
- * same machine.
- */
static char *
xenUnifiedGetHostname (virConnectPtr conn)
{
@@ -394,13 +385,6 @@ xenUnifiedDomainLookupByID (virConnectPt
return ret;
}
- /* Try proxy. */
- if (priv->opened[XEN_UNIFIED_PROXY_OFFSET]) {
- ret = xenProxyLookupByID (conn, id);
- if (ret || conn->err.code != VIR_ERR_OK)
- return ret;
- }
-
/* Try xend. */
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
ret = xenDaemonLookupByID (conn, id);
@@ -432,13 +416,6 @@ xenUnifiedDomainLookupByUUID (virConnect
return ret;
}
- /* Try proxy. */
- if (priv->opened[XEN_UNIFIED_PROXY_OFFSET]) {
- ret = xenProxyLookupByUUID (conn, uuid);
- if (ret || conn->err.code != VIR_ERR_OK)
- return ret;
- }
-
/* Try xend. */
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
ret = xenDaemonLookupByUUID (conn, uuid);
@@ -469,13 +446,6 @@ xenUnifiedDomainLookupByName (virConnect
* there is one hanging around from a previous call.
*/
virConnResetLastError (conn);
-
- /* Try proxy. */
- if (priv->opened[XEN_UNIFIED_PROXY_OFFSET]) {
- ret = xenProxyLookupByName (conn, name);
- if (ret || conn->err.code != VIR_ERR_OK)
- return ret;
- }
/* Try xend. */
if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
@@ -1127,7 +1097,6 @@ xenUnifiedRegister (void)
{
/* Ignore failures here. */
(void) xenHypervisorInit ();
- (void) xenProxyInit ();
(void) xenDaemonInit ();
(void) xenStoreInit ();
(void) xenXMInit ();
diff -r d676d6414f07 src/xen_unified.h
--- a/src/xen_unified.h Tue Sep 18 14:23:22 2007 -0400
+++ b/src/xen_unified.h Tue Sep 18 14:29:40 2007 -0400
@@ -20,11 +20,10 @@ extern int xenUnifiedRegister (void);
extern int xenUnifiedRegister (void);
#define XEN_UNIFIED_HYPERVISOR_OFFSET 0
-#define XEN_UNIFIED_PROXY_OFFSET 1
-#define XEN_UNIFIED_XEND_OFFSET 2
-#define XEN_UNIFIED_XS_OFFSET 3
-#define XEN_UNIFIED_XM_OFFSET 4
-#define XEN_UNIFIED_NR_DRIVERS 5
+#define XEN_UNIFIED_XEND_OFFSET 1
+#define XEN_UNIFIED_XS_OFFSET 2
+#define XEN_UNIFIED_XM_OFFSET 3
+#define XEN_UNIFIED_NR_DRIVERS 4
/* _xenUnifiedDriver:
*
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]