From 8354895e681e8aee9bfa0290cb98123858165b91 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones"
Date: Thu, 5 Jun 2008 13:17:45 +0000
Subject: [PATCH] virDomainBlockPeek call * configure.in: Document
AC_SYS_LARGEFILE. * docs/hvsupport.html.in: Document HV support for
virDomainBlockPeek. * include/libvirt/libvirt.h.in, src/driver.h,
src/libvirt.c, src/libvirt_sym.version: Add virDomainBlockPeek
infrastructure. * src/qemu_driver.c, src/test.c: Null versions of this
call. * src/xen_unified.c, src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h: Xen implementation. *
tests/sexpr2xmldata/sexpr2xml-curmem.xml,
tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml: XML output has been
reordered slightly in the Xen driver, but should be functionally the same.
---
ChangeLog | 15 +
configure.in | 6 +-
docs/hvsupport.html | 18 +-
docs/hvsupport.html.in | 18 +-
include/libvirt/libvirt.h | 305 +++++------
include/libvirt/libvirt.h.in | 305 +++++------
src/driver.h | 8 +
src/libvirt.c | 77 +++
src/libvirt_sym.version | 1 +
src/qemu_driver.c | 1 +
src/test.c | 1 +
src/xen_unified.c | 24 +
src/xend_internal.c | 483 ++++++++++++------
src/xend_internal.h | 2 +
src/xm_internal.c | 11 +
src/xm_internal.h | 1 +
tests/sexpr2xmldata/sexpr2xml-curmem.xml | 10 +-
.../sexpr2xml-no-source-cdrom.xml | 10 +-
18 files changed, 826 insertions(+), 470 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 3fd17126b2..c8d99975be 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+Thu Jun 5 14:10:00 BST 2008 Richard W.M. Jones
+
+ virDomainBlockPeek call
+ * configure.in: Document AC_SYS_LARGEFILE.
+ * docs/hvsupport.html.in: Document HV support for virDomainBlockPeek.
+ * include/libvirt/libvirt.h.in, src/driver.h, src/libvirt.c,
+ src/libvirt_sym.version: Add virDomainBlockPeek infrastructure.
+ * src/qemu_driver.c, src/test.c: Null versions of this call.
+ * src/xen_unified.c, src/xend_internal.c, src/xend_internal.h,
+ src/xm_internal.c, src/xm_internal.h: Xen implementation.
+ * tests/sexpr2xmldata/sexpr2xml-curmem.xml,
+ tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml: XML output
+ has been reordered slightly in the Xen driver, but should be
+ functionally the same.
+
Wed Jun 4 23:02:21 PST 2008 David L. Leskovec
* src/lxc_driver.c: Add sanity of tty pid before kill()
diff --git a/configure.in b/configure.in
index 6023355707..47633b0d8a 100644
--- a/configure.in
+++ b/configure.in
@@ -60,6 +60,10 @@ AM_PROG_CC_C_O
LIBVIRT_COMPILE_WARNINGS([maximum])
+dnl Support large files / 64 bit seek offsets.
+dnl Use --disable-largefile if you don't want this.
+AC_SYS_LARGEFILE
+
dnl Availability of various common functions (non-fatal if missing).
AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity])
@@ -982,8 +986,6 @@ AC_SUBST([CYGWIN_EXTRA_LIBADD])
AC_SUBST([CYGWIN_EXTRA_PYTHON_LIBADD])
AC_SUBST([MINGW_EXTRA_LDFLAGS])
-AC_SYS_LARGEFILE
-
# Set LV_LIBTOOL_OBJDIR to "." or $lt_cv_objdir, depending on whether
# we're building shared libraries. This is the name of the directory
# in which .o files will be created.
diff --git a/docs/hvsupport.html b/docs/hvsupport.html
index 5625f35293..11611db9a5 100644
--- a/docs/hvsupport.html
+++ b/docs/hvsupport.html
@@ -137,7 +137,7 @@ in.
This information changes frequently. This page was last checked or
-updated on 2007-08-20.
+updated on 2008-06-05.
Domain functions
x = not supported; empty cell means no information
@@ -254,6 +254,14 @@ updated on 2007-08-20.
≥ 0.2.0 |
≥ 0.3.0 |
+
+ virConnectOpenAuth |
+ |
+ |
+ |
+ |
+ |
+
virConnectOpenReadOnly |
All |
@@ -270,6 +278,14 @@ updated on 2007-08-20.
x |
≥ 0.3.0 |
+
+ virDomainBlockPeek |
+ 0.4.3 |
+ x |
+ x |
+ x |
+ x |
+
virDomainBlockStats |
0.3.2 |
diff --git a/docs/hvsupport.html.in b/docs/hvsupport.html.in
index f6f3a778e0..545d5442c6 100644
--- a/docs/hvsupport.html.in
+++ b/docs/hvsupport.html.in
@@ -9,7 +9,7 @@ in.
This information changes frequently. This page was last checked or
-updated on 2007-08-20.
+updated on 2008-06-05.
Domain functions
x = not supported; empty cell means no information
@@ -118,6 +118,14 @@ updated on 2007-08-20.
≥ 0.2.0 |
≥ 0.3.0 |
+
+ virConnectOpenAuth |
+ |
+ |
+ |
+ |
+ |
+
virConnectOpenReadOnly |
All |
@@ -134,6 +142,14 @@ updated on 2007-08-20.
x |
≥ 0.3.0 |
+
+ virDomainBlockPeek |
+ 0.4.3 |
+ x |
+ x |
+ x |
+ x |
+
virDomainBlockStats |
0.3.2 |
diff --git a/include/libvirt/libvirt.h b/include/libvirt/libvirt.h
index d913b046d0..1170b76061 100644
--- a/include/libvirt/libvirt.h
+++ b/include/libvirt/libvirt.h
@@ -66,12 +66,12 @@ typedef virDomain *virDomainPtr;
* A domain may be in different states at a given point in time
*/
typedef enum {
- VIR_DOMAIN_NOSTATE = 0, /* no state */
- VIR_DOMAIN_RUNNING = 1, /* the domain is running */
- VIR_DOMAIN_BLOCKED = 2, /* the domain is blocked on resource */
- VIR_DOMAIN_PAUSED = 3, /* the domain is paused by user */
+ VIR_DOMAIN_NOSTATE = 0, /* no state */
+ VIR_DOMAIN_RUNNING = 1, /* the domain is running */
+ VIR_DOMAIN_BLOCKED = 2, /* the domain is blocked on resource */
+ VIR_DOMAIN_PAUSED = 3, /* the domain is paused by user */
VIR_DOMAIN_SHUTDOWN= 4, /* the domain is being shut down */
- VIR_DOMAIN_SHUTOFF = 5, /* the domain is shut off */
+ VIR_DOMAIN_SHUTOFF = 5, /* the domain is shut off */
VIR_DOMAIN_CRASHED = 6 /* the domain is crashed */
} virDomainState;
@@ -85,11 +85,11 @@ typedef enum {
typedef struct _virDomainInfo virDomainInfo;
struct _virDomainInfo {
- unsigned char state; /* the running state, one of virDomainFlags */
- unsigned long maxMem; /* the maximum memory in KBytes allowed */
- unsigned long memory; /* the memory in KBytes used by the domain */
- unsigned short nrVirtCpu; /* the number of virtual CPUs for the domain */
- unsigned long long cpuTime; /* the CPU time used in nanoseconds */
+ unsigned char state; /* the running state, one of virDomainFlags */
+ unsigned long maxMem; /* the maximum memory in KBytes allowed */
+ unsigned long memory; /* the memory in KBytes used by the domain */
+ unsigned short nrVirtCpu; /* the number of virtual CPUs for the domain */
+ unsigned long long cpuTime; /* the CPU time used in nanoseconds */
};
/**
@@ -120,13 +120,13 @@ typedef enum {
typedef struct _virNodeInfo virNodeInfo;
struct _virNodeInfo {
- char model[32]; /* string indicating the CPU model */
+ char model[32]; /* string indicating the CPU model */
unsigned long memory;/* memory size in kilobytes */
- unsigned int cpus; /* the number of active CPUs */
- unsigned int mhz; /* expected CPU frequency */
- unsigned int nodes; /* the number of NUMA cell, 1 for uniform mem access */
+ unsigned int cpus; /* the number of active CPUs */
+ unsigned int mhz; /* expected CPU frequency */
+ unsigned int nodes; /* the number of NUMA cell, 1 for uniform mem access */
unsigned int sockets;/* number of CPU socket per node */
- unsigned int cores; /* number of core per socket */
+ unsigned int cores; /* number of core per socket */
unsigned int threads;/* number of threads per core */
};
@@ -137,12 +137,12 @@ struct _virNodeInfo {
* A scheduler parameter field type
*/
typedef enum {
- VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */
- VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */
- VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */
- VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */
- VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */
- VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */
+ VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */
+ VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */
+ VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */
+ VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */
+ VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */
+ VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */
} virSchedParameterType;
/**
@@ -162,15 +162,15 @@ typedef enum {
typedef struct _virSchedParameter virSchedParameter;
struct _virSchedParameter {
- char field[VIR_DOMAIN_SCHED_FIELD_LENGTH]; /* parameter name */
- int type; /* parameter type */
+ char field[VIR_DOMAIN_SCHED_FIELD_LENGTH]; /* parameter name */
+ int type; /* parameter type */
union {
- int i; /* data for integer case */
- unsigned int ui; /* data for unsigned integer case */
- long long int l; /* data for long long integer case */
- unsigned long long int ul; /* data for unsigned long long integer case */
- double d; /* data for double case */
- char b; /* data for char case */
+ int i; /* data for integer case */
+ unsigned int ui; /* data for unsigned integer case */
+ long long int l; /* data for long long integer case */
+ unsigned long long int ul; /* data for unsigned long long integer case */
+ double d; /* data for double case */
+ char b; /* data for char case */
} value; /* parameter value */
};
@@ -185,14 +185,14 @@ typedef virSchedParameter *virSchedParameterPtr;
/*
* Fetch scheduler parameters, caller allocates 'params' field of size 'nparams'
*/
-int virDomainGetSchedulerParameters (virDomainPtr domain,
+int virDomainGetSchedulerParameters (virDomainPtr domain,
virSchedParameterPtr params,
int *nparams);
/*
* Change scheduler parameters
*/
-int virDomainSetSchedulerParameters (virDomainPtr domain,
+int virDomainSetSchedulerParameters (virDomainPtr domain,
virSchedParameterPtr params,
int nparams);
@@ -382,23 +382,23 @@ extern virConnectAuthPtr virConnectAuthPtrDefault;
#define LIBVIR_VERSION_NUMBER 4002
-int virGetVersion (unsigned long *libVer,
+int virGetVersion (unsigned long *libVer,
const char *type,
unsigned long *typeVer);
/*
* Connection and disconnections to the Hypervisor
*/
-int virInitialize (void);
+int virInitialize (void);
-virConnectPtr virConnectOpen (const char *name);
-virConnectPtr virConnectOpenReadOnly (const char *name);
+virConnectPtr virConnectOpen (const char *name);
+virConnectPtr virConnectOpenReadOnly (const char *name);
virConnectPtr virConnectOpenAuth (const char *name,
virConnectAuthPtr auth,
int flags);
-int virConnectClose (virConnectPtr conn);
-const char * virConnectGetType (virConnectPtr conn);
-int virConnectGetVersion (virConnectPtr conn,
+int virConnectClose (virConnectPtr conn);
+const char * virConnectGetType (virConnectPtr conn);
+int virConnectGetVersion (virConnectPtr conn,
unsigned long *hvVer);
char * virConnectGetHostname (virConnectPtr conn);
char * virConnectGetURI (virConnectPtr conn);
@@ -410,100 +410,100 @@ char * virConnectGetURI (virConnectPtr conn);
int virConnectGetMaxVcpus (virConnectPtr conn,
const char *type);
-int virNodeGetInfo (virConnectPtr conn,
+int virNodeGetInfo (virConnectPtr conn,
virNodeInfoPtr info);
char * virConnectGetCapabilities (virConnectPtr conn);
-unsigned long long virNodeGetFreeMemory (virConnectPtr conn);
+unsigned long long virNodeGetFreeMemory (virConnectPtr conn);
/*
* Gather list of running domains
*/
-int virConnectListDomains (virConnectPtr conn,
+int virConnectListDomains (virConnectPtr conn,
int *ids,
int maxids);
/*
* Number of domains
*/
-int virConnectNumOfDomains (virConnectPtr conn);
+int virConnectNumOfDomains (virConnectPtr conn);
/*
* Get connection from domain.
*/
-virConnectPtr virDomainGetConnect (virDomainPtr domain);
+virConnectPtr virDomainGetConnect (virDomainPtr domain);
/*
* Domain creation and destruction
*/
-virDomainPtr virDomainCreateLinux (virConnectPtr conn,
+virDomainPtr virDomainCreateLinux (virConnectPtr conn,
const char *xmlDesc,
unsigned int flags);
-virDomainPtr virDomainLookupByName (virConnectPtr conn,
+virDomainPtr virDomainLookupByName (virConnectPtr conn,
const char *name);
-virDomainPtr virDomainLookupByID (virConnectPtr conn,
+virDomainPtr virDomainLookupByID (virConnectPtr conn,
int id);
-virDomainPtr virDomainLookupByUUID (virConnectPtr conn,
+virDomainPtr virDomainLookupByUUID (virConnectPtr conn,
const unsigned char *uuid);
-virDomainPtr virDomainLookupByUUIDString (virConnectPtr conn,
+virDomainPtr virDomainLookupByUUIDString (virConnectPtr conn,
const char *uuid);
-int virDomainShutdown (virDomainPtr domain);
-int virDomainReboot (virDomainPtr domain,
+int virDomainShutdown (virDomainPtr domain);
+int virDomainReboot (virDomainPtr domain,
unsigned int flags);
-int virDomainDestroy (virDomainPtr domain);
-int virDomainFree (virDomainPtr domain);
+int virDomainDestroy (virDomainPtr domain);
+int virDomainFree (virDomainPtr domain);
/*
* Domain suspend/resume
*/
-int virDomainSuspend (virDomainPtr domain);
-int virDomainResume (virDomainPtr domain);
+int virDomainSuspend (virDomainPtr domain);
+int virDomainResume (virDomainPtr domain);
/*
* Domain save/restore
*/
-int virDomainSave (virDomainPtr domain,
+int virDomainSave (virDomainPtr domain,
const char *to);
-int virDomainRestore (virConnectPtr conn,
+int virDomainRestore (virConnectPtr conn,
const char *from);
/*
* Domain core dump
*/
-int virDomainCoreDump (virDomainPtr domain,
+int virDomainCoreDump (virDomainPtr domain,
const char *to,
int flags);
/*
* Domain runtime information
*/
-int virDomainGetInfo (virDomainPtr domain,
+int virDomainGetInfo (virDomainPtr domain,
virDomainInfoPtr info);
/*
* Return scheduler type in effect 'sedf', 'credit', 'linux'
*/
-char * virDomainGetSchedulerType(virDomainPtr domain,
+char * virDomainGetSchedulerType(virDomainPtr domain,
int *nparams);
/*
* Dynamic control of domains
*/
-const char * virDomainGetName (virDomainPtr domain);
-unsigned int virDomainGetID (virDomainPtr domain);
-int virDomainGetUUID (virDomainPtr domain,
+const char * virDomainGetName (virDomainPtr domain);
+unsigned int virDomainGetID (virDomainPtr domain);
+int virDomainGetUUID (virDomainPtr domain,
unsigned char *uuid);
-int virDomainGetUUIDString (virDomainPtr domain,
+int virDomainGetUUIDString (virDomainPtr domain,
char *buf);
-char * virDomainGetOSType (virDomainPtr domain);
-unsigned long virDomainGetMaxMemory (virDomainPtr domain);
-int virDomainSetMaxMemory (virDomainPtr domain,
+char * virDomainGetOSType (virDomainPtr domain);
+unsigned long virDomainGetMaxMemory (virDomainPtr domain);
+int virDomainSetMaxMemory (virDomainPtr domain,
unsigned long memory);
-int virDomainSetMemory (virDomainPtr domain,
+int virDomainSetMemory (virDomainPtr domain,
unsigned long memory);
-int virDomainGetMaxVcpus (virDomainPtr domain);
+int virDomainGetMaxVcpus (virDomainPtr domain);
/*
* XML domain description
@@ -519,7 +519,7 @@ typedef enum {
VIR_DOMAIN_XML_INACTIVE = 2/* dump inactive domain information */
} virDomainXMLFlags;
-char * virDomainGetXMLDesc (virDomainPtr domain,
+char * virDomainGetXMLDesc (virDomainPtr domain,
int flags);
int virDomainBlockStats (virDomainPtr dom,
@@ -530,23 +530,28 @@ int virDomainInterfaceStats (virDomainPtr dom,
const char *path,
virDomainInterfaceStatsPtr stats,
size_t size);
-
+int virDomainBlockPeek (virDomainPtr dom,
+ const char *path,
+ unsigned long long offset,
+ size_t size,
+ void *buffer,
+ unsigned int flags);
/*
* defined but not running domains
*/
-virDomainPtr virDomainDefineXML (virConnectPtr conn,
+virDomainPtr virDomainDefineXML (virConnectPtr conn,
const char *xml);
-int virDomainUndefine (virDomainPtr domain);
+int virDomainUndefine (virDomainPtr domain);
int virConnectNumOfDefinedDomains (virConnectPtr conn);
-int virConnectListDefinedDomains (virConnectPtr conn,
+int virConnectListDefinedDomains (virConnectPtr conn,
char **const names,
int maxnames);
-int virDomainCreate (virDomainPtr domain);
+int virDomainCreate (virDomainPtr domain);
-int virDomainGetAutostart (virDomainPtr domain,
+int virDomainGetAutostart (virDomainPtr domain,
int *autostart);
-int virDomainSetAutostart (virDomainPtr domain,
+int virDomainSetAutostart (virDomainPtr domain,
int autostart);
/**
@@ -554,24 +559,24 @@ int virDomainSetAutostart (virDomainPtr domain,
*/
typedef enum {
- VIR_VCPU_OFFLINE = 0, /* the virtual CPU is offline */
- VIR_VCPU_RUNNING = 1, /* the virtual CPU is running */
- VIR_VCPU_BLOCKED = 2, /* the virtual CPU is blocked on resource */
+ VIR_VCPU_OFFLINE = 0, /* the virtual CPU is offline */
+ VIR_VCPU_RUNNING = 1, /* the virtual CPU is running */
+ VIR_VCPU_BLOCKED = 2, /* the virtual CPU is blocked on resource */
} virVcpuState;
typedef struct _virVcpuInfo virVcpuInfo;
struct _virVcpuInfo {
- unsigned int number; /* virtual CPU number */
- int state; /* value from virVcpuState */
+ unsigned int number; /* virtual CPU number */
+ int state; /* value from virVcpuState */
unsigned long long cpuTime; /* CPU time used, in nanoseconds */
- int cpu; /* real CPU number, or -1 if offline */
+ int cpu; /* real CPU number, or -1 if offline */
};
typedef virVcpuInfo *virVcpuInfoPtr;
-int virDomainSetVcpus (virDomainPtr domain,
+int virDomainSetVcpus (virDomainPtr domain,
unsigned int nvcpus);
-int virDomainPinVcpu (virDomainPtr domain,
+int virDomainPinVcpu (virDomainPtr domain,
unsigned int vcpu,
unsigned char *cpumap,
int maplen);
@@ -585,7 +590,7 @@ int virDomainPinVcpu (virDomainPtr domain,
* USE_CPU macro set the bit (CPU usable) of the related cpu in cpumap.
*/
-#define VIR_USE_CPU(cpumap,cpu) (cpumap[(cpu)/8] |= (1<<((cpu)%8)))
+#define VIR_USE_CPU(cpumap,cpu) (cpumap[(cpu)/8] |= (1<<((cpu)%8)))
/**
* VIR_UNUSE_CPU:
@@ -596,7 +601,7 @@ int virDomainPinVcpu (virDomainPtr domain,
* USE_CPU macro reset the bit (CPU not usable) of the related cpu in cpumap.
*/
-#define VIR_UNUSE_CPU(cpumap,cpu) (cpumap[(cpu)/8] &= ~(1<<((cpu)%8)))
+#define VIR_UNUSE_CPU(cpumap,cpu) (cpumap[(cpu)/8] &= ~(1<<((cpu)%8)))
/**
* VIR_CPU_MAPLEN:
@@ -610,7 +615,7 @@ int virDomainPinVcpu (virDomainPtr domain,
#define VIR_CPU_MAPLEN(cpu) (((cpu)+7)/8)
-int virDomainGetVcpus (virDomainPtr domain,
+int virDomainGetVcpus (virDomainPtr domain,
virVcpuInfoPtr info,
int maxinfo,
unsigned char *cpumaps,
@@ -637,7 +642,7 @@ int virDomainGetVcpus (virDomainPtr domain,
* @maplen: the length (in bytes) of one cpumap
* @vcpu: the virtual CPU number
* @cpumap: pointer to a cpumap (in 8-bit bytes) (OUT)
- * This cpumap must be previously allocated by the caller
+ * This cpumap must be previously allocated by the caller
* (ie: malloc(maplen))
*
* This macro is to be used in conjunction with virDomainGetVcpus() and
@@ -659,7 +664,7 @@ int virDomainGetVcpus (virDomainPtr domain,
* virDomainPinVcpu() APIs. VIR_GET_CPUMAP macro returns a pointer to the
* cpumap of the specified vcpu from cpumaps array.
*/
-#define VIR_GET_CPUMAP(cpumaps,maplen,vcpu) &(cpumaps[(vcpu)*(maplen)])
+#define VIR_GET_CPUMAP(cpumaps,maplen,vcpu) &(cpumaps[(vcpu)*(maplen)])
int virDomainAttachDevice(virDomainPtr domain, const char *xml);
int virDomainDetachDevice(virDomainPtr domain, const char *xml);
@@ -668,7 +673,7 @@ int virDomainDetachDevice(virDomainPtr domain, const char *xml);
* NUMA support
*/
-int virNodeGetCellsFreeMemory(virConnectPtr conn,
+int virNodeGetCellsFreeMemory(virConnectPtr conn,
unsigned long long *freeMems,
int startCell,
int maxCells);
@@ -695,77 +700,77 @@ typedef virNetwork *virNetworkPtr;
/*
* Get connection from network.
*/
-virConnectPtr virNetworkGetConnect (virNetworkPtr network);
+virConnectPtr virNetworkGetConnect (virNetworkPtr network);
/*
* List active networks
*/
-int virConnectNumOfNetworks (virConnectPtr conn);
-int virConnectListNetworks (virConnectPtr conn,
+int virConnectNumOfNetworks (virConnectPtr conn);
+int virConnectListNetworks (virConnectPtr conn,
char **const names,
int maxnames);
/*
* List inactive networks
*/
-int virConnectNumOfDefinedNetworks (virConnectPtr conn);
-int virConnectListDefinedNetworks (virConnectPtr conn,
+int virConnectNumOfDefinedNetworks (virConnectPtr conn);
+int virConnectListDefinedNetworks (virConnectPtr conn,
char **const names,
int maxnames);
/*
* Lookup network by name or uuid
*/
-virNetworkPtr virNetworkLookupByName (virConnectPtr conn,
+virNetworkPtr virNetworkLookupByName (virConnectPtr conn,
const char *name);
-virNetworkPtr virNetworkLookupByUUID (virConnectPtr conn,
+virNetworkPtr virNetworkLookupByUUID (virConnectPtr conn,
const unsigned char *uuid);
-virNetworkPtr virNetworkLookupByUUIDString (virConnectPtr conn,
+virNetworkPtr virNetworkLookupByUUIDString (virConnectPtr conn,
const char *uuid);
/*
* Create active transient network
*/
-virNetworkPtr virNetworkCreateXML (virConnectPtr conn,
+virNetworkPtr virNetworkCreateXML (virConnectPtr conn,
const char *xmlDesc);
/*
* Define inactive persistent network
*/
-virNetworkPtr virNetworkDefineXML (virConnectPtr conn,
+virNetworkPtr virNetworkDefineXML (virConnectPtr conn,
const char *xmlDesc);
/*
* Delete persistent network
*/
-int virNetworkUndefine (virNetworkPtr network);
+int virNetworkUndefine (virNetworkPtr network);
/*
* Activate persistent network
*/
-int virNetworkCreate (virNetworkPtr network);
+int virNetworkCreate (virNetworkPtr network);
/*
* Network destroy/free
*/
-int virNetworkDestroy (virNetworkPtr network);
-int virNetworkFree (virNetworkPtr network);
+int virNetworkDestroy (virNetworkPtr network);
+int virNetworkFree (virNetworkPtr network);
/*
* Network information
*/
-const char* virNetworkGetName (virNetworkPtr network);
-int virNetworkGetUUID (virNetworkPtr network,
+const char* virNetworkGetName (virNetworkPtr network);
+int virNetworkGetUUID (virNetworkPtr network,
unsigned char *uuid);
-int virNetworkGetUUIDString (virNetworkPtr network,
+int virNetworkGetUUIDString (virNetworkPtr network,
char *buf);
-char * virNetworkGetXMLDesc (virNetworkPtr network,
+char * virNetworkGetXMLDesc (virNetworkPtr network,
int flags);
-char * virNetworkGetBridgeName (virNetworkPtr network);
+char * virNetworkGetBridgeName (virNetworkPtr network);
-int virNetworkGetAutostart (virNetworkPtr network,
+int virNetworkGetAutostart (virNetworkPtr network,
int *autostart);
-int virNetworkSetAutostart (virNetworkPtr network,
+int virNetworkSetAutostart (virNetworkPtr network,
int autostart);
@@ -855,113 +860,113 @@ typedef virStorageVolInfo *virStorageVolInfoPtr;
/*
* Get connection from pool.
*/
-virConnectPtr virStoragePoolGetConnect (virStoragePoolPtr pool);
+virConnectPtr virStoragePoolGetConnect (virStoragePoolPtr pool);
/*
* List active storage pools
*/
-int virConnectNumOfStoragePools (virConnectPtr conn);
-int virConnectListStoragePools (virConnectPtr conn,
+int virConnectNumOfStoragePools (virConnectPtr conn);
+int virConnectListStoragePools (virConnectPtr conn,
char **const names,
int maxnames);
/*
* List inactive storage pools
*/
-int virConnectNumOfDefinedStoragePools(virConnectPtr conn);
-int virConnectListDefinedStoragePools(virConnectPtr conn,
+int virConnectNumOfDefinedStoragePools(virConnectPtr conn);
+int virConnectListDefinedStoragePools(virConnectPtr conn,
char **const names,
int maxnames);
/*
* Lookup pool by name or uuid
*/
-virStoragePoolPtr virStoragePoolLookupByName (virConnectPtr conn,
+virStoragePoolPtr virStoragePoolLookupByName (virConnectPtr conn,
const char *name);
-virStoragePoolPtr virStoragePoolLookupByUUID (virConnectPtr conn,
+virStoragePoolPtr virStoragePoolLookupByUUID (virConnectPtr conn,
const unsigned char *uuid);
-virStoragePoolPtr virStoragePoolLookupByUUIDString(virConnectPtr conn,
+virStoragePoolPtr virStoragePoolLookupByUUIDString(virConnectPtr conn,
const char *uuid);
-virStoragePoolPtr virStoragePoolLookupByVolume (virStorageVolPtr vol);
+virStoragePoolPtr virStoragePoolLookupByVolume (virStorageVolPtr vol);
/*
* Creating/destroying pools
*/
-virStoragePoolPtr virStoragePoolCreateXML (virConnectPtr conn,
+virStoragePoolPtr virStoragePoolCreateXML (virConnectPtr conn,
const char *xmlDesc,
unsigned int flags);
-virStoragePoolPtr virStoragePoolDefineXML (virConnectPtr conn,
+virStoragePoolPtr virStoragePoolDefineXML (virConnectPtr conn,
const char *xmlDesc,
unsigned int flags);
-int virStoragePoolBuild (virStoragePoolPtr pool,
+int virStoragePoolBuild (virStoragePoolPtr pool,
unsigned int flags);
-int virStoragePoolUndefine (virStoragePoolPtr pool);
-int virStoragePoolCreate (virStoragePoolPtr pool,
+int virStoragePoolUndefine (virStoragePoolPtr pool);
+int virStoragePoolCreate (virStoragePoolPtr pool,
unsigned int flags);
-int virStoragePoolDestroy (virStoragePoolPtr pool);
-int virStoragePoolDelete (virStoragePoolPtr pool,
+int virStoragePoolDestroy (virStoragePoolPtr pool);
+int virStoragePoolDelete (virStoragePoolPtr pool,
unsigned int flags);
-int virStoragePoolFree (virStoragePoolPtr pool);
-int virStoragePoolRefresh (virStoragePoolPtr pool,
+int virStoragePoolFree (virStoragePoolPtr pool);
+int virStoragePoolRefresh (virStoragePoolPtr pool,
unsigned int flags);
/*
* StoragePool information
*/
-const char* virStoragePoolGetName (virStoragePoolPtr pool);
-int virStoragePoolGetUUID (virStoragePoolPtr pool,
+const char* virStoragePoolGetName (virStoragePoolPtr pool);
+int virStoragePoolGetUUID (virStoragePoolPtr pool,
unsigned char *uuid);
-int virStoragePoolGetUUIDString (virStoragePoolPtr pool,
+int virStoragePoolGetUUIDString (virStoragePoolPtr pool,
char *buf);
-int virStoragePoolGetInfo (virStoragePoolPtr vol,
+int virStoragePoolGetInfo (virStoragePoolPtr vol,
virStoragePoolInfoPtr info);
-char * virStoragePoolGetXMLDesc (virStoragePoolPtr pool,
+char * virStoragePoolGetXMLDesc (virStoragePoolPtr pool,
unsigned int flags);
-int virStoragePoolGetAutostart (virStoragePoolPtr pool,
+int virStoragePoolGetAutostart (virStoragePoolPtr pool,
int *autostart);
-int virStoragePoolSetAutostart (virStoragePoolPtr pool,
+int virStoragePoolSetAutostart (virStoragePoolPtr pool,
int autostart);
/*
* List/lookup storage volumes within a pool
*/
-int virStoragePoolNumOfVolumes (virStoragePoolPtr pool);
-int virStoragePoolListVolumes (virStoragePoolPtr pool,
+int virStoragePoolNumOfVolumes (virStoragePoolPtr pool);
+int virStoragePoolListVolumes (virStoragePoolPtr pool,
char **const names,
int maxnames);
-virConnectPtr virStorageVolGetConnect (virStorageVolPtr vol);
+virConnectPtr virStorageVolGetConnect (virStorageVolPtr vol);
/*
* Lookup volumes based on various attributes
*/
-virStorageVolPtr virStorageVolLookupByName (virStoragePoolPtr pool,
+virStorageVolPtr virStorageVolLookupByName (virStoragePoolPtr pool,
const char *name);
-virStorageVolPtr virStorageVolLookupByKey (virConnectPtr conn,
+virStorageVolPtr virStorageVolLookupByKey (virConnectPtr conn,
const char *key);
-virStorageVolPtr virStorageVolLookupByPath (virConnectPtr conn,
+virStorageVolPtr virStorageVolLookupByPath (virConnectPtr conn,
const char *path);
-const char* virStorageVolGetName (virStorageVolPtr vol);
-const char* virStorageVolGetKey (virStorageVolPtr vol);
+const char* virStorageVolGetName (virStorageVolPtr vol);
+const char* virStorageVolGetKey (virStorageVolPtr vol);
-virStorageVolPtr virStorageVolCreateXML (virStoragePoolPtr pool,
+virStorageVolPtr virStorageVolCreateXML (virStoragePoolPtr pool,
const char *xmldesc,
unsigned int flags);
-int virStorageVolDelete (virStorageVolPtr vol,
+int virStorageVolDelete (virStorageVolPtr vol,
unsigned int flags);
-int virStorageVolFree (virStorageVolPtr vol);
+int virStorageVolFree (virStorageVolPtr vol);
-int virStorageVolGetInfo (virStorageVolPtr vol,
+int virStorageVolGetInfo (virStorageVolPtr vol,
virStorageVolInfoPtr info);
-char * virStorageVolGetXMLDesc (virStorageVolPtr pool,
+char * virStorageVolGetXMLDesc (virStorageVolPtr pool,
unsigned int flags);
-char * virStorageVolGetPath (virStorageVolPtr vol);
+char * virStorageVolGetPath (virStorageVolPtr vol);
#ifdef __cplusplus
}
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index f67aee7e5c..a711edd304 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -66,12 +66,12 @@ typedef virDomain *virDomainPtr;
* A domain may be in different states at a given point in time
*/
typedef enum {
- VIR_DOMAIN_NOSTATE = 0, /* no state */
- VIR_DOMAIN_RUNNING = 1, /* the domain is running */
- VIR_DOMAIN_BLOCKED = 2, /* the domain is blocked on resource */
- VIR_DOMAIN_PAUSED = 3, /* the domain is paused by user */
+ VIR_DOMAIN_NOSTATE = 0, /* no state */
+ VIR_DOMAIN_RUNNING = 1, /* the domain is running */
+ VIR_DOMAIN_BLOCKED = 2, /* the domain is blocked on resource */
+ VIR_DOMAIN_PAUSED = 3, /* the domain is paused by user */
VIR_DOMAIN_SHUTDOWN= 4, /* the domain is being shut down */
- VIR_DOMAIN_SHUTOFF = 5, /* the domain is shut off */
+ VIR_DOMAIN_SHUTOFF = 5, /* the domain is shut off */
VIR_DOMAIN_CRASHED = 6 /* the domain is crashed */
} virDomainState;
@@ -85,11 +85,11 @@ typedef enum {
typedef struct _virDomainInfo virDomainInfo;
struct _virDomainInfo {
- unsigned char state; /* the running state, one of virDomainFlags */
- unsigned long maxMem; /* the maximum memory in KBytes allowed */
- unsigned long memory; /* the memory in KBytes used by the domain */
- unsigned short nrVirtCpu; /* the number of virtual CPUs for the domain */
- unsigned long long cpuTime; /* the CPU time used in nanoseconds */
+ unsigned char state; /* the running state, one of virDomainFlags */
+ unsigned long maxMem; /* the maximum memory in KBytes allowed */
+ unsigned long memory; /* the memory in KBytes used by the domain */
+ unsigned short nrVirtCpu; /* the number of virtual CPUs for the domain */
+ unsigned long long cpuTime; /* the CPU time used in nanoseconds */
};
/**
@@ -120,13 +120,13 @@ typedef enum {
typedef struct _virNodeInfo virNodeInfo;
struct _virNodeInfo {
- char model[32]; /* string indicating the CPU model */
+ char model[32]; /* string indicating the CPU model */
unsigned long memory;/* memory size in kilobytes */
- unsigned int cpus; /* the number of active CPUs */
- unsigned int mhz; /* expected CPU frequency */
- unsigned int nodes; /* the number of NUMA cell, 1 for uniform mem access */
+ unsigned int cpus; /* the number of active CPUs */
+ unsigned int mhz; /* expected CPU frequency */
+ unsigned int nodes; /* the number of NUMA cell, 1 for uniform mem access */
unsigned int sockets;/* number of CPU socket per node */
- unsigned int cores; /* number of core per socket */
+ unsigned int cores; /* number of core per socket */
unsigned int threads;/* number of threads per core */
};
@@ -137,12 +137,12 @@ struct _virNodeInfo {
* A scheduler parameter field type
*/
typedef enum {
- VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */
- VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */
- VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */
- VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */
- VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */
- VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */
+ VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */
+ VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */
+ VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */
+ VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */
+ VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */
+ VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */
} virSchedParameterType;
/**
@@ -162,15 +162,15 @@ typedef enum {
typedef struct _virSchedParameter virSchedParameter;
struct _virSchedParameter {
- char field[VIR_DOMAIN_SCHED_FIELD_LENGTH]; /* parameter name */
- int type; /* parameter type */
+ char field[VIR_DOMAIN_SCHED_FIELD_LENGTH]; /* parameter name */
+ int type; /* parameter type */
union {
- int i; /* data for integer case */
- unsigned int ui; /* data for unsigned integer case */
- long long int l; /* data for long long integer case */
- unsigned long long int ul; /* data for unsigned long long integer case */
- double d; /* data for double case */
- char b; /* data for char case */
+ int i; /* data for integer case */
+ unsigned int ui; /* data for unsigned integer case */
+ long long int l; /* data for long long integer case */
+ unsigned long long int ul; /* data for unsigned long long integer case */
+ double d; /* data for double case */
+ char b; /* data for char case */
} value; /* parameter value */
};
@@ -185,14 +185,14 @@ typedef virSchedParameter *virSchedParameterPtr;
/*
* Fetch scheduler parameters, caller allocates 'params' field of size 'nparams'
*/
-int virDomainGetSchedulerParameters (virDomainPtr domain,
+int virDomainGetSchedulerParameters (virDomainPtr domain,
virSchedParameterPtr params,
int *nparams);
/*
* Change scheduler parameters
*/
-int virDomainSetSchedulerParameters (virDomainPtr domain,
+int virDomainSetSchedulerParameters (virDomainPtr domain,
virSchedParameterPtr params,
int nparams);
@@ -382,23 +382,23 @@ extern virConnectAuthPtr virConnectAuthPtrDefault;
#define LIBVIR_VERSION_NUMBER @LIBVIRT_VERSION_NUMBER@
-int virGetVersion (unsigned long *libVer,
+int virGetVersion (unsigned long *libVer,
const char *type,
unsigned long *typeVer);
/*
* Connection and disconnections to the Hypervisor
*/
-int virInitialize (void);
+int virInitialize (void);
-virConnectPtr virConnectOpen (const char *name);
-virConnectPtr virConnectOpenReadOnly (const char *name);
+virConnectPtr virConnectOpen (const char *name);
+virConnectPtr virConnectOpenReadOnly (const char *name);
virConnectPtr virConnectOpenAuth (const char *name,
virConnectAuthPtr auth,
int flags);
-int virConnectClose (virConnectPtr conn);
-const char * virConnectGetType (virConnectPtr conn);
-int virConnectGetVersion (virConnectPtr conn,
+int virConnectClose (virConnectPtr conn);
+const char * virConnectGetType (virConnectPtr conn);
+int virConnectGetVersion (virConnectPtr conn,
unsigned long *hvVer);
char * virConnectGetHostname (virConnectPtr conn);
char * virConnectGetURI (virConnectPtr conn);
@@ -410,100 +410,100 @@ char * virConnectGetURI (virConnectPtr conn);
int virConnectGetMaxVcpus (virConnectPtr conn,
const char *type);
-int virNodeGetInfo (virConnectPtr conn,
+int virNodeGetInfo (virConnectPtr conn,
virNodeInfoPtr info);
char * virConnectGetCapabilities (virConnectPtr conn);
-unsigned long long virNodeGetFreeMemory (virConnectPtr conn);
+unsigned long long virNodeGetFreeMemory (virConnectPtr conn);
/*
* Gather list of running domains
*/
-int virConnectListDomains (virConnectPtr conn,
+int virConnectListDomains (virConnectPtr conn,
int *ids,
int maxids);
/*
* Number of domains
*/
-int virConnectNumOfDomains (virConnectPtr conn);
+int virConnectNumOfDomains (virConnectPtr conn);
/*
* Get connection from domain.
*/
-virConnectPtr virDomainGetConnect (virDomainPtr domain);
+virConnectPtr virDomainGetConnect (virDomainPtr domain);
/*
* Domain creation and destruction
*/
-virDomainPtr virDomainCreateLinux (virConnectPtr conn,
+virDomainPtr virDomainCreateLinux (virConnectPtr conn,
const char *xmlDesc,
unsigned int flags);
-virDomainPtr virDomainLookupByName (virConnectPtr conn,
+virDomainPtr virDomainLookupByName (virConnectPtr conn,
const char *name);
-virDomainPtr virDomainLookupByID (virConnectPtr conn,
+virDomainPtr virDomainLookupByID (virConnectPtr conn,
int id);
-virDomainPtr virDomainLookupByUUID (virConnectPtr conn,
+virDomainPtr virDomainLookupByUUID (virConnectPtr conn,
const unsigned char *uuid);
-virDomainPtr virDomainLookupByUUIDString (virConnectPtr conn,
+virDomainPtr virDomainLookupByUUIDString (virConnectPtr conn,
const char *uuid);
-int virDomainShutdown (virDomainPtr domain);
-int virDomainReboot (virDomainPtr domain,
+int virDomainShutdown (virDomainPtr domain);
+int virDomainReboot (virDomainPtr domain,
unsigned int flags);
-int virDomainDestroy (virDomainPtr domain);
-int virDomainFree (virDomainPtr domain);
+int virDomainDestroy (virDomainPtr domain);
+int virDomainFree (virDomainPtr domain);
/*
* Domain suspend/resume
*/
-int virDomainSuspend (virDomainPtr domain);
-int virDomainResume (virDomainPtr domain);
+int virDomainSuspend (virDomainPtr domain);
+int virDomainResume (virDomainPtr domain);
/*
* Domain save/restore
*/
-int virDomainSave (virDomainPtr domain,
+int virDomainSave (virDomainPtr domain,
const char *to);
-int virDomainRestore (virConnectPtr conn,
+int virDomainRestore (virConnectPtr conn,
const char *from);
/*
* Domain core dump
*/
-int virDomainCoreDump (virDomainPtr domain,
+int virDomainCoreDump (virDomainPtr domain,
const char *to,
int flags);
/*
* Domain runtime information
*/
-int virDomainGetInfo (virDomainPtr domain,
+int virDomainGetInfo (virDomainPtr domain,
virDomainInfoPtr info);
/*
* Return scheduler type in effect 'sedf', 'credit', 'linux'
*/
-char * virDomainGetSchedulerType(virDomainPtr domain,
+char * virDomainGetSchedulerType(virDomainPtr domain,
int *nparams);
/*
* Dynamic control of domains
*/
-const char * virDomainGetName (virDomainPtr domain);
-unsigned int virDomainGetID (virDomainPtr domain);
-int virDomainGetUUID (virDomainPtr domain,
+const char * virDomainGetName (virDomainPtr domain);
+unsigned int virDomainGetID (virDomainPtr domain);
+int virDomainGetUUID (virDomainPtr domain,
unsigned char *uuid);
-int virDomainGetUUIDString (virDomainPtr domain,
+int virDomainGetUUIDString (virDomainPtr domain,
char *buf);
-char * virDomainGetOSType (virDomainPtr domain);
-unsigned long virDomainGetMaxMemory (virDomainPtr domain);
-int virDomainSetMaxMemory (virDomainPtr domain,
+char * virDomainGetOSType (virDomainPtr domain);
+unsigned long virDomainGetMaxMemory (virDomainPtr domain);
+int virDomainSetMaxMemory (virDomainPtr domain,
unsigned long memory);
-int virDomainSetMemory (virDomainPtr domain,
+int virDomainSetMemory (virDomainPtr domain,
unsigned long memory);
-int virDomainGetMaxVcpus (virDomainPtr domain);
+int virDomainGetMaxVcpus (virDomainPtr domain);
/*
* XML domain description
@@ -519,7 +519,7 @@ typedef enum {
VIR_DOMAIN_XML_INACTIVE = 2/* dump inactive domain information */
} virDomainXMLFlags;
-char * virDomainGetXMLDesc (virDomainPtr domain,
+char * virDomainGetXMLDesc (virDomainPtr domain,
int flags);
int virDomainBlockStats (virDomainPtr dom,
@@ -530,23 +530,28 @@ int virDomainInterfaceStats (virDomainPtr dom,
const char *path,
virDomainInterfaceStatsPtr stats,
size_t size);
-
+int virDomainBlockPeek (virDomainPtr dom,
+ const char *path,
+ unsigned long long offset,
+ size_t size,
+ void *buffer,
+ unsigned int flags);
/*
* defined but not running domains
*/
-virDomainPtr virDomainDefineXML (virConnectPtr conn,
+virDomainPtr virDomainDefineXML (virConnectPtr conn,
const char *xml);
-int virDomainUndefine (virDomainPtr domain);
+int virDomainUndefine (virDomainPtr domain);
int virConnectNumOfDefinedDomains (virConnectPtr conn);
-int virConnectListDefinedDomains (virConnectPtr conn,
+int virConnectListDefinedDomains (virConnectPtr conn,
char **const names,
int maxnames);
-int virDomainCreate (virDomainPtr domain);
+int virDomainCreate (virDomainPtr domain);
-int virDomainGetAutostart (virDomainPtr domain,
+int virDomainGetAutostart (virDomainPtr domain,
int *autostart);
-int virDomainSetAutostart (virDomainPtr domain,
+int virDomainSetAutostart (virDomainPtr domain,
int autostart);
/**
@@ -554,24 +559,24 @@ int virDomainSetAutostart (virDomainPtr domain,
*/
typedef enum {
- VIR_VCPU_OFFLINE = 0, /* the virtual CPU is offline */
- VIR_VCPU_RUNNING = 1, /* the virtual CPU is running */
- VIR_VCPU_BLOCKED = 2, /* the virtual CPU is blocked on resource */
+ VIR_VCPU_OFFLINE = 0, /* the virtual CPU is offline */
+ VIR_VCPU_RUNNING = 1, /* the virtual CPU is running */
+ VIR_VCPU_BLOCKED = 2, /* the virtual CPU is blocked on resource */
} virVcpuState;
typedef struct _virVcpuInfo virVcpuInfo;
struct _virVcpuInfo {
- unsigned int number; /* virtual CPU number */
- int state; /* value from virVcpuState */
+ unsigned int number; /* virtual CPU number */
+ int state; /* value from virVcpuState */
unsigned long long cpuTime; /* CPU time used, in nanoseconds */
- int cpu; /* real CPU number, or -1 if offline */
+ int cpu; /* real CPU number, or -1 if offline */
};
typedef virVcpuInfo *virVcpuInfoPtr;
-int virDomainSetVcpus (virDomainPtr domain,
+int virDomainSetVcpus (virDomainPtr domain,
unsigned int nvcpus);
-int virDomainPinVcpu (virDomainPtr domain,
+int virDomainPinVcpu (virDomainPtr domain,
unsigned int vcpu,
unsigned char *cpumap,
int maplen);
@@ -585,7 +590,7 @@ int virDomainPinVcpu (virDomainPtr domain,
* USE_CPU macro set the bit (CPU usable) of the related cpu in cpumap.
*/
-#define VIR_USE_CPU(cpumap,cpu) (cpumap[(cpu)/8] |= (1<<((cpu)%8)))
+#define VIR_USE_CPU(cpumap,cpu) (cpumap[(cpu)/8] |= (1<<((cpu)%8)))
/**
* VIR_UNUSE_CPU:
@@ -596,7 +601,7 @@ int virDomainPinVcpu (virDomainPtr domain,
* USE_CPU macro reset the bit (CPU not usable) of the related cpu in cpumap.
*/
-#define VIR_UNUSE_CPU(cpumap,cpu) (cpumap[(cpu)/8] &= ~(1<<((cpu)%8)))
+#define VIR_UNUSE_CPU(cpumap,cpu) (cpumap[(cpu)/8] &= ~(1<<((cpu)%8)))
/**
* VIR_CPU_MAPLEN:
@@ -610,7 +615,7 @@ int virDomainPinVcpu (virDomainPtr domain,
#define VIR_CPU_MAPLEN(cpu) (((cpu)+7)/8)
-int virDomainGetVcpus (virDomainPtr domain,
+int virDomainGetVcpus (virDomainPtr domain,
virVcpuInfoPtr info,
int maxinfo,
unsigned char *cpumaps,
@@ -637,7 +642,7 @@ int virDomainGetVcpus (virDomainPtr domain,
* @maplen: the length (in bytes) of one cpumap
* @vcpu: the virtual CPU number
* @cpumap: pointer to a cpumap (in 8-bit bytes) (OUT)
- * This cpumap must be previously allocated by the caller
+ * This cpumap must be previously allocated by the caller
* (ie: malloc(maplen))
*
* This macro is to be used in conjunction with virDomainGetVcpus() and
@@ -659,7 +664,7 @@ int virDomainGetVcpus (virDomainPtr domain,
* virDomainPinVcpu() APIs. VIR_GET_CPUMAP macro returns a pointer to the
* cpumap of the specified vcpu from cpumaps array.
*/
-#define VIR_GET_CPUMAP(cpumaps,maplen,vcpu) &(cpumaps[(vcpu)*(maplen)])
+#define VIR_GET_CPUMAP(cpumaps,maplen,vcpu) &(cpumaps[(vcpu)*(maplen)])
int virDomainAttachDevice(virDomainPtr domain, const char *xml);
int virDomainDetachDevice(virDomainPtr domain, const char *xml);
@@ -668,7 +673,7 @@ int virDomainDetachDevice(virDomainPtr domain, const char *xml);
* NUMA support
*/
-int virNodeGetCellsFreeMemory(virConnectPtr conn,
+int virNodeGetCellsFreeMemory(virConnectPtr conn,
unsigned long long *freeMems,
int startCell,
int maxCells);
@@ -695,77 +700,77 @@ typedef virNetwork *virNetworkPtr;
/*
* Get connection from network.
*/
-virConnectPtr virNetworkGetConnect (virNetworkPtr network);
+virConnectPtr virNetworkGetConnect (virNetworkPtr network);
/*
* List active networks
*/
-int virConnectNumOfNetworks (virConnectPtr conn);
-int virConnectListNetworks (virConnectPtr conn,
+int virConnectNumOfNetworks (virConnectPtr conn);
+int virConnectListNetworks (virConnectPtr conn,
char **const names,
int maxnames);
/*
* List inactive networks
*/
-int virConnectNumOfDefinedNetworks (virConnectPtr conn);
-int virConnectListDefinedNetworks (virConnectPtr conn,
+int virConnectNumOfDefinedNetworks (virConnectPtr conn);
+int virConnectListDefinedNetworks (virConnectPtr conn,
char **const names,
int maxnames);
/*
* Lookup network by name or uuid
*/
-virNetworkPtr virNetworkLookupByName (virConnectPtr conn,
+virNetworkPtr virNetworkLookupByName (virConnectPtr conn,
const char *name);
-virNetworkPtr virNetworkLookupByUUID (virConnectPtr conn,
+virNetworkPtr virNetworkLookupByUUID (virConnectPtr conn,
const unsigned char *uuid);
-virNetworkPtr virNetworkLookupByUUIDString (virConnectPtr conn,
+virNetworkPtr virNetworkLookupByUUIDString (virConnectPtr conn,
const char *uuid);
/*
* Create active transient network
*/
-virNetworkPtr virNetworkCreateXML (virConnectPtr conn,
+virNetworkPtr virNetworkCreateXML (virConnectPtr conn,
const char *xmlDesc);
/*
* Define inactive persistent network
*/
-virNetworkPtr virNetworkDefineXML (virConnectPtr conn,
+virNetworkPtr virNetworkDefineXML (virConnectPtr conn,
const char *xmlDesc);
/*
* Delete persistent network
*/
-int virNetworkUndefine (virNetworkPtr network);
+int virNetworkUndefine (virNetworkPtr network);
/*
* Activate persistent network
*/
-int virNetworkCreate (virNetworkPtr network);
+int virNetworkCreate (virNetworkPtr network);
/*
* Network destroy/free
*/
-int virNetworkDestroy (virNetworkPtr network);
-int virNetworkFree (virNetworkPtr network);
+int virNetworkDestroy (virNetworkPtr network);
+int virNetworkFree (virNetworkPtr network);
/*
* Network information
*/
-const char* virNetworkGetName (virNetworkPtr network);
-int virNetworkGetUUID (virNetworkPtr network,
+const char* virNetworkGetName (virNetworkPtr network);
+int virNetworkGetUUID (virNetworkPtr network,
unsigned char *uuid);
-int virNetworkGetUUIDString (virNetworkPtr network,
+int virNetworkGetUUIDString (virNetworkPtr network,
char *buf);
-char * virNetworkGetXMLDesc (virNetworkPtr network,
+char * virNetworkGetXMLDesc (virNetworkPtr network,
int flags);
-char * virNetworkGetBridgeName (virNetworkPtr network);
+char * virNetworkGetBridgeName (virNetworkPtr network);
-int virNetworkGetAutostart (virNetworkPtr network,
+int virNetworkGetAutostart (virNetworkPtr network,
int *autostart);
-int virNetworkSetAutostart (virNetworkPtr network,
+int virNetworkSetAutostart (virNetworkPtr network,
int autostart);
@@ -855,113 +860,113 @@ typedef virStorageVolInfo *virStorageVolInfoPtr;
/*
* Get connection from pool.
*/
-virConnectPtr virStoragePoolGetConnect (virStoragePoolPtr pool);
+virConnectPtr virStoragePoolGetConnect (virStoragePoolPtr pool);
/*
* List active storage pools
*/
-int virConnectNumOfStoragePools (virConnectPtr conn);
-int virConnectListStoragePools (virConnectPtr conn,
+int virConnectNumOfStoragePools (virConnectPtr conn);
+int virConnectListStoragePools (virConnectPtr conn,
char **const names,
int maxnames);
/*
* List inactive storage pools
*/
-int virConnectNumOfDefinedStoragePools(virConnectPtr conn);
-int virConnectListDefinedStoragePools(virConnectPtr conn,
+int virConnectNumOfDefinedStoragePools(virConnectPtr conn);
+int virConnectListDefinedStoragePools(virConnectPtr conn,
char **const names,
int maxnames);
/*
* Lookup pool by name or uuid
*/
-virStoragePoolPtr virStoragePoolLookupByName (virConnectPtr conn,
+virStoragePoolPtr virStoragePoolLookupByName (virConnectPtr conn,
const char *name);
-virStoragePoolPtr virStoragePoolLookupByUUID (virConnectPtr conn,
+virStoragePoolPtr virStoragePoolLookupByUUID (virConnectPtr conn,
const unsigned char *uuid);
-virStoragePoolPtr virStoragePoolLookupByUUIDString(virConnectPtr conn,
+virStoragePoolPtr virStoragePoolLookupByUUIDString(virConnectPtr conn,
const char *uuid);
-virStoragePoolPtr virStoragePoolLookupByVolume (virStorageVolPtr vol);
+virStoragePoolPtr virStoragePoolLookupByVolume (virStorageVolPtr vol);
/*
* Creating/destroying pools
*/
-virStoragePoolPtr virStoragePoolCreateXML (virConnectPtr conn,
+virStoragePoolPtr virStoragePoolCreateXML (virConnectPtr conn,
const char *xmlDesc,
unsigned int flags);
-virStoragePoolPtr virStoragePoolDefineXML (virConnectPtr conn,
+virStoragePoolPtr virStoragePoolDefineXML (virConnectPtr conn,
const char *xmlDesc,
unsigned int flags);
-int virStoragePoolBuild (virStoragePoolPtr pool,
+int virStoragePoolBuild (virStoragePoolPtr pool,
unsigned int flags);
-int virStoragePoolUndefine (virStoragePoolPtr pool);
-int virStoragePoolCreate (virStoragePoolPtr pool,
+int virStoragePoolUndefine (virStoragePoolPtr pool);
+int virStoragePoolCreate (virStoragePoolPtr pool,
unsigned int flags);
-int virStoragePoolDestroy (virStoragePoolPtr pool);
-int virStoragePoolDelete (virStoragePoolPtr pool,
+int virStoragePoolDestroy (virStoragePoolPtr pool);
+int virStoragePoolDelete (virStoragePoolPtr pool,
unsigned int flags);
-int virStoragePoolFree (virStoragePoolPtr pool);
-int virStoragePoolRefresh (virStoragePoolPtr pool,
+int virStoragePoolFree (virStoragePoolPtr pool);
+int virStoragePoolRefresh (virStoragePoolPtr pool,
unsigned int flags);
/*
* StoragePool information
*/
-const char* virStoragePoolGetName (virStoragePoolPtr pool);
-int virStoragePoolGetUUID (virStoragePoolPtr pool,
+const char* virStoragePoolGetName (virStoragePoolPtr pool);
+int virStoragePoolGetUUID (virStoragePoolPtr pool,
unsigned char *uuid);
-int virStoragePoolGetUUIDString (virStoragePoolPtr pool,
+int virStoragePoolGetUUIDString (virStoragePoolPtr pool,
char *buf);
-int virStoragePoolGetInfo (virStoragePoolPtr vol,
+int virStoragePoolGetInfo (virStoragePoolPtr vol,
virStoragePoolInfoPtr info);
-char * virStoragePoolGetXMLDesc (virStoragePoolPtr pool,
+char * virStoragePoolGetXMLDesc (virStoragePoolPtr pool,
unsigned int flags);
-int virStoragePoolGetAutostart (virStoragePoolPtr pool,
+int virStoragePoolGetAutostart (virStoragePoolPtr pool,
int *autostart);
-int virStoragePoolSetAutostart (virStoragePoolPtr pool,
+int virStoragePoolSetAutostart (virStoragePoolPtr pool,
int autostart);
/*
* List/lookup storage volumes within a pool
*/
-int virStoragePoolNumOfVolumes (virStoragePoolPtr pool);
-int virStoragePoolListVolumes (virStoragePoolPtr pool,
+int virStoragePoolNumOfVolumes (virStoragePoolPtr pool);
+int virStoragePoolListVolumes (virStoragePoolPtr pool,
char **const names,
int maxnames);
-virConnectPtr virStorageVolGetConnect (virStorageVolPtr vol);
+virConnectPtr virStorageVolGetConnect (virStorageVolPtr vol);
/*
* Lookup volumes based on various attributes
*/
-virStorageVolPtr virStorageVolLookupByName (virStoragePoolPtr pool,
+virStorageVolPtr virStorageVolLookupByName (virStoragePoolPtr pool,
const char *name);
-virStorageVolPtr virStorageVolLookupByKey (virConnectPtr conn,
+virStorageVolPtr virStorageVolLookupByKey (virConnectPtr conn,
const char *key);
-virStorageVolPtr virStorageVolLookupByPath (virConnectPtr conn,
+virStorageVolPtr virStorageVolLookupByPath (virConnectPtr conn,
const char *path);
-const char* virStorageVolGetName (virStorageVolPtr vol);
-const char* virStorageVolGetKey (virStorageVolPtr vol);
+const char* virStorageVolGetName (virStorageVolPtr vol);
+const char* virStorageVolGetKey (virStorageVolPtr vol);
-virStorageVolPtr virStorageVolCreateXML (virStoragePoolPtr pool,
+virStorageVolPtr virStorageVolCreateXML (virStoragePoolPtr pool,
const char *xmldesc,
unsigned int flags);
-int virStorageVolDelete (virStorageVolPtr vol,
+int virStorageVolDelete (virStorageVolPtr vol,
unsigned int flags);
-int virStorageVolFree (virStorageVolPtr vol);
+int virStorageVolFree (virStorageVolPtr vol);
-int virStorageVolGetInfo (virStorageVolPtr vol,
+int virStorageVolGetInfo (virStorageVolPtr vol,
virStorageVolInfoPtr info);
-char * virStorageVolGetXMLDesc (virStorageVolPtr pool,
+char * virStorageVolGetXMLDesc (virStorageVolPtr pool,
unsigned int flags);
-char * virStorageVolGetPath (virStorageVolPtr vol);
+char * virStorageVolGetPath (virStorageVolPtr vol);
#ifdef __cplusplus
}
diff --git a/src/driver.h b/src/driver.h
index 12073419e1..ebdd637e0b 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -225,6 +225,13 @@ typedef int
const char *path,
struct _virDomainInterfaceStats *stats);
+typedef int
+ (*virDrvDomainBlockPeek)
+ (virDomainPtr domain,
+ const char *path,
+ unsigned long long offset, size_t size,
+ void *buffer);
+
typedef int
(*virDrvDomainMigratePrepare)
(virConnectPtr dconn,
@@ -337,6 +344,7 @@ struct _virDriver {
virDrvDomainMigrateFinish domainMigrateFinish;
virDrvDomainBlockStats domainBlockStats;
virDrvDomainInterfaceStats domainInterfaceStats;
+ virDrvDomainBlockPeek domainBlockPeek;
virDrvNodeGetCellsFreeMemory nodeGetCellsFreeMemory;
virDrvNodeGetFreeMemory getFreeMemory;
};
diff --git a/src/libvirt.c b/src/libvirt.c
index d0d5473001..3e349e1faa 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -2586,7 +2586,84 @@ virDomainInterfaceStats (virDomainPtr dom, const char *path,
return -1;
}
+/**
+ * virDomainBlockPeek:
+ * @dom: pointer to the domain object
+ * @path: path to the block device
+ * @offset: offset within block device
+ * @size: size to read
+ * @buffer: return buffer (must be at least size bytes)
+ * @flags: unused, always pass 0
+ *
+ * This function allows you to read the contents of a domain's
+ * disk device.
+ *
+ * Typical uses for this are to determine if the domain has
+ * written a Master Boot Record (indicating that the domain
+ * has completed installation), or to try to work out the state
+ * of the domain's filesystems.
+ *
+ * (Note that in the local case you might try to open the
+ * block device or file directly, but that won't work in the
+ * remote case, nor if you don't have sufficient permission.
+ * Hence the need for this call).
+ *
+ * 'path' must be a device or file corresponding to the domain.
+ * In other words it must be the precise string returned in
+ * a from
+ * virDomainGetXMLDesc.
+ *
+ * 'offset' and 'size' represent an area which must lie entirely
+ * within the device or file. 'size' may be 0 to test if the
+ * call would succeed.
+ *
+ * 'buffer' is the return buffer and must be at least 'size' bytes.
+ *
+ * Returns: 0 in case of success or -1 in case of failure.
+ */
+int
+virDomainBlockPeek (virDomainPtr dom,
+ const char *path,
+ unsigned long long offset /* really 64 bits */,
+ size_t size,
+ void *buffer,
+ unsigned int flags)
+{
+ virConnectPtr conn;
+ DEBUG("domain=%p, path=%s, offset=%lld, size=%zi, buffer=%p",
+ dom, path, offset, size, buffer);
+ if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
+ virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ return -1;
+ }
+ conn = dom->conn;
+
+ if (!path) {
+ virLibDomainError (dom, VIR_ERR_INVALID_ARG,
+ _("path is NULL"));
+ return -1;
+ }
+
+ if (flags != 0) {
+ virLibDomainError (dom, VIR_ERR_INVALID_ARG,
+ _("flags must be zero"));
+ return -1;
+ }
+
+ /* Allow size == 0 as an access test. */
+ if (size > 0 && !buffer) {
+ virLibDomainError (dom, VIR_ERR_INVALID_ARG,
+ _("buffer is NULL"));
+ return -1;
+ }
+
+ if (conn->driver->domainBlockPeek)
+ return conn->driver->domainBlockPeek (dom, path, offset, size, buffer);
+
+ virLibDomainError (dom, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
/************************************************************************
diff --git a/src/libvirt_sym.version b/src/libvirt_sym.version
index bd2ad1f5df..0ddf6bf68c 100644
--- a/src/libvirt_sym.version
+++ b/src/libvirt_sym.version
@@ -73,6 +73,7 @@
virDomainSetSchedulerParameters;
virDomainBlockStats;
virDomainInterfaceStats;
+ virDomainBlockPeek;
virDomainAttachDevice;
virDomainDetachDevice;
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index 91c1c5f1b1..c928027fb3 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -3521,6 +3521,7 @@ static virDriver qemuDriver = {
NULL, /* domainMigrateFinish */
qemudDomainBlockStats, /* domainBlockStats */
qemudDomainInterfaceStats, /* domainInterfaceStats */
+ NULL, /* domainBlockPeek */
#if HAVE_NUMACTL
qemudNodeGetCellsFreeMemory, /* nodeGetCellsFreeMemory */
qemudNodeGetFreeMemory, /* getFreeMemory */
diff --git a/src/test.c b/src/test.c
index ceb71d5438..32e88bde12 100644
--- a/src/test.c
+++ b/src/test.c
@@ -2060,6 +2060,7 @@ static virDriver testDriver = {
NULL, /* domainMigrateFinish */
NULL, /* domainBlockStats */
NULL, /* domainInterfaceStats */
+ NULL, /* domainBlockPeek */
testNodeGetCellsFreeMemory, /* nodeGetCellsFreeMemory */
NULL, /* getFreeMemory */
};
diff --git a/src/xen_unified.c b/src/xen_unified.c
index 6829e01434..b77a0ecfd9 100644
--- a/src/xen_unified.c
+++ b/src/xen_unified.c
@@ -1234,6 +1234,29 @@ xenUnifiedDomainInterfaceStats (virDomainPtr dom, const char *path,
return -1;
}
+static int
+xenUnifiedDomainBlockPeek (virDomainPtr dom, const char *path,
+ unsigned long long offset, size_t size,
+ void *buffer)
+{
+ int r;
+ GET_PRIVATE (dom->conn);
+
+ if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
+ r = xenDaemonDomainBlockPeek (dom, path, offset, size, buffer);
+ if (r != -2) return r;
+ /* r == -2 means declined, so fall through to XM driver ... */
+ }
+
+ if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
+ if (xenXMDomainBlockPeek (dom, path, offset, size, buffer) == 0)
+ return 0;
+ }
+
+ xenUnifiedError (dom->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
+
static int
xenUnifiedNodeGetCellsFreeMemory (virConnectPtr conn, unsigned long long *freeMems,
int startCell, int maxCells)
@@ -1329,6 +1352,7 @@ static virDriver xenUnifiedDriver = {
.domainMigrateFinish = xenUnifiedDomainMigrateFinish,
.domainBlockStats = xenUnifiedDomainBlockStats,
.domainInterfaceStats = xenUnifiedDomainInterfaceStats,
+ .domainBlockPeek = xenUnifiedDomainBlockPeek,
.nodeGetCellsFreeMemory = xenUnifiedNodeGetCellsFreeMemory,
.getFreeMemory = xenUnifiedNodeGetFreeMemory,
};
diff --git a/src/xend_internal.c b/src/xend_internal.c
index ce80c407f7..3cb1a3bde7 100644
--- a/src/xend_internal.c
+++ b/src/xend_internal.c
@@ -18,6 +18,8 @@
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -1705,6 +1707,219 @@ error:
return ret;
}
+typedef int
+ (*sexp_blockdevs_cb)
+ (virConnectPtr conn, void *data,
+ int isBlock, int cdrom, int isNoSrcCdrom, int hvm,
+ const char *drvName, const char *drvType,
+ const char *src, const char *dst,
+ const char *mode);
+
+/**
+ * xend_parse_sexp_blockdevs:
+ * @conn: connection
+ * @root: root sexpr
+ * @xendConfigVersion: version of xend
+ * @fn: callback function
+ * @data: optional data for callback function
+ *
+ * This parses out block devices from the domain sexpr and calls
+ * fn (conn, data, ...) for each block device found.
+ *
+ * Returns 0 if successful or -1 if failed.
+ */
+static int
+xend_parse_sexp_blockdevs (virConnectPtr conn, struct sexpr *root,
+ int xendConfigVersion,
+ sexp_blockdevs_cb fn, void *data)
+{
+ struct sexpr *cur, *node;
+ int hvm;
+
+ hvm = sexpr_lookup(root, "domain/image/hvm") ? 1 : 0;
+
+ for (cur = root; cur->kind == SEXPR_CONS; cur = cur->u.s.cdr) {
+ node = cur->u.s.car;
+ /* Normally disks are in a (device (vbd ...)) block
+ but blktap disks ended up in a differently named
+ (device (tap ....)) block.... */
+ if (sexpr_lookup(node, "device/vbd") ||
+ sexpr_lookup(node, "device/tap")) {
+ char *offset;
+ int ret = -1;
+ int isBlock = 0;
+ int cdrom = 0;
+ int isNoSrcCdrom = 0;
+ char *drvName = NULL;
+ char *drvType = NULL;
+ const char *src = NULL;
+ const char *dst = NULL;
+ const char *mode = NULL;
+
+ /* Again dealing with (vbd...) vs (tap ...) differences */
+ if (sexpr_lookup(node, "device/vbd")) {
+ src = sexpr_node(node, "device/vbd/uname");
+ dst = sexpr_node(node, "device/vbd/dev");
+ mode = sexpr_node(node, "device/vbd/mode");
+ } else {
+ src = sexpr_node(node, "device/tap/uname");
+ dst = sexpr_node(node, "device/tap/dev");
+ mode = sexpr_node(node, "device/tap/mode");
+ }
+
+ if (dst == NULL) {
+ virXendError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("domain information incomplete, vbd has no dev"));
+ goto bad_parse;
+ }
+
+ if (src == NULL) {
+ /* There is a case without the uname to the CD-ROM device */
+ offset = strchr(dst, ':');
+ if (offset) {
+ if (hvm && STREQ(offset, ":cdrom")) {
+ isNoSrcCdrom = 1;
+ }
+ offset[0] = '\0';
+ }
+ if (!isNoSrcCdrom) {
+ virXendError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("domain information incomplete, vbd has no src"));
+ goto bad_parse;
+ }
+ }
+
+ if (!isNoSrcCdrom) {
+ offset = strchr(src, ':');
+ if (!offset) {
+ virXendError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse vbd filename, missing driver name"));
+ goto bad_parse;
+ }
+
+ if (VIR_ALLOC_N(drvName, (offset-src)+1) < 0) {
+ virXendError(conn, VIR_ERR_NO_MEMORY,
+ _("allocate new buffer"));
+ goto bad_parse;
+ }
+ strncpy(drvName, src, (offset-src));
+ drvName[offset-src] = '\0';
+
+ src = offset + 1;
+
+ if (STREQ (drvName, "tap")) {
+ offset = strchr(src, ':');
+ if (!offset) {
+ virXendError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse vbd filename, missing driver type"));
+ goto bad_parse;
+ }
+
+ if (VIR_ALLOC_N(drvType, (offset-src)+1)< 0) {
+ virXendError(conn, VIR_ERR_NO_MEMORY,
+ _("allocate new buffer"));
+ goto bad_parse;
+ }
+ strncpy(drvType, src, (offset-src));
+ drvType[offset-src] = '\0';
+ src = offset + 1;
+ /* Its possible to use blktap driver for block devs
+ too, but kinda pointless because blkback is better,
+ so we assume common case here. If blktap becomes
+ omnipotent, we can revisit this, perhaps stat()'ing
+ the src file in question */
+ isBlock = 0;
+ } else if (STREQ(drvName, "phy")) {
+ isBlock = 1;
+ } else if (STREQ(drvName, "file")) {
+ isBlock = 0;
+ }
+ }
+
+ if (STREQLEN (dst, "ioemu:", 6))
+ dst += 6;
+
+ /* New style disk config from Xen >= 3.0.3 */
+ if (xendConfigVersion > 1) {
+ offset = strrchr(dst, ':');
+ if (offset) {
+ if (STREQ (offset, ":cdrom")) {
+ cdrom = 1;
+ } else if (STREQ (offset, ":disk")) {
+ /* The default anyway */
+ } else {
+ /* Unknown, lets pretend its a disk too */
+ }
+ offset[0] = '\0';
+ }
+ }
+
+ /* Call the callback function. */
+ ret = fn (conn, data, isBlock, cdrom, isNoSrcCdrom, hvm,
+ drvName, drvType, src, dst, mode);
+
+ bad_parse:
+ VIR_FREE(drvName);
+ VIR_FREE(drvType);
+
+ if (ret == -1) return -1;
+ }
+ }
+
+ return 0;
+}
+
+static int
+xend_parse_sexp_desc_blockdev (virConnectPtr conn ATTRIBUTE_UNUSED,
+ void *data,
+ int isBlock, int cdrom, int isNoSrcCdrom,
+ int hvm,
+ const char *drvName, const char *drvType,
+ const char *src, const char *dst,
+ const char *mode)
+{
+ virBuffer *buf = (virBuffer *) data;
+ const char *bus = NULL;
+
+ if (!isNoSrcCdrom) {
+ virBufferVSprintf(buf, " \n",
+ isBlock ? "block" : "file",
+ cdrom ? "cdrom" : "disk");
+ if (drvType) {
+ virBufferVSprintf(buf, " \n", drvName, drvType);
+ } else {
+ virBufferVSprintf(buf, " \n", drvName);
+ }
+ if (isBlock) {
+ virBufferVSprintf(buf, " \n", src);
+ } else {
+ virBufferVSprintf(buf, " \n", src);
+ }
+ } else {
+ /* This case is the cdrom device only */
+ virBufferAddLit(buf, " \n");
+ }
+ if (STRPREFIX(dst, "xvd") || !hvm) {
+ bus = "xen";
+ } else if (STRPREFIX(dst, "sd")) {
+ bus = "scsi";
+ } else {
+ bus = "ide";
+ }
+ virBufferVSprintf(buf, " \n",
+ dst, bus);
+
+ /* XXX should we force mode == r, if cdrom==1, or assume
+ xend has already done this ? */
+ if ((mode != NULL) && (STREQ (mode, "r")))
+ virBufferAddLit(buf, " \n");
+ else if ((mode != NULL) && (STREQ (mode, "w!")))
+ virBufferAddLit(buf, " \n");
+ virBufferAddLit(buf, " \n");
+
+ return 0;
+}
+
/**
* xend_parse_sexp_desc:
* @conn: the connection associated with the XML
@@ -1849,164 +2064,15 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root,
if ((tmp != NULL) && (tmp[0] != 0))
virBufferVSprintf(&buf, " %s\n", tmp);
+ /* append block devices */
+ if (xend_parse_sexp_blockdevs (conn, root, xendConfigVersion,
+ xend_parse_sexp_desc_blockdev, &buf) == -1)
+ goto error;
+
+ /* append network devices and framebuffer */
for (cur = root; cur->kind == SEXPR_CONS; cur = cur->u.s.cdr) {
node = cur->u.s.car;
- /* Normally disks are in a (device (vbd ...)) block
- but blktap disks ended up in a differently named
- (device (tap ....)) block.... */
- if (sexpr_lookup(node, "device/vbd") ||
- sexpr_lookup(node, "device/tap")) {
- char *offset;
- int isBlock = 0;
- int cdrom = 0;
- int isNoSrcCdrom = 0;
- char *drvName = NULL;
- char *drvType = NULL;
- const char *src = NULL;
- const char *dst = NULL;
- const char *mode = NULL;
- const char *bus = NULL;
-
- /* Again dealing with (vbd...) vs (tap ...) differences */
- if (sexpr_lookup(node, "device/vbd")) {
- src = sexpr_node(node, "device/vbd/uname");
- dst = sexpr_node(node, "device/vbd/dev");
- mode = sexpr_node(node, "device/vbd/mode");
- } else {
- src = sexpr_node(node, "device/tap/uname");
- dst = sexpr_node(node, "device/tap/dev");
- mode = sexpr_node(node, "device/tap/mode");
- }
-
- if (dst == NULL) {
- virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, vbd has no dev"));
- goto bad_parse;
- }
-
- if (src == NULL) {
- /* There is a case without the uname to the CD-ROM device */
- offset = strchr(dst, ':');
- if (offset) {
- if (hvm && STREQ( offset , ":cdrom")) {
- isNoSrcCdrom = 1;
- }
- offset[0] = '\0';
- }
- if (!isNoSrcCdrom) {
- virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, vbd has no src"));
- goto bad_parse;
- }
- }
-
- if (!isNoSrcCdrom) {
- offset = strchr(src, ':');
- if (!offset) {
- virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("cannot parse vbd filename, missing driver name"));
- goto bad_parse;
- }
-
- if (VIR_ALLOC_N(drvName, (offset-src)+1) < 0) {
- virXendError(conn, VIR_ERR_NO_MEMORY,
- _("allocate new buffer"));
- goto bad_parse;
- }
- strncpy(drvName, src, (offset-src));
- drvName[offset-src] = '\0';
-
- src = offset + 1;
-
- if (STREQ(drvName, "tap")) {
- offset = strchr(src, ':');
- if (!offset) {
- virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("cannot parse vbd filename, missing driver type"));
- goto bad_parse;
- }
-
- if (VIR_ALLOC_N(drvType, (offset-src)+1)< 0) {
- virXendError(conn, VIR_ERR_NO_MEMORY,
- _("allocate new buffer"));
- goto bad_parse;
- }
- strncpy(drvType, src, (offset-src));
- drvType[offset-src] = '\0';
- src = offset + 1;
- /* Its possible to use blktap driver for block devs
- too, but kinda pointless because blkback is better,
- so we assume common case here. If blktap becomes
- omnipotent, we can revisit this, perhaps stat()'ing
- the src file in question */
- isBlock = 0;
- } else if (STREQ(drvName, "phy")) {
- isBlock = 1;
- } else if (STREQ(drvName, "file")) {
- isBlock = 0;
- }
- }
-
- if (STRPREFIX(dst, "ioemu:"))
- dst += 6;
-
- /* New style disk config from Xen >= 3.0.3 */
- if (xendConfigVersion > 1) {
- offset = strrchr(dst, ':');
- if (offset) {
- if (STREQ(offset, ":cdrom")) {
- cdrom = 1;
- } else if (STREQ(offset, ":disk")) {
- /* The default anyway */
- } else {
- /* Unknown, lets pretend its a disk too */
- }
- offset[0] = '\0';
- }
- }
-
- if (!isNoSrcCdrom) {
- virBufferVSprintf(&buf, " \n",
- isBlock ? "block" : "file",
- cdrom ? "cdrom" : "disk");
- if (drvType) {
- virBufferVSprintf(&buf, " \n", drvName, drvType);
- } else {
- virBufferVSprintf(&buf, " \n", drvName);
- }
- if (isBlock) {
- virBufferVSprintf(&buf, " \n", src);
- } else {
- virBufferVSprintf(&buf, " \n", src);
- }
- } else {
- /* This case is the cdrom device only */
- virBufferAddLit(&buf, " \n");
- }
-
- if (STRPREFIX(dst, "xvd") || !hvm) {
- bus = "xen";
- } else if (STRPREFIX(dst, "sd")) {
- bus = "scsi";
- } else {
- bus = "ide";
- }
- virBufferVSprintf(&buf, " \n",
- dst, bus);
-
-
- /* XXX should we force mode == r, if cdrom==1, or assume
- xend has already done this ? */
- if ((mode != NULL) && (STREQ(mode, "r")))
- virBufferAddLit(&buf, " \n");
- else if ((mode != NULL) && (STREQ(mode, "w!")))
- virBufferAddLit(&buf, " \n");
- virBufferAddLit(&buf, " \n");
-
- bad_parse:
- VIR_FREE(drvName);
- VIR_FREE(drvType);
- } else if (sexpr_lookup(node, "device/vif")) {
+ if (sexpr_lookup(node, "device/vif")) {
const char *tmp2, *model;
tmp2 = sexpr_node(node, "device/vif/script");
tmp = sexpr_node(node, "device/vif/bridge");
@@ -4433,5 +4499,110 @@ error:
return (ret);
}
+struct check_path_data {
+ const char *path;
+ int ok;
+};
+
+static int
+check_path (virConnectPtr conn ATTRIBUTE_UNUSED, void *vp,
+ int isBlock ATTRIBUTE_UNUSED,
+ int cdrom, int isNoSrcCdrom,
+ int hvm ATTRIBUTE_UNUSED,
+ const char *drvName ATTRIBUTE_UNUSED,
+ const char *drvType ATTRIBUTE_UNUSED,
+ const char *src, const char *dst ATTRIBUTE_UNUSED,
+ const char *mode ATTRIBUTE_UNUSED)
+{
+ struct check_path_data *data = (struct check_path_data *) vp;
+
+ if (!isNoSrcCdrom && !cdrom && src && STREQ (src, data->path))
+ data->ok = 1;
+
+ return 0;
+}
+
+/**
+ * xenDaemonDomainBlockPeek:
+ * @dom: domain object
+ * @path: path to the file or device
+ * @offset: offset
+ * @size: size
+ * @buffer: return buffer
+ *
+ * Returns 0 if successful, -1 if error, -2 if declined.
+ */
+int
+xenDaemonDomainBlockPeek (virDomainPtr domain, const char *path,
+ unsigned long long offset, size_t size,
+ void *buffer)
+{
+ xenUnifiedPrivatePtr priv;
+ struct sexpr *root;
+ struct check_path_data data;
+ int fd, ret = -1;
+ struct stat statbuf;
+
+ priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
+
+ if (domain->id < 0 && priv->xendConfigVersion < 3)
+ return -2; /* Decline, allow XM to handle it. */
+
+ /* Security check: The path must correspond to a block device. */
+ if (domain->id > 0)
+ root = sexpr_get (domain->conn, "/xend/domain/%d?detail=1",
+ domain->id);
+ else if (domain->id < 0)
+ root = sexpr_get (domain->conn, "/xend/domain/%s?detail=1",
+ domain->name);
+ else {
+ /* This call always fails for dom0. */
+ virXendError (domain->conn, VIR_ERR_NO_SUPPORT,
+ _("domainBlockPeek is not supported for dom0"));
+ return -1;
+ }
+
+ if (!root) {
+ virXendError (domain->conn, VIR_ERR_XEN_CALL, __FUNCTION__);
+ return -1;
+ }
+
+ data.path = path;
+ data.ok = 0;
+
+ if (xend_parse_sexp_blockdevs (domain->conn, root,
+ priv->xendConfigVersion,
+ check_path, &data) == -1)
+ return -1;
+
+ if (!data.ok) {
+ virXendError (domain->conn, VIR_ERR_INVALID_ARG,
+ _("invalid path"));
+ return -1;
+ }
+
+ /* The path is correct, now try to open it and get its size. */
+ fd = open (path, O_RDONLY);
+ if (fd == -1 || fstat (fd, &statbuf) == -1) {
+ virXendError (domain->conn, VIR_ERR_SYSTEM_ERROR, strerror (errno));
+ goto done;
+ }
+
+ /* Seek and read. */
+ /* NB. Because we configure with AC_SYS_LARGEFILE, off_t should
+ * be 64 bits on all platforms.
+ */
+ if (lseek (fd, offset, SEEK_SET) == (off_t) -1 ||
+ saferead (fd, buffer, size) == (ssize_t) -1) {
+ virXendError (domain->conn, VIR_ERR_SYSTEM_ERROR, strerror (errno));
+ goto done;
+ }
+
+ ret = 0;
+ done:
+ if (fd >= 0) close (fd);
+ return ret;
+}
+
#endif /* ! PROXY */
#endif /* WITH_XEN */
diff --git a/src/xend_internal.h b/src/xend_internal.h
index 97f98f2378..c24630a69c 100644
--- a/src/xend_internal.h
+++ b/src/xend_internal.h
@@ -244,6 +244,8 @@ virDomainPtr xenDaemonLookupByName(virConnectPtr conn, const char *domname);
int xenDaemonDomainMigratePrepare (virConnectPtr dconn, char **cookie, int *cookielen, const char *uri_in, char **uri_out, unsigned long flags, const char *dname, unsigned long resource);
int xenDaemonDomainMigratePerform (virDomainPtr domain, const char *cookie, int cookielen, const char *uri, unsigned long flags, const char *dname, unsigned long resource);
+int xenDaemonDomainBlockPeek (virDomainPtr domain, const char *path, unsigned long long offset, size_t size, void *buffer);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/xm_internal.c b/src/xm_internal.c
index bee178052e..ea7b6e102c 100644
--- a/src/xm_internal.c
+++ b/src/xm_internal.c
@@ -3241,4 +3241,15 @@ xenXMDomainDetachDevice(virDomainPtr domain, const char *xml) {
return (ret);
}
+int
+xenXMDomainBlockPeek (virDomainPtr dom,
+ const char *path ATTRIBUTE_UNUSED,
+ unsigned long long offset ATTRIBUTE_UNUSED,
+ size_t size ATTRIBUTE_UNUSED,
+ void *buffer ATTRIBUTE_UNUSED)
+{
+ xenXMError (dom->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
+
#endif /* WITH_XEN */
diff --git a/src/xm_internal.h b/src/xm_internal.h
index 6445b7465f..7b1f6aae5d 100644
--- a/src/xm_internal.h
+++ b/src/xm_internal.h
@@ -60,6 +60,7 @@ int xenXMDomainUndefine(virDomainPtr domain);
virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml);
char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf);
+int xenXMDomainBlockPeek (virDomainPtr dom, const char *path, unsigned long long offset, size_t size, void *buffer);
#ifdef __cplusplus
}
diff --git a/tests/sexpr2xmldata/sexpr2xml-curmem.xml b/tests/sexpr2xmldata/sexpr2xml-curmem.xml
index bf1907d425..59bd3d4a85 100644
--- a/tests/sexpr2xmldata/sexpr2xml-curmem.xml
+++ b/tests/sexpr2xmldata/sexpr2xml-curmem.xml
@@ -15,17 +15,17 @@
restart
restart
+
+
+
+
+
-
-
-
-
-
diff --git a/tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml b/tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml
index 4c81746f25..946a8d218c 100644
--- a/tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml
+++ b/tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml
@@ -20,11 +20,6 @@
/usr/lib/xen/bin/qemu-dm
-
-
-
-
-
@@ -34,6 +29,11 @@
+
+
+
+
+