+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.
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
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)
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
/*
- * 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"
if (name != NULL)
return(NULL);
- handle = xc_interface_open();
+ handle = xenHypervisorOpen();
if (handle == -1)
goto failed;
xshandle = xs_daemon_open();
return(ret);
failed:
if (handle >= 0)
- xc_interface_close(handle);
+ xenHypervisorClose(handle);
if (xshandle != NULL)
xs_daemon_close(xshandle);
if (ret != NULL)
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);
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);
}
} 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) {
--- /dev/null
+/*
+ * 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);
+}
+
--- /dev/null
+/*
+ * 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__ */