]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
* include/libvir.h.in include/libvir.h src/internal.h src/libvir.c
authorDaniel Veillard <veillard@redhat.com>
Fri, 13 Jan 2006 16:41:01 +0000 (16:41 +0000)
committerDaniel Veillard <veillard@redhat.com>
Fri, 13 Jan 2006 16:41:01 +0000 (16:41 +0000)
  src/xend_internal.c src/xend_internal.h: starting to plug the
  xend code in, replacing structures mostly, but not finished.
Daniel

ChangeLog
docs/architecture.html
include/libvir.h
include/libvir.h.in
src/internal.h
src/libvir.c
src/xend_internal.c
src/xend_internal.h

index 9ff699d0767b4c5356b07b17fd0e0b1f263f3df4..8a61e17b537b9037c55d4743b4559a963416f4e9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Jan 13 17:39:24 CET 2006 Daniel Veillard <veillard@redhat.com>
+
+       * include/libvir.h.in include/libvir.h src/internal.h src/libvir.c
+         src/xend_internal.c src/xend_internal.h: starting to plug the
+         xend code in, replacing structures mostly, but not finished.
+
 Thu Jan 12 16:36:21 CET 2006 Daniel Veillard <veillard@redhat.com>
 
        * src/Makefile.am src/xend_internal.c src/xend_internal.h:
index 506cc8163b05906e00fffe137c2346d36dda3155..c80fd22db4f33408ddc720097141e0334927a5fa 100644 (file)
@@ -7,7 +7,7 @@ H1 {font-family: Verdana,Arial,Helvetica}
 H2 {font-family: Verdana,Arial,Helvetica}
 H3 {font-family: Verdana,Arial,Helvetica}
 A:link, A:visited, A:active { text-decoration: underline }
-</style><title>libvir architecture</title></head><body bgcolor="#8b7765" text="#000000" link="#a06060" vlink="#000000"><table border="0" width="100%" cellpadding="5" cellspacing="0" align="center"><tr><td width="120"><a href="http://www.redhat.com/"><img src="redhat.gif" alt="Red Hat Logo" /></a></td><td><table border="0" width="90%" cellpadding="2" cellspacing="0" align="center" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3" bgcolor="#fffacd"><tr><td align="center"><h1>Libvir the virtualization API</h1><h2>libvir architecture</h2></td></tr></table></td></tr></table></td></tr></table><table border="0" cellpadding="4" cellspacing="0" width="100%" align="center"><tr><td bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td valign="top" width="200" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Main Menu</b></center></td></tr><tr><td bgcolor="#fffacd"><form action="search.php" enctype="application/x-www-form-urlencoded" method="get"><input name="query" type="text" size="20" value="" /><input name="submit" type="submit" value="Search ..." /></form><ul><li><a href="index.html">Home</a></li><li><a href="news.html">Releases</a></li><li><a href="intro.html">Introduction</a></li><li><a href="architecture.html">libvir architecture</a></li><li><a href="downloads.html">Downloads</a></li><li><a href="FAQ.html">FAQ</a></li><li><a href="bugs.html">Reporting bugs and getting help</a></li><li><a style="font-weight:bold" href="html/index.html">API Menu</a></li><li><a href="ChangeLog.html">Recent Changes</a></li></ul></td></tr></table><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Related links</b></center></td></tr><tr><td bgcolor="#fffacd"><ul><li><a href="https://www.redhat.com/archives/libvir-list/">Mail archive</a></li><li><a href="http://www.cl.cam.ac.uk/Research/SRG/netos/xen/index.html">Xen project</a></li></ul></td></tr></table></td></tr></table><a href="http://xmlsoft.org/"><img src="Libxml2-Logo-90x34.gif" alt="Made with Libxml2 Logo" /></a></td><td valign="top" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%"><tr><td><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table border="0" cellpadding="3" cellspacing="1" width="100%"><tr><td bgcolor="#fffacd"><p>In a Xen environment, program using libvir have to execute in "Domain 0",
+</style><title>libvir architecture</title></head><body bgcolor="#8b7765" text="#000000" link="#a06060" vlink="#000000"><table border="0" width="100%" cellpadding="5" cellspacing="0" align="center"><tr><td width="120"><a href="http://www.redhat.com/"><img src="redhat.gif" alt="Red Hat Logo" /></a></td><td><table border="0" width="90%" cellpadding="2" cellspacing="0" align="center" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3" bgcolor="#fffacd"><tr><td align="center"><h1>Libvir the virtualization API</h1><h2>libvir architecture</h2></td></tr></table></td></tr></table></td></tr></table><table border="0" cellpadding="4" cellspacing="0" width="100%" align="center"><tr><td bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td valign="top" width="200" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Main Menu</b></center></td></tr><tr><td bgcolor="#fffacd"><form action="search.php" enctype="application/x-www-form-urlencoded" method="get"><input name="query" type="text" size="20" value="" /><input name="submit" type="submit" value="Search ..." /></form><ul><li><a href="index.html">Home</a></li><li><a href="news.html">Releases</a></li><li><a href="intro.html">Introduction</a></li><li><a href="architecture.html">libvir architecture</a></li><li><a href="downloads.html">Downloads</a></li><li><a href="FAQ.html">FAQ</a></li><li><a href="bugs.html">Reporting bugs and getting help</a></li><li><a style="font-weight:bold" href="html/index.html">API Menu</a></li><li><a href="ChangeLog.html">Recent Changes</a></li></ul></td></tr></table><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Related links</b></center></td></tr><tr><td bgcolor="#fffacd"><ul><li><a href="https://www.redhat.com/archives/libvir-list/">Mail archive</a></li><li><a href="http://www.cl.cam.ac.uk/Research/SRG/netos/xen/index.html">Xen project</a></li></ul></td></tr></table></td></tr></table><a href="http://xmlsoft.org/"><img src="Libxml2-Logo-90x34.gif" alt="Made with Libxml2 Logo" /></a></td><td valign="top" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%"><tr><td><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table border="0" cellpadding="3" cellspacing="1" width="100%"><tr><td bgcolor="#fffacd"><p>In a Xen environment, programs using libvir have to execute in "Domain 0",
 which is the primary Linux OS loaded on the machine. That OS kernel provides
 most if not all of the actual drivers used by the set of domains. It also
 runs the Xen Store, a database of informations shared by the hypervisor, the
