mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
* configure.in: activate pedantic flags
* src/libvir.c src/libvir_sym.version src/xen_internal.[ch] include/libvir.h: implementing hypervisor Version and Type interfaces * src/virsh.c: adding a version command, WIP Daniel
This commit is contained in:
parent
0d8043574d
commit
96a54b42a6
@ -1,4 +1,12 @@
|
|||||||
|
Thu Dec 8 14:25:09 CET 2005 Daniel Veillard <veillard@redhat.com>
|
||||||
|
|
||||||
|
* configure.in: activate pedantic flags
|
||||||
|
* src/libvir.c src/libvir_sym.version src/xen_internal.[ch]
|
||||||
|
include/libvir.h: implementing hypervisor Version and Type interfaces
|
||||||
|
* src/virsh.c: adding a version command, WIP
|
||||||
|
|
||||||
Thu Dec 8 11:19:48 CET 2005 Karel Zak <kzak@redhat.com>
|
Thu Dec 8 11:19:48 CET 2005 Karel Zak <kzak@redhat.com>
|
||||||
|
|
||||||
* src/Makefile.am src/virsh.c configure.in: adding readline support,
|
* src/Makefile.am src/virsh.c configure.in: adding readline support,
|
||||||
and implement basic commands to virsh.
|
and implement basic commands to virsh.
|
||||||
|
|
||||||
|
10
configure.in
10
configure.in
@ -65,15 +65,19 @@ dnl
|
|||||||
dnl specific tests to setup DV devel environments with debug etc ...
|
dnl specific tests to setup DV devel environments with debug etc ...
|
||||||
dnl
|
dnl
|
||||||
if [[ "${LOGNAME}" = "veillard" -a "`pwd`" = "/u/veillard/libvir" ]] ; then
|
if [[ "${LOGNAME}" = "veillard" -a "`pwd`" = "/u/veillard/libvir" ]] ; then
|
||||||
if test "${GCC}" = "yes" ; then
|
|
||||||
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"
|
STATIC_BINARIES="-static"
|
||||||
else
|
else
|
||||||
STATIC_BINARIES=
|
STATIC_BINARIES=
|
||||||
fi
|
fi
|
||||||
AC_SUBST(STATIC_BINARIES)
|
AC_SUBST(STATIC_BINARIES)
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl make CFLAGS very pedantic at least during the devel phase for everybody
|
||||||
|
dnl
|
||||||
|
if test "${GCC}" = "yes" ; then
|
||||||
|
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
|
||||||
|
|
||||||
dnl search for the low level Xen library
|
dnl search for the low level Xen library
|
||||||
AC_SEARCH_LIBS(xs_read, [xenstore], [], [AC_MSG_ERROR([Xen store library not found])])
|
AC_SEARCH_LIBS(xs_read, [xenstore], [], [AC_MSG_ERROR([Xen store library not found])])
|
||||||
|
|
||||||
|
@ -115,6 +115,7 @@ typedef enum {
|
|||||||
virConnectPtr virConnectOpen (const char *name);
|
virConnectPtr virConnectOpen (const char *name);
|
||||||
virConnectPtr virConnectOpenReadOnly (const char *name);
|
virConnectPtr virConnectOpenReadOnly (const char *name);
|
||||||
int virConnectClose (virConnectPtr conn);
|
int virConnectClose (virConnectPtr conn);
|
||||||
|
const char * virConnectGetType (virConnectPtr conn);
|
||||||
unsigned long virConnectGetVersion (virConnectPtr conn);
|
unsigned long virConnectGetVersion (virConnectPtr conn);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
35
src/libvir.c
35
src/libvir.c
@ -193,20 +193,47 @@ virConnectClose(virConnectPtr conn) {
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virConnectGetType:
|
||||||
|
* @conn: pointer to the hypervisor connection
|
||||||
|
*
|
||||||
|
* Get the name of the Hypervisor software used.
|
||||||
|
*
|
||||||
|
* Returns NULL in case of error, a static zero terminated string otherwise.
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
virConnectGetType(virConnectPtr conn) {
|
||||||
|
if (conn == NULL)
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
|
return("Xen");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virConnectGetVersion:
|
* virConnectGetVersion:
|
||||||
* @conn: pointer to the hypervisor connection
|
* @conn: pointer to the hypervisor connection
|
||||||
*
|
*
|
||||||
* Get the version level of the Hypervisor running.
|
* Get the version level of the Hypervisor running. This may work only with
|
||||||
|
* hypervisor call, i.e. with priviledged access to the hypervisor, not
|
||||||
|
* with a Read-Only connection.
|
||||||
*
|
*
|
||||||
* Returns -1 in case of error or major * 10,000 + minor * 100 + rev otherwise
|
* Returns -1 in case of error, 0 if the version can't be extracted by lack
|
||||||
|
* of capacities otherwise major * 1,000,000 + minor * 1,000 + release
|
||||||
*/
|
*/
|
||||||
unsigned long
|
unsigned long
|
||||||
virConnectGetVersion(virConnectPtr conn) {
|
virConnectGetVersion(virConnectPtr conn) {
|
||||||
|
unsigned long ver, ret;
|
||||||
|
|
||||||
if (conn == NULL)
|
if (conn == NULL)
|
||||||
return(-1);
|
return(-1);
|
||||||
TODO
|
|
||||||
return(-1);
|
/* this can't be extracted from the Xenstore */
|
||||||
|
if (conn->handle < 0)
|
||||||
|
return(0);
|
||||||
|
|
||||||
|
ver = xenHypervisorGetVersion(conn->handle);
|
||||||
|
ret = (ver >> 16) * 1000000 + (ver & 0xFFFF) * 1000;
|
||||||
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
virDomainGetInfo;
|
virDomainGetInfo;
|
||||||
virDomainGetMaxMemory;
|
virDomainGetMaxMemory;
|
||||||
virDomainGetName;
|
virDomainGetName;
|
||||||
|
virConnectGetType;
|
||||||
virDomainLookupByID;
|
virDomainLookupByID;
|
||||||
virDomainLookupByName;
|
virDomainLookupByName;
|
||||||
virDomainResume;
|
virDomainResume;
|
||||||
|
51
src/virsh.c
51
src/virsh.c
@ -191,6 +191,7 @@ static vshCmdInfo info_help[] = {
|
|||||||
{ "syntax", "help [<command>]" },
|
{ "syntax", "help [<command>]" },
|
||||||
{ "help", "print help" },
|
{ "help", "print help" },
|
||||||
{ "desc", "Prints global help or command specific help." },
|
{ "desc", "Prints global help or command specific help." },
|
||||||
|
{ "version", "Prints versionning informations." },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -490,6 +491,55 @@ cmdIdof(vshControl *ctl, vshCmd *cmd) {
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "version" command
|
||||||
|
*/
|
||||||
|
static vshCmdInfo info_version[] = {
|
||||||
|
{ "syntax", "version" },
|
||||||
|
{ "help", "show versions" },
|
||||||
|
{ "desc", "Display the version informations available" },
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
cmdVersion(vshControl *ctl, vshCmd *cmd) {
|
||||||
|
unsigned long hvVersion;
|
||||||
|
const char *hvType;
|
||||||
|
|
||||||
|
if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
hvType = virConnectGetType(ctl->conn);
|
||||||
|
if (hvType == NULL) {
|
||||||
|
vshError(ctl, FALSE, "Failed to get hypervisor type\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
hvVersion = virConnectGetVersion(ctl->conn);
|
||||||
|
if (hvVersion < 0) {
|
||||||
|
vshError(ctl, FALSE, "failed get hypervisor version");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (hvVersion == 0) {
|
||||||
|
vshPrint(ctl, VSH_MESG,
|
||||||
|
"Cannot extract running %s hypervisor version\n",
|
||||||
|
hvType);
|
||||||
|
} else {
|
||||||
|
unsigned int major = hvVersion / 1000000;
|
||||||
|
unsigned int minor;
|
||||||
|
unsigned int rel;
|
||||||
|
|
||||||
|
hvVersion %= 1000000;
|
||||||
|
minor = hvVersion / 1000000;
|
||||||
|
rel = hvVersion % 1000000;
|
||||||
|
|
||||||
|
vshPrint(ctl, VSH_MESG, "Running hypervisor: %s %d.%d.%d\n", hvType,
|
||||||
|
major, minor, rel);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "quit" command
|
* "quit" command
|
||||||
*/
|
*/
|
||||||
@ -516,6 +566,7 @@ static vshCmdDef commands[] = {
|
|||||||
{ "idof", cmdIdof, opts_idof, info_idof },
|
{ "idof", cmdIdof, opts_idof, info_idof },
|
||||||
{ "list", cmdList, NULL, info_list },
|
{ "list", cmdList, NULL, info_list },
|
||||||
{ "nameof", cmdNameof, opts_nameof, info_nameof },
|
{ "nameof", cmdNameof, opts_nameof, info_nameof },
|
||||||
|
{ "version", cmdVersion, NULL, info_version },
|
||||||
{ "quit", cmdQuit, NULL, info_quit },
|
{ "quit", cmdQuit, NULL, info_quit },
|
||||||
{ NULL, NULL, NULL, NULL }
|
{ NULL, NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
#include <xen/dom0_ops.h>
|
#include <xen/dom0_ops.h>
|
||||||
|
#include <xen/version.h>
|
||||||
#include <xen/xen.h>
|
#include <xen/xen.h>
|
||||||
|
|
||||||
#ifndef __LINUX_PUBLIC_PRIVCMD_H__
|
#ifndef __LINUX_PUBLIC_PRIVCMD_H__
|
||||||
@ -106,6 +107,36 @@ xenHypervisorDoOp(int handle, dom0_op_t *op) {
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xenHypervisorGetVersion:
|
||||||
|
* @handle: the handle to the Xen hypervisor
|
||||||
|
*
|
||||||
|
* Call the hypervisor to extracts his own internal API version
|
||||||
|
*
|
||||||
|
* Returns the hypervisor running version or 0 in case of error.
|
||||||
|
*/
|
||||||
|
unsigned long
|
||||||
|
xenHypervisorGetVersion(int handle) {
|
||||||
|
int ret;
|
||||||
|
unsigned int cmd;
|
||||||
|
hypercall_t hc;
|
||||||
|
|
||||||
|
hc.op = __HYPERVISOR_xen_version;
|
||||||
|
hc.arg[0] = (unsigned long) XENVER_version;
|
||||||
|
hc.arg[1] = 0;
|
||||||
|
|
||||||
|
cmd = _IOC(_IOC_NONE, 'P', 0, sizeof(hc));
|
||||||
|
ret = ioctl(handle, cmd, (unsigned long) &hc);
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
return(0);
|
||||||
|
/*
|
||||||
|
* use unsigned long in case the version grows behind expectations
|
||||||
|
* allowed by int
|
||||||
|
*/
|
||||||
|
return((unsigned long) ret);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xenHypervisorGetDomainInfo:
|
* xenHypervisorGetDomainInfo:
|
||||||
* @handle: the handle to the Xen hypervisor
|
* @handle: the handle to the Xen hypervisor
|
||||||
|
@ -11,7 +11,9 @@
|
|||||||
#ifndef __VIR_XEN_INTERNAL_H__
|
#ifndef __VIR_XEN_INTERNAL_H__
|
||||||
#define __VIR_XEN_INTERNAL_H__
|
#define __VIR_XEN_INTERNAL_H__
|
||||||
|
|
||||||
|
/* required for uint8_t, uint32_t, etc ... */
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
/* required for dom0_getdomaininfo_t */
|
||||||
#include <xen/dom0_ops.h>
|
#include <xen/dom0_ops.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -20,6 +22,7 @@ extern "C" {
|
|||||||
|
|
||||||
int xenHypervisorOpen (void);
|
int xenHypervisorOpen (void);
|
||||||
int xenHypervisorClose (int handle);
|
int xenHypervisorClose (int handle);
|
||||||
|
unsigned long xenHypervisorGetVersion (int handle);
|
||||||
int xenHypervisorGetDomainInfo (int handle,
|
int xenHypervisorGetDomainInfo (int handle,
|
||||||
int domain,
|
int domain,
|
||||||
dom0_getdomaininfo_t *info);
|
dom0_getdomaininfo_t *info);
|
||||||
|
Loading…
Reference in New Issue
Block a user