]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
* configure.in src/Makefile.am src/libvir.c src/xen_internal.c
authorDaniel Veillard <veillard@redhat.com>
Wed, 7 Dec 2005 18:10:51 +0000 (18:10 +0000)
committerDaniel Veillard <veillard@redhat.com>
Wed, 7 Dec 2005 18:10:51 +0000 (18:10 +0000)
  src/xen_internal.h: removed dependancy on xenctrl library, untested
  yet.
Daniel

ChangeLog
configure.in
src/Makefile.am
src/libvir.c
src/xen_internal.c [new file with mode: 0644]
src/xen_internal.h [new file with mode: 0644]

index a5df27b1a4b9c60500f4d42941393a76b98f1287..072344ddfcd0b2539e76dc5cb1a45ee04eb5313c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Dec  7 19:09:48 CET 2005 Daniel Veillard <veillard@redhat.com>
+
+       * configure.in src/Makefile.am src/libvir.c src/xen_internal.c
+         src/xen_internal.h: removed dependancy on xenctrl library, untested
+         yet.
+
 Wed Dec  7 15:08:54 CET 2005 Daniel Veillard <veillard@redhat.com>
 
        * docs/*: adding missing links to API page.
index 30b12c0b76528cadf58b5d81f4a35c0f823be9f3..2751a725c1e77884cf8ec4153c6be49a66e13506 100644 (file)
@@ -66,7 +66,7 @@ dnl specific tests to setup DV devel environments with debug etc ...
 dnl
 if [[ "${LOGNAME}" = "veillard" -a "`pwd`" = "/u/veillard/libvir" ]] ; then
     if test "${GCC}" = "yes" ; then
-       CFLAGS="-g -O -pedantic -W -Wformat -Wunused -Wimplicit -Wreturn-type -Wswitch -Wcomment -Wtrigraphs -Wformat -Wchar-subscripts -Wuninitialized -Wparentheses -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wredundant-decls -Wall"
+       CFLAGS="-g -O -W -Wformat -Wunused -Wimplicit -Wreturn-type -Wswitch -Wcomment -Wtrigraphs -Wformat -Wchar-subscripts -Wuninitialized -Wparentheses -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wredundant-decls -Wall"
     fi
     STATIC_BINARIES="-static"
 else
@@ -75,7 +75,6 @@ fi
 AC_SUBST(STATIC_BINARIES)
 
 dnl search for the low level Xen library
-AC_SEARCH_LIBS(xc_domain_create, [xenctrl], [], [AC_MSG_ERROR([Xen control library not found])])
 AC_SEARCH_LIBS(xs_read, [xenstore], [], [AC_MSG_ERROR([Xen store library not found])])
 
 AC_OUTPUT(Makefile src/Makefile include/Makefile docs/Makefile libvir.pc libvir.spec)
index ae7f299bec557cbd1d19d52328d0b5dbc4398ea0..d70d6e4fb8fa538e60e9e0a92091cb25144b8d14 100644 (file)
@@ -10,7 +10,10 @@ lib_LTLIBRARIES = libvir.la
 libvir_la_LIBADD = 
 libvir_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libvir_sym.version \
                     -version-info @LIBXEN_VERSION_INFO@
-libvir_la_SOURCES = libvir.c internal.h hash.c hash.h
+libvir_la_SOURCES =                                            \
+               libvir.c internal.hi                            \
+               hash.c hash.h                                   \
+               xen_internal.c xen_internal.h
 
 noinst_PROGRAMS=virsh
 
index bd578dc4be51fbfdca6a09d78f7f1efa35766d9a..0fef72975b7c63cf2e4ddd6a50d97fc4af3b7e61 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * libvir.h: Main interfaces for the libvir library to handle virtualization
+ * libvir.c: Main interfaces for the libvir library to handle virtualization
  *           domains from a process running in domain 0
  *
  * Copyright (C) 2005 Red Hat, Inc.
  */
 
 #include "libvir.h"
+#include "xen_internal.h"
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <xenctrl.h>
 #include <xs.h>
 #include "internal.h"
 #include "hash.h"
