From 7c82cb733fa259c07089e2330e692b9ebb0b1e1d Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Wed, 7 Dec 2005 18:10:51 +0000 Subject: [PATCH] * configure.in src/Makefile.am src/libvir.c src/xen_internal.c src/xen_internal.h: removed dependancy on xenctrl library, untested yet. Daniel --- ChangeLog | 6 ++ configure.in | 3 +- src/Makefile.am | 5 +- src/libvir.c | 25 +++----- src/xen_internal.c | 145 +++++++++++++++++++++++++++++++++++++++++++++ src/xen_internal.h | 30 ++++++++++ 6 files changed, 194 insertions(+), 20 deletions(-) create mode 100644 src/xen_internal.c create mode 100644 src/xen_internal.h diff --git a/ChangeLog b/ChangeLog index a5df27b1a4..072344ddfc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Dec 7 19:09:48 CET 2005 Daniel Veillard + + * 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 * docs/*: adding missing links to API page. diff --git a/configure.in b/configure.in index 30b12c0b76..2751a725c1 100644 --- a/configure.in +++ b/configure.in @@ -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) diff --git a/src/Makefile.am b/src/Makefile.am index ae7f299bec..d70d6e4fb8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 diff --git a/src/libvir.c b/src/libvir.c index bd578dc4be..0fef72975b 100644 --- a/src/libvir.c +++ b/src/libvir.c @@ -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. @@ -10,11 +10,11 @@ */ #include "libvir.h" +#include "xen_internal.h" #include #include #include -#include #include #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 index 0000000000..dc79a51832 --- /dev/null +++ b/src/xen_internal.c @@ -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 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#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 index 0000000000..f4bc39d215 --- /dev/null +++ b/src/xen_internal.h @@ -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 + */ + +#ifndef __VIR_XEN_INTERNAL_H__ +#define __VIR_XEN_INTERNAL_H__ + +#include +#include + +#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__ */ -- GitLab