index ba612e1f7d585361360105792c0e2dc027c973c4..f4bdac259080bd70971db196d00badcb665b41a9 100644 (file)
@@ -63,6 +63,30 @@ typedef enum {
      VIR_DOMAIN_SHUTOFF        = 5  /* the domain is shut off */
 } virDomainState;
 
+/**
+ * virDomainRestart:
+ *
+ * Flags that determine the action to take on a shutdown or crash of a domain
+ */
+typedef enum {
+     VIR_DOMAIN_DESTROY        = 1, /* destroy the domain */
+     VIR_DOMAIN_RESTART        = 2, /* restart the domain */
+     VIR_DOMAIN_PRESERVE= 3, /* keep as is, need manual destroy, for debug */
+     VIR_DOMAIN_RENAME_RESTART= 4/* restart under an new unique name */
+} virDomainRestart;
+
+/**
+ * virDeviceMode:
+ *
+ * Flags that determine permission to expose a device to the guest
+ */
+typedef enum {
+     VIR_DEVICE_DEFAULT        = 0, /* Default mode */
+     VIR_DEVICE_RO     = 1, /* Access read-only */
+     VIR_DEVICE_RW     = 2, /* Access read-write */
+     VIR_DEVICE_RW_FORCE= 3  /* Forced read-write even if already used */
+} virDeviceMode;
+
 /**
  * virDomainInfoPtr:
  *
@@ -99,6 +123,30 @@ struct _virDomainInfo {
 
 typedef virDomainInfo *virDomainInfoPtr;
 
+/**
+ * virDomainKernel:
+ *
+ * a virDomainImage is the set of kernel related informations associated
+ * to a domain
+ */
+
+typedef struct _virDomainKernel virDomainKernel;
+
+struct _virDomainKernel {
+    const char *kernel;                /* filename pointing to the kernel image */
+    const char *ramdisk;       /* an optional init ramdisk */
+    const char *root;          /* an optional root block device */
+    const char *extra;         /* optional kernel command line parameters */
+};
+
+/**
+ * virDomainKernelPtr:
+ *
+ * a virDomainKernelPtr is a pointer to a virDomainKernel structure.
+ */
+
+typedef virDomainKernel *virDomainKernelPtr;
+
 /**
  * virDomainCreateFlags:
  *
index 3dc9e0d2cf6a4df5b63ea02fa4db384054354a40..1c01e412085ed958ff1aaf4b8b264ba4ca963c17 100644 (file)
@@ -63,6 +63,30 @@ typedef enum {
      VIR_DOMAIN_SHUTOFF        = 5  /* the domain is shut off */
 } virDomainState;
 
+/**
+ * virDomainRestart:
+ *
+ * Flags that determine the action to take on a shutdown or crash of a domain
+ */
+typedef enum {
+     VIR_DOMAIN_DESTROY        = 1, /* destroy the domain */
+     VIR_DOMAIN_RESTART        = 2, /* restart the domain */
+     VIR_DOMAIN_PRESERVE= 3, /* keep as is, need manual destroy, for debug */
+     VIR_DOMAIN_RENAME_RESTART= 4/* restart under an new unique name */
+} virDomainRestart;
+
+/**
+ * virDeviceMode:
+ *
+ * Flags that determine permission to expose a device to the guest
+ */
+typedef enum {
+     VIR_DEVICE_DEFAULT        = 0, /* Default mode */
+     VIR_DEVICE_RO     = 1, /* Access read-only */
+     VIR_DEVICE_RW     = 2, /* Access read-write */
+     VIR_DEVICE_RW_FORCE= 3  /* Forced read-write even if already used */
+} virDeviceMode;
+
 /**
  * virDomainInfoPtr:
  *
@@ -92,12 +116,28 @@ struct _virDomainInfo {
 };
 
 /**
- * virDomainInfoPtr:
+ * virDomainKernel:
+ *
+ * a virDomainImage is the set of kernel related informations associated
+ * to a domain
+ */
+
+typedef struct _virDomainKernel virDomainKernel;
+
+struct _virDomainKernel {
+    const char *kernel;                /* filename pointing to the kernel image */
+    const char *ramdisk;       /* an optional init ramdisk */
+    const char *root;          /* an optional root block device */
+    const char *extra;         /* optional kernel command line parameters */
+};
+
+/**
+ * virDomainKernelPtr:
  *
- * a virDomainInfoPtr is a pointer to a virDomainInfo structure.
+ * a virDomainKernelPtr is a pointer to a virDomainKernel structure.
  */
 
-typedef virDomainInfo *virDomainInfoPtr;
+typedef virDomainKernel *virDomainKernelPtr;
 
 /**
  * virDomainCreateFlags:
index ef36ae63bb9bbe1b3098baa7efbbd0344caccafe..aed0f78456f76b85356b35a9cffbf9fb3fe9bf17 100644 (file)
@@ -5,6 +5,12 @@
 #ifndef __VIR_INTERNAL_H__
 #define __VIR_INTERNAL_H__
 
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+
 #include "hash.h"
 #include "libvir.h"
 
@@ -71,6 +77,14 @@ struct _virConnect {
     unsigned int magic;                /* specific value to check */
     int                 handle;        /* internal handle used for hypercall */
     struct xs_handle *xshandle;        /* handle to talk to the xenstore */