@@ -82,7 +82,7 @@ virConnectOpen(const char *name) {
     if (name != NULL) 
         return(NULL);
 
-    handle = xc_interface_open();
+    handle = xenHypervisorOpen();
     if (handle == -1)
         goto failed;
     xshandle = xs_daemon_open();
@@ -103,7 +103,7 @@ virConnectOpen(const char *name) {
     return(ret);
 failed:
     if (handle >= 0)
-        xc_interface_close(handle);
+        xenHypervisorClose(handle);
     if (xshandle != NULL)
         xs_daemon_close(xshandle);
     if (ret != NULL)
@@ -187,7 +187,7 @@ virConnectClose(virConnectPtr conn) {
     xs_daemon_close(conn->xshandle);
     conn->xshandle = NULL;
     if (conn->handle != -1)
-       xc_interface_close(conn->handle);
+       xenHypervisorClose(conn->handle);
     conn->handle = -1;
     free(conn);
     return(0);
@@ -427,19 +427,10 @@ virDomainPtr
 virDomainLookupByID(virConnectPtr conn, int id) {
     char *path;
     virDomainPtr ret;
-    xc_dominfo_t info;
-    int res;
 
     if ((conn == NULL) || (conn->magic != VIR_CONNECT_MAGIC) || (id < 0))
         return(NULL);
 
-    if ((conn->flags & VIR_CONNECT_RO) == 0) {
-       res = xc_domain_getinfo(conn->handle, (uint32_t) id, 1, &info);
-       if (res != 1) {
-           return(NULL);
-       }
-    }
-    
     path = xs_get_domain_path(conn->xshandle, (unsigned int) id);
     if (path == NULL) {
         return(NULL);
@@ -640,11 +631,11 @@ virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) {
        }
 
     } else {
-        xc_domaininfo_t dominfo;
+        dom0_getdomaininfo_t dominfo;
 
        dominfo.domain = domain->handle;
-        ret = xc_domain_getinfolist(domain->conn->handle, domain->handle,
-                                   1, &dominfo);
+        ret = xenHypervisorGetDomainInfo(domain->conn->handle, domain->handle,
+                                        &dominfo);
         if (ret <= 0)
            return(-1);
        switch (dominfo.flags & 0xFF) {
diff --git a/src/xen_internal.c b/src/xen_internal.c
new file mode 100644 (file)
index 0000000..dc79a51
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * xen_internal.c: direct access to Xen hypervisor level
+ *
+ * Copyright (C) 2005 Red Hat, Inc.
+ *
+ * See COPYING.LIB for the License of this software
+ *
+ * Daniel Veillard <veillard@redhat.com>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/ioctl.h>
+
+#include <xen/dom0_ops.h>
+#include <xen/xen.h>
+
+#ifndef __LINUX_PUBLIC_PRIVCMD_H__
+typedef struct hypercall_struct
+{
+    unsigned long op;
+    unsigned long arg[5];
+} hypercall_t;
+#endif
+
+
+#include "internal.h"
+#include "xen_internal.h"
+
+#define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd"
+
+/**
+ * xenHypervisorOpen:
+ *
+ * Connects to the Xen hypervisor.
+ *
+ * Returns the handle or -1 in case of error.
+ */
+int xenHypervisorOpen(void) {
+    int ret;
+
+    ret = open(XEN_HYPERVISOR_SOCKET, O_RDWR);
+    if (ret < 0)
+        return(-1);
+
+    return(ret);
+}
+
+/**
+ * xenHypervisorClose:
+ * @handle: the handle to the Xen hypervisor
+ *
+ * Close the connection to the Xen hypervisor.
+ *
+ * Returns 0 in case of success or -1 in case of error.
+ */
+int xenHypervisorClose(int handle) {
+    int ret;
+
+    if (handle < 0)
+        return(-1);
+
+    ret = close(handle);
+    if (ret < 0)
+        return(-1);
+    return(0);
+}
+
+/**
+ * xenHypervisorDoOp:
+ * @handle: the handle to the Xen hypervisor
+ * @op: pointer to the hyperviros operation structure
+ *
+ * Do an hypervisor operation, this leads to an hypervisor call through ioctl.
+ *
+ * Returns 0 in case of success and -1 in case of error.
+ */
+static int
+xenHypervisorDoOp(int handle, dom0_op_t *op) {
+    int ret;
+    hypercall_t hc;
+
+    op->interface_version = DOM0_INTERFACE_VERSION;
+    hc.op = __HYPERVISOR_dom0_op;
+    hc.arg[0] = (unsigned long)op; 
+
+    if (mlock(op, sizeof(dom0_op_t)) < 0)
+        return(-1);
+
+    ret = ioctl(handle, _IOC(_IOC_NONE, 'P', 0, sizeof(hypercall_t)),
+                             (unsigned long) &hc);
+
+    if (munlock(op, sizeof(dom0_op_t)) < 0)
+        ret = -1;
+
+    if (ret < 0)
+        return(-1);
+        
+    return(0);
+}
+
+/**
+ * xenHypervisorGetDomainInfo:
+ * @handle: the handle to the Xen hypervisor
+ * @domain: the domain ID
+ * @info: the place where informations should be stored
+ *
+ * Do an hypervisor call to get the related set of domain informations.
+ *
+ * Returns 0 in case of success, -1 in case of error.
+ */
+int
+xenHypervisorGetDomainInfo(int handle, int domain, dom0_getdomaininfo_t *info) {
+    dom0_op_t op;
+    int ret;
+
+    if (info == NULL)
+        return(-1);
+
+    memset(info, 0, sizeof(dom0_getdomaininfo_t));
+
+    if (mlock(info, sizeof(dom0_getdomaininfo_t)) < 0)
+        return(-1);
+
+    op.cmd = DOM0_GETDOMAININFOLIST;
+    op.u.getdomaininfolist.first_domain = (domid_t) domain;
+    op.u.getdomaininfolist.max_domains = 1;
+    op.u.getdomaininfolist.buffer = info;
+
+    ret = xenHypervisorDoOp(handle, &op);
+
+    if (munlock(info, sizeof(dom0_getdomaininfo_t)) < 0)
+        ret = -1;
+
+    if (ret <= 0)
+        return(-1);
+    return(0);
+}
+
diff --git a/src/xen_internal.h b/src/xen_internal.h
new file mode 100644 (file)
index 0000000..f4bc39d
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * xen_internal.h: internal API for direct access to Xen hypervisor level
+ *
+ * Copyright (C) 2005 Red Hat, Inc.
+ *
+ * See COPYING.LIB for the License of this software
+ *
+ * Daniel Veillard <veillard@redhat.com>
+ */
+
+#ifndef __VIR_XEN_INTERNAL_H__
+#define __VIR_XEN_INTERNAL_H__
+
+#include <stdint.h>
+#include <xen/dom0_ops.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int            xenHypervisorOpen               (void);
+int            xenHypervisorClose              (int handle);
+int            xenHypervisorGetDomainInfo      (int handle,
+                                                int domain,
+                                                dom0_getdomaininfo_t *info);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __VIR_XEN_INTERNAL_H__ */