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 + + + + +