+
+    /* connection to xend */
+    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 */
+
     virHashTablePtr   domains; /* hash table for known domains */
     int          flags;                /* a set of connection flags */
 };
index 7957308643fdc41395e0e907d6b110b0467c8bb6..71b1a6901f18087a7e1244e6282e96fad170884a 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "libvir.h"
 #include "xen_internal.h"
+#include "xend_internal.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -101,6 +102,8 @@ virConnectOpen(const char *name) {
     ret->magic = VIR_CONNECT_MAGIC;
     ret->handle = handle;
     ret->xshandle = xshandle;
+    if (xend_setup(ret) < 0)
+        goto failed;
     ret->domains = virHashCreate(20);
     ret->flags = 0;
     if (ret->domains == NULL)
@@ -145,6 +148,8 @@ virConnectOpenReadOnly(const char *name) {
     ret->magic = VIR_CONNECT_MAGIC;
     ret->handle = -1;
     ret->xshandle = xshandle;
+    if (xend_setup(ret) < 0)
+        goto failed;
     ret->domains = virHashCreate(20);
     ret->flags = VIR_CONNECT_RO;
     if (ret->domains == NULL)
@@ -209,6 +214,7 @@ virDomainFreeName(virDomainPtr domain, const char *name ATTRIBUTE_UNUSED) {
  */
 int
 virConnectClose(virConnectPtr conn) {
+    xend_cleanup(conn);
     if (!VIR_IS_CONNECT(conn))
         return(-1);
     virHashFree(conn->domains, (virHashDeallocator) virDomainFreeName);
index 17bc17dd8e9ddcc8b6cedcbc635267ba282ba2a4..ba0c4b048d358a0d94c7c37bd1bf3f63c5fc0a9c 100644 (file)
@@ -27,6 +27,8 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 
+#include "libvir.h"
+#include "internal.h"
 #include "sexpr.h"
 #include "xend_internal.h"
 
@@ -72,7 +74,7 @@ struct xend {
  * Returns the socket file descriptor or -1 in case of error
  */
 static int
-do_connect(struct xend *xend)
+do_connect(virConnectPtr xend)
 {
     int s;
     int serrno;
@@ -285,7 +287,7 @@ xend_req(int fd, char *content, size_t n_content)
  * Returns the HTTP return code or -1 in case or error.
  */
 static int
-xend_get(struct xend *xend, const char *path,
+xend_get(virConnectPtr xend, const char *path,
          char *content, size_t n_content)
 {
     int ret;
@@ -323,7 +325,7 @@ xend_get(struct xend *xend, const char *path,
  * Returns the HTTP return code or -1 in case or error.
  */
 static int
-xend_post(struct xend *xend, const char *path, const char *ops,
+xend_post(virConnectPtr xend, const char *path, const char *ops,
           char *content, size_t n_content)
 {
     char buffer[100];
@@ -396,7 +398,7 @@ http2unix(int ret)
  * Returns 0 in case of success, -1 in case of failure.
  */
 static int
-xend_op_ext2(struct xend *xend, const char *path, char *error,
+xend_op_ext2(virConnectPtr xend, const char *path, char *error,
              size_t n_error, const char *key, va_list ap)
 {
     char ops[1024];
@@ -431,7 +433,7 @@ xend_op_ext2(struct xend *xend, const char *path, char *error,
  * Returns 0 in case of success, -1 in case of failure.
  */
 static int
-xend_node_op(struct xend *xend, const char *path, const char *key, ...)
+xend_node_op(virConnectPtr xend, const char *path, const char *key, ...)
 {
     va_list ap;
     int ret;
@@ -460,7 +462,7 @@ xend_node_op(struct xend *xend, const char *path, const char *key, ...)
  * Returns 0 in case of success, -1 in case of failure.
  */
 static int
-xend_op_ext(struct xend *xend, const char *name, char *error,
+xend_op_ext(virConnectPtr xend, const char *name, char *error,
             size_t n_error, const char *key, ...)
 {
     char buffer[1024];
@@ -489,7 +491,7 @@ xend_op_ext(struct xend *xend, const char *name, char *error,
  * Returns a parsed S-Expression in case of success, NULL in case of failure
  */
 static struct sexpr *
-sexpr_get(struct xend *xend, const char *fmt, ...)
+sexpr_get(virConnectPtr xend, const char *fmt, ...)
 {
     char buffer[4096];
     char path[1024];
@@ -672,20 +674,20 @@ sexpr_u64(struct sexpr *sexpr, const char *name)
  *
  * Returns the value found or 0 if not found (but may not be an error)
  */
-static enum xend_domain_restart
+static virDomainRestart
 sexpr_poweroff(struct sexpr *sexpr, const char *name)
 {
     const char *value = sexpr_node(sexpr, name);
 
     if (value) {
         if (strcmp(value, "poweroff") == 0) {
-            return XEND_DESTROY;
+            return VIR_DOMAIN_DESTROY;
         } else if (strcmp(value, "restart") == 0) {
-            return XEND_RESTART;
+            return VIR_DOMAIN_RESTART;
         } else if (strcmp(value, "preserve") == 0) {
-            return XEND_PRESERVE;
+            return VIR_DOMAIN_PRESERVE;
         } else if (strcmp(value, "rename-restart") == 0) {
-            return XEND_RENAME_RESTART;
+            return VIR_DOMAIN_RENAME_RESTART;
         }
     }
     return XEND_DEFAULT;
@@ -722,22 +724,22 @@ sexpr_strcpy(char **ptr, struct sexpr *node, const char *path)
  *
  * Returns the value found or 0 if not found (but may not be an error)
  */
-static enum xend_device_vbd_mode
+static virDeviceMode
 sexpr_mode(struct sexpr *node, const char *path)
 {
     const char *mode = sexpr_node(node, path);
-    enum xend_device_vbd_mode ret;
+    virDeviceMode ret;
 
     if (!mode) {
-        ret = XEND_DEFAULT;
+        ret = VIR_DEVICE_DEFAULT;
     } else if (strcmp(mode, "r") == 0) {
-        ret = XEND_READ_ONLY;
+        ret = VIR_DEVICE_RO;
     } else if (strcmp(mode, "w") == 0) {
-        ret = XEND_READ_WRITE;
+        ret = VIR_DEVICE_RW;
     } else if (strcmp(mode, "w!") == 0) {
-        ret = XEND_READ_WRITE_FORCE;
+        ret = VIR_DEVICE_RW_FORCE;
     } else {
-        ret = XEND_DEFAULT;
+        ret = VIR_DEVICE_DEFAULT;
     }
 
     return ret;
@@ -947,22 +949,22 @@ xend_device_vif_to_sexpr(const struct xend_device_vif *vif)
 /* PUBLIC FUNCTIONS */
 
 /**
- * xend_new_unix:
+ * xend_setup_unix:
+ * @conn: an existing virtual connection block
  * @path: the path for the Xen Daemon socket
  *
  * Creates a localhost Xen Daemon connection
  * Note: this doesn't try to check if the connection actually works
  *
- * Returns the new pointer or NULL in case of error.
+ * Returns 0 in case of success, -1 in case of error.
  */
-struct xend *
-xend_new_unix(const char *path)
+int
+xend_setup_unix(virConnectPtr xend, const char *path)
 {
-    struct xend *xend = malloc(sizeof(*xend));
     struct sockaddr_un *addr;
 
-    if (!xend)
-        return NULL;
+    if ((xend == NULL) || (path == NULL))
+        return(-1);
 
     addr = &xend->addr_un;
     addr->sun_family = AF_UNIX;
@@ -976,34 +978,34 @@ xend_new_unix(const char *path)
     xend->addr = (struct sockaddr *) addr;
     xend->type = PF_UNIX;
 
-    return xend;
+    return(0);
 }
 
 /**
- * xend_new_unix:
+ * xend_setup_tcp:
+ * @conn: an existing virtual connection block
  * @host: the host name for the Xen Daemon
  * @port: the port 
  *
  * Creates a possibly remote Xen Daemon connection
  * Note: this doesn't try to check if the connection actually works
  *
- * Returns the new pointer or NULL in case of error.
+ * Returns 0 in case of success, -1 in case of error.
  */
-struct xend *
-xend_new_tcp(const char *host, int port)
+int
+xend_setup_tcp(virConnectPtr xend, const char *host, int port)
 {
-    struct xend *xend = malloc(sizeof(*xend));
     struct in_addr ip;
     struct hostent *pent;
 
-    if (!xend)
-        return NULL;
+    if ((xend == NULL) || (host == NULL) || (port <= 0))
+        return(-1);
 
     pent = gethostbyname(host);
     if (pent == NULL) {
         if (inet_aton(host, &ip) == 0) {
             errno = ESRCH;
-            return NULL;
+            return(-1);
         }
     } else {
         memcpy(&ip, pent->h_addr_list[0], sizeof(ip));
@@ -1017,32 +1019,32 @@ xend_new_tcp(const char *host, int port)
     xend->addr_in.sin_port = htons(port);
     memcpy(&xend->addr_in.sin_addr, &ip, sizeof(ip));
 
-    return xend;
+    return(0);
 }
 
 /**
- * xend_new:
+ * xend_setup:
+ * @conn: an existing virtual connection block
  *
  * Creates a localhost Xen Daemon connection
  * Note: this doesn't try to check if the connection actually works
  *
- * Returns the new pointer or NULL in case of error.
+ * Returns 0 in case of success, -1 in case of error.
  */
-struct xend *
-xend_new(void)
+int
+xend_setup(virConnectPtr conn)
 {
-    return xend_new_unix("/var/lib/xend/xend-socket");
+    return(xend_setup_unix(conn, "/var/lib/xend/xend-socket"));
 }
 
 /**
- * xend_delete:
+ * xend_cleanup:
  *
- * Free a Xen Daemon connection
+ * Cleanup a xend connection
  */
 void
-xend_delete(struct xend *xend)
+xend_cleanup(virConnectPtr xend ATTRIBUTE_UNUSED)
 {
-    free(xend);
 }
 
 /**
@@ -1056,7 +1058,7 @@ xend_delete(struct xend *xend)
  * Returns 0 in case of success, -1 (with errno) in case of error.
  */
 int
-xend_wait_for_devices(struct xend *xend, const char *name)
+xend_wait_for_devices(virConnectPtr xend, const char *name)
 {
     return xend_op(xend, name, "op", "wait_for_devices", NULL);
 }
@@ -1072,7 +1074,7 @@ xend_wait_for_devices(struct xend *xend, const char *name)
  * Returns 0 in case of success, -1 (with errno) in case of error.
  */
 int
-xend_pause(struct xend *xend, const char *name)
+xend_pause(virConnectPtr xend, const char *name)
 {
     return xend_op(xend, name, "op", "pause", NULL);
 }
@@ -1087,7 +1089,7 @@ xend_pause(struct xend *xend, const char *name)
  * Returns 0 in case of success, -1 (with errno) in case of error.
  */
 int
-xend_unpause(struct xend *xend, const char *name)
+xend_unpause(virConnectPtr xend, const char *name)
 {
     return xend_op(xend, name, "op", "unpause", NULL);
 }
@@ -1103,7 +1105,7 @@ xend_unpause(struct xend *xend, const char *name)
  * Returns 0 in case of success, -1 (with errno) in case of error.
  */
 int
-xend_rename(struct xend *xend, const char *old, const char *new)
+xend_rename(virConnectPtr xend, const char *old, const char *new)
 {
     if ((xend == NULL) || (old == NULL) || (new == NULL))
         return(-1);
@@ -1120,7 +1122,7 @@ xend_rename(struct xend *xend, const char *old, const char *new)
  * Returns 0 in case of success, -1 (with errno) in case of error.
  */
 int
-xend_reboot(struct xend *xend, const char *name)
+xend_reboot(virConnectPtr xend, const char *name)
 {
     if ((xend == NULL) || (name == NULL))
         return(-1);
@@ -1138,7 +1140,7 @@ xend_reboot(struct xend *xend, const char *name)
  * Returns 0 in case of success, -1 (with errno) in case of error.
  */
 int
-xend_shutdown(struct xend *xend, const char *name)
+xend_shutdown(virConnectPtr xend, const char *name)
 {
     if ((xend == NULL) || (name == NULL))
         return(-1);
@@ -1157,7 +1159,7 @@ xend_shutdown(struct xend *xend, const char *name)
  * Returns 0 in case of success, -1 (with errno) in case of error.
  */
 int
-xend_sysrq(struct xend *xend, const char *name, const char *key)
+xend_sysrq(virConnectPtr xend, const char *name, const char *key)
 {
     if ((xend == NULL) || (name == NULL) || (key == NULL))
         return(-1);
@@ -1176,7 +1178,7 @@ xend_sysrq(struct xend *xend, const char *name, const char *key)
  * Returns 0 in case of success, -1 (with errno) in case of error.
  */
 int
-xend_destroy(struct xend *xend, const char *name)
+xend_destroy(virConnectPtr xend, const char *name)
 {
     if ((xend == NULL) || (name == NULL))
         return(-1);
@@ -1198,7 +1200,7 @@ xend_destroy(struct xend *xend, const char *name)
  * Returns 0 in case of success, -1 (with errno) in case of error.
  */
 int
-xend_save(struct xend *xend, const char *name, const char *filename)
+xend_save(virConnectPtr xend, const char *name, const char *filename)
 {
     if ((xend == NULL) || (filename == NULL))
         return(-1);
@@ -1217,7 +1219,7 @@ xend_save(struct xend *xend, const char *name, const char *filename)
  * Returns 0 in case of success, -1 (with errno) in case of error.
  */
 int
-xend_restore(struct xend *xend, const char *filename)
+xend_restore(virConnectPtr xend, const char *filename)
 {
     if ((xend == NULL) || (filename == NULL))
         return(-1);
@@ -1234,7 +1236,7 @@ xend_restore(struct xend *xend, const char *filename)
  * Returns a list of names or NULL in case of error.
  */
 char **
-xend_get_domains(struct xend *xend)
+xend_get_domains(virConnectPtr xend)
 {
     size_t extra = 0;
     struct sexpr *root = NULL;
@@ -1374,7 +1376,7 @@ xend_domain_to_sexpr(const struct xend_domain *domain)
  */
 
 int
-xend_create(struct xend *xend, const struct xend_domain *dom)
+xend_create(virConnectPtr xend, const struct xend_domain *dom)
 {
     int ret, serrno;
     struct sexpr *sexpr;
@@ -1409,7 +1411,7 @@ xend_create(struct xend *xend, const struct xend_domain *dom)
  * Returns 0 for success; -1 (with errno) on error
  */
 int
-xend_set_max_memory(struct xend *xend, const char *name, uint64_t value)
+xend_set_max_memory(virConnectPtr xend, const char *name, uint64_t value)
 {
     char buf[1024];
 
@@ -1435,7 +1437,7 @@ xend_set_max_memory(struct xend *xend, const char *name, uint64_t value)
  * Returns 0 for success; -1 (with errno) on error
  */
 int
-xend_set_memory(struct xend *xend, const char *name, uint64_t value)
+xend_set_memory(virConnectPtr xend, const char *name, uint64_t value)
 {
     char buf[1024];
 
@@ -1458,7 +1460,7 @@ xend_set_memory(struct xend *xend, const char *name, uint64_t value)
  * Returns 0 on success; -1 (with errno) on error
  */
 int
-xend_vbd_create(struct xend *xend,
+xend_vbd_create(virConnectPtr xend,
                 const char *name, const struct xend_device_vbd *vbd)
 {
     char buffer[4096];
@@ -1492,7 +1494,7 @@ xend_vbd_create(struct xend *xend,
  * Returns 0 on success; -1 (with errno) on error
  */
 int
-xend_vbd_destroy(struct xend *xend,
+xend_vbd_destroy(virConnectPtr xend,
                  const char *name, const struct xend_device_vbd *vbd)
 {
     return xend_op(xend, name, "op", "device_destroy", "type", "vbd",
@@ -1513,7 +1515,7 @@ xend_vbd_destroy(struct xend *xend,
  * Returns 0 on success; -1 (with errno) on error
  */
 int
-xend_vif_create(struct xend *xend,
+xend_vif_create(virConnectPtr xend,
                 const char *name, const struct xend_device_vif *vif)
 {
     char buffer[4096];
@@ -1534,8 +1536,8 @@ xend_vif_create(struct xend *xend,
 }
 
 static int
-get_vif_handle(struct xend *xend,
-               const char *name,
+get_vif_handle(virConnectPtr xend,
+               const char *name ATTRIBUTE_UNUSED,
                const struct xend_device_vif *vif,
                char *buffer, size_t n_buffer)
 {
@@ -1586,7 +1588,7 @@ get_vif_handle(struct xend *xend,
  * Returns 0 on success; -1 (with errno) on error
  */
 int
-xend_vif_destroy(struct xend *xend,
+xend_vif_destroy(virConnectPtr xend,
                  const char *name, const struct xend_device_vif *vif)
 {
     char handle[1024];
@@ -1785,7 +1787,7 @@ error:
  * Returns domain info on success; NULL (with errno) on error
  */
 struct xend_domain *
-xend_get_domain(struct xend *xend, const char *domname)
+xend_get_domain(virConnectPtr xend, const char *domname)
 {
     struct sexpr *root;
     struct xend_domain *dom = NULL;
@@ -1811,7 +1813,7 @@ xend_get_domain(struct xend *xend, const char *domname)
  * Returns node info on success; NULL (with errno) on error
  */
 struct xend_node *
-xend_get_node(struct xend *xend)
+xend_get_node(virConnectPtr xend)
 {
     struct sexpr *root;
     struct xend_node *node = NULL;
@@ -1896,7 +1898,7 @@ xend_get_node(struct xend *xend)
  * Returns 0 on success; -1 (with errno) on error
  */
 int
-xend_node_shutdown(struct xend *xend)
+xend_node_shutdown(virConnectPtr xend)
 {
     return xend_node_op(xend, "/xend/node/", "op", "shutdown", NULL);
 }
@@ -1910,7 +1912,7 @@ xend_node_shutdown(struct xend *xend)
  * Returns 0 on success; -1 (with errno) on error
  */
 int
-xend_node_restart(struct xend *xend)
+xend_node_restart(virConnectPtr xend)
 {
     return xend_node_op(xend, "/xend/node/", "op", "restart", NULL);
 }
@@ -1927,7 +1929,7 @@ xend_node_restart(struct xend *xend)
  * Returns 0 on success; -1 (with errno) on error
  */
 int
-xend_dmesg(struct xend *xend, char *buffer, size_t n_buffer)
+xend_dmesg(virConnectPtr xend, char *buffer, size_t n_buffer)
 {
     return http2unix(xend_get(xend, "/xend/node/dmesg", buffer, n_buffer));
 }
@@ -1942,7 +1944,7 @@ xend_dmesg(struct xend *xend, char *buffer, size_t n_buffer)
  * Returns 0 on success; -1 (with errno) on error
  */
 int
-xend_dmesg_clear(struct xend *xend)
+xend_dmesg_clear(virConnectPtr xend)
 {
     return xend_node_op(xend, "/xend/node/dmesg", "op", "clear", NULL);
 }
@@ -1959,7 +1961,7 @@ xend_dmesg_clear(struct xend *xend)
  * Returns 0 on success; -1 (with errno) on error
  */
 int
-xend_log(struct xend *xend, char *buffer, size_t n_buffer)
+xend_log(virConnectPtr xend, char *buffer, size_t n_buffer)
 {
     return http2unix(xend_get(xend, "/xend/node/log", buffer, n_buffer));
 }
index 97c41980f3e9968832bc2708ef1ef1611579759a..4d5b218f390a67db5eb12d5564e362292ecf31b4 100644 (file)
@@ -17,6 +17,8 @@
 #include <stdint.h>
 #include <stdbool.h>
 
+#include "libvir.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -26,60 +28,6 @@ extern "C" {
 */
 #define XEND_DEFAULT 0
 
-/**
-   Flags that determine the permission to expose a device to the guest as.
-*/
-enum xend_device_vbd_mode
-{
-       /**
-          Expose the device as read only.
-       */
-       XEND_READ_ONLY = 1,
-
-       /**
-          Expose the device as read/write with an in-use check.
-
-          If Xend thinks the device is already in use, it will generate an
-          error.  It uses heuristics so it will not always catch every
-          instance of this and will sometimes generate false positives.
-       */
-       XEND_READ_WRITE,
-
-       /**
-          Expose the device as read/only without an in-use check.
-       */
-       XEND_READ_WRITE_FORCE,
-};
-
-/**
-   Flags that determine the action to take on a shutdown or crash.
-*/
-enum xend_domain_restart
-{
-       /**
-          Destroy the domain.
-       */
-       XEND_DESTROY = 1,
-
-       /**
-          Restart the domain.
-       */
-       XEND_RESTART,
-
-       /**
-          Take no action.  The domain will have to be manually destroyed by
-          the user.  Useful for debugging.
-       */
-       XEND_PRESERVE,
-
-       /**
-          Rename the domain to something unique and then create a new instance
-          of the domain.  Useful for debugging crashes while avoiding
-          down time.
-       */
-       XEND_RENAME_RESTART,
-};
-
 /**
    Xend context.
 
@@ -87,40 +35,6 @@ enum xend_domain_restart
 */
 struct xend;
 
-/**
-   This structure the image information for a guest.
-*/
-struct xend_image
-{
-       /**
-          A filename pointing to a paravirtual Xen kernel.
-
-          Required.
-       */
-       const char *kernel;
-
-       /**
-          A filename pointing to an initrd.
-
-          Optional
-       */
-       const char *ramdisk;
-
-       /**
-          The root block device.
-
-          Optional
-       */
-       const char *root;
-
-       /**
-          The kernel command line.
-
-          Optional.
-       */
-       const char *extra;
-};
-
 /**
    This structure represents a virtual block device.
 */
@@ -153,7 +67,7 @@ struct xend_device_vbd
 
           Required.
        */
-       enum xend_device_vbd_mode mode;
+       virDeviceMode mode;
 };
 
 /**
@@ -345,21 +259,21 @@ struct xend_domain
 
           Optional.
        */
-       enum xend_domain_restart on_poweroff;
+       virDomainRestart on_poweroff;
 
        /**
           The action to perform when the domain reboots.
 
           Optional.
        */
-       enum xend_domain_restart on_reboot;
+       virDomainRestart on_reboot;
 
        /**
           The action to perform when the domain crashes.
 
           Optional.
        */
-       enum xend_domain_restart on_crash;
+       virDomainRestart on_crash;
 
        /**
           The number of VCPUs to assign to the domain.
@@ -370,7 +284,7 @@ struct xend_domain
 
        /* FIXME cpus */
 
-       struct xend_image image;
+       virDomainKernel image;
 
        /**
           The number of VBDs pointed to be vbds.
@@ -533,53 +447,55 @@ struct xend_node
 };
 
 /**
- * \brief Allocate a new Xend instance
- * \return A new xend instance
+ * \brief Setup the connection to the local Xend instance
+ * \return 0 in case of success, -1 in case of error
  *
  * This method creates a new Xend instance preferrably trying
  * to connect with the domain socket but if necessary using
  * TCP (only on localhost though).
  *
  * This function may not fail if Xend is not running.
+ *
+ * Make sure to call xend_cleanup().
  */
-struct xend *xend_new(void);
+int xend_setup(virConnectPtr conn);
 
 /**
- * \brief Creates a new xend instance via TCP
+ * \brief Setup the connection to a xend instance via TCP
  * \param host The host name to connect to
  * \param port The port number to connect to
- * \return A new xend instance
+ * \return 0 in case of success, -1 in case of error
  * 
  * This method creates a new Xend instance via TCP.
  *
  * This function may not fail if Xend is not running.
  *
- * Make sure to call xen_delete().
+ * Make sure to call xend_cleanup().
  */
-struct xend *xend_new_tcp(const char *host, int port);
+int xend_setup_tcp(virConnectPtr xend, const char *host, int port);
 
 /**
- * \brief Creates a new xend instance via a Unix domain socket
+ * \brief Setup the connection to xend instance via a Unix domain socket
  * \param path The path to the domain socket
- * \return A new xend instance
+ * \return 0 in case of success, -1 in case of error
  * 
  * This method creates a new xend instance via a Unix domain socket.
  *
  * This function may not fail if Xend is not running.
  *
- * Make sure to call xen_delete().
+ * Make sure to call xend_cleanup().
  */
-struct xend *xend_new_unix(const char *path);
+int xend_setup_unix(virConnectPtr xend, const char *path);
 
 /**
  * \brief Delete a previously allocated Xend instance
  * \param xend The xend instance
  *
- * This method should be called when a xend instance
- * allocated with xend_new[_{tcp, unix}] is no longer needed
+ * This method should be called when a connection to xend instance
+ * initialized with xend_setup[_{tcp, unix}] is no longer needed
  * to free the associated resources.
  */
-void xend_delete(struct xend *xend);
+void xend_cleanup(virConnectPtr xend);
 
 /**
  * \brief Blocks until a domain's devices are initialized
@@ -593,7 +509,7 @@ void xend_delete(struct xend *xend);
  * invalid filename, the error won't occur until after this function
  * returns.
  */
-int xend_wait_for_devices(struct xend *xend, const char *name);
+int xend_wait_for_devices(virConnectPtr xend, const char *name);
 
 /**
  * \brief Pause a domain
@@ -604,7 +520,7 @@ int xend_wait_for_devices(struct xend *xend, const char *name);
  * This method will make sure that Xen does not schedule the domain
  * anymore until after xend_unpause() has been called.
  */
-int xend_pause(struct xend *xend, const char *name);
+int xend_pause(virConnectPtr xend, const char *name);
 
 /**
  * \brief Unpause a domain
@@ -615,7 +531,7 @@ int xend_pause(struct xend *xend, const char *name);
  * This method will allow a paused domain (the result of xen_pause())
  * to be scheduled in the future.
  */
-int xend_unpause(struct xend *xend, const char *name);
+int xend_unpause(virConnectPtr xend, const char *name);
 
 /**
  * \brief Unpause a domain
@@ -626,7 +542,7 @@ int xend_unpause(struct xend *xend, const char *name);
  * 
  * This method allows a domain to have its name changed after creation.
  */
-int xend_rename(struct xend *xend, const char *oldname, const char *name);
+int xend_rename(virConnectPtr xend, const char *oldname, const char *name);
 
 /**
  * \brief Sends a SYSRQ to a domain
@@ -637,7 +553,7 @@ int xend_rename(struct xend *xend, const char *oldname, const char *name);
  * 
  * This method simulates the pressing of a SYSRQ sequence.
  */
-int xend_sysrq(struct xend *xend, const char *name, const char *key);
+int xend_sysrq(virConnectPtr xend, const char *name, const char *key);
 
 /**
  * \brief Request a domain to reboot
@@ -649,7 +565,7 @@ int xend_sysrq(struct xend *xend, const char *name, const char *key);
  * a request and the domain may ignore it.  It will return immediately
  * after queuing the request.
  */
-int xend_reboot(struct xend *xend, const char *name);
+int xend_reboot(virConnectPtr xend, const char *name);
 
 /**
  * \brief Request a domain to shutdown
@@ -661,7 +577,7 @@ int xend_reboot(struct xend *xend, const char *name);
  * a request and the domain may ignore it.  It will return immediately
  * after queuing the request.
  */
-int xend_shutdown(struct xend *xend, const char *name);
+int xend_shutdown(virConnectPtr xend, const char *name);
 
 /**
  * \brief Destroy a domain
@@ -675,7 +591,7 @@ int xend_shutdown(struct xend *xend, const char *name);
  * dying and will go away completely once all of the resources have been
  * unmapped (usually from the backend devices).
  */
-int xend_destroy(struct xend *xend, const char *name);
+int xend_destroy(virConnectPtr xend, const char *name);
 
 /**
  * \brief Save a domain to the disk
@@ -688,7 +604,7 @@ int xend_destroy(struct xend *xend, const char *name);
  * a file on disk.  Use xend_restore() to restore a domain after
  * saving.
  */
-int xend_save(struct xend *xend, const char *name, const char *filename);
+int xend_save(virConnectPtr xend, const char *name, const char *filename);
 
 /**
  * \brief Restore a domain from the disk
@@ -698,7 +614,7 @@ int xend_save(struct xend *xend, const char *name, const char *filename);
  * 
  * This method will restore a domain saved to disk by xend_save().
  */
-int xend_restore(struct xend *xend, const char *filename);
+int xend_restore(virConnectPtr xend, const char *filename);
 
 /**
  * \brief Obtain a list of currently running domains
@@ -708,7 +624,7 @@ int xend_restore(struct xend *xend, const char *filename);
  * This method will return an array of names of currently running
  * domains.  The memory should be released will a call to free().
  */
-char **xend_get_domains(struct xend *xend);
+char **xend_get_domains(virConnectPtr xend);
 
 /**
  * \brief Create a new domain
@@ -720,7 +636,7 @@ char **xend_get_domains(struct xend *xend);
  * domain will be paused after creation and must be unpaused with
  * xend_unpause() to begin execution.
  */
-int xend_create(struct xend *xend, const struct xend_domain *info);
+int xend_create(virConnectPtr xend, const struct xend_domain *info);
 
 /**
  * \brief Set the maximum memory for a domain
@@ -734,7 +650,7 @@ int xend_create(struct xend *xend, const struct xend_domain *info);
  * on its own (although under normal circumstances, memory allocation for a
  * domain is only done through xend_set_memory()).
  */
-int xend_set_max_memory(struct xend *xend, const char *name, uint64_t value);
+int xend_set_max_memory(virConnectPtr xend, const char *name, uint64_t value);
 
 /**
  * \brief Set the memory allocation for a domain
@@ -752,7 +668,7 @@ int xend_set_max_memory(struct xend *xend, const char *name, uint64_t value);
  * There is no safe guard for allocations that are too small so be careful
  * when using this function to reduce a domain's memory usage.
  */
-int xend_set_memory(struct xend *xend, const char *name, uint64_t value);
+int xend_set_memory(virConnectPtr xend, const char *name, uint64_t value);
 
 /**
  * \brief Create a virtual block device
@@ -766,7 +682,7 @@ int xend_set_memory(struct xend *xend, const char *name, uint64_t value);
  * rather, one should use xend_wait_for_devices() to block until the device
  * has been successfully attached.
  */
-int xend_vbd_create(struct xend *xend,
+int xend_vbd_create(virConnectPtr xend,
                    const char *name,
                    const struct xend_device_vbd *vbd);
 
@@ -782,7 +698,7 @@ int xend_vbd_create(struct xend *xend,
  * should use xend_wait_for_devices() to block until the device has been
  * successfully detached.
  */
-int xend_vbd_destroy(struct xend *xend,
+int xend_vbd_destroy(virConnectPtr xend,
                     const char *name,
                     const struct xend_device_vbd *vbd);
 
@@ -798,7 +714,7 @@ int xend_vbd_destroy(struct xend *xend,
  * rather, one should use xend_wait_for_devices() to network until the device
  * has been successfully attached.
  */
-int xend_vif_create(struct xend *xend,
+int xend_vif_create(virConnectPtr xend,
                    const char *name,
                    const struct xend_device_vif *vif);
 
@@ -814,7 +730,7 @@ int xend_vif_create(struct xend *xend,
  * rather, one should use xend_wait_for_devices() to network until the device
  * has been successfully detached.
  */
-int xend_vif_destroy(struct xend *xend,
+int xend_vif_destroy(virConnectPtr xend,
                     const char *name,
                     const struct xend_device_vif *vif);
 
@@ -828,7 +744,7 @@ int xend_vif_destroy(struct xend *xend,
  * it in the form of a struct xend_domain.  This should be
  * free()'d when no longer needed.
  */
-struct xend_domain *xend_get_domain(struct xend *xend,
+struct xend_domain *xend_get_domain(virConnectPtr xend,
                                    const char *name);
 
 /**
@@ -839,7 +755,7 @@ struct xend_domain *xend_get_domain(struct xend *xend,
  * This method returns information about the physical host
  * machine running Xen.
  */
-struct xend_node *xend_get_node(struct xend *xend);
+struct xend_node *xend_get_node(virConnectPtr xend);
 
 /**
  * \brief Shutdown physical host machine
@@ -848,7 +764,7 @@ struct xend_node *xend_get_node(struct xend *xend);
  *
  * This method shuts down the physical machine running Xen.
  */
-int xend_node_shutdown(struct xend *xend);
+int xend_node_shutdown(virConnectPtr xend);
 
 /**
  * \brief Restarts physical host machine
@@ -857,7 +773,7 @@ int xend_node_shutdown(struct xend *xend);
  *
  * This method restarts the physical machine running Xen.
  */
-int xend_node_restart(struct xend *xend);
+int xend_node_restart(virConnectPtr xend);
 
 /**
  * \brief Return hypervisor debugging messages
@@ -869,7 +785,7 @@ int xend_node_restart(struct xend *xend);
  * This function will place the debugging messages from the
  * hypervisor into a buffer with a null terminator.
  */
-int xend_dmesg(struct xend *xend,
+int xend_dmesg(virConnectPtr xend,
               char *buffer,
               size_t n_buffer);
 
@@ -881,7 +797,7 @@ int xend_dmesg(struct xend *xend,
  * This function will clear the debugging message ring queue
  * in the hypervisor.
  */
-int xend_dmesg_clear(struct xend *xend);
+int xend_dmesg_clear(virConnectPtr xend);
 
 /**
  * \brief Obtain the Xend log messages
@@ -893,7 +809,7 @@ int xend_dmesg_clear(struct xend *xend);
  * This function will place the Xend debugging messages into
  * a buffer with a null terminator.
  */
-int xend_log(struct xend *xend,
+int xend_log(virConnectPtr xend,
             char *buffer,
             size_t n_buffer);