2006-01-12 15:38:07 +00:00
|
|
|
/*
|
|
|
|
* xend_internal.c: access to Xen though the Xen Daemon interface
|
|
|
|
*
|
2010-03-01 23:38:28 +00:00
|
|
|
* Copyright (C) 2010 Red Hat, Inc.
|
|
|
|
* Copyright (C) 2005 Anthony Liguori <aliguori@us.ibm.com>
|
2006-01-12 15:38:07 +00:00
|
|
|
*
|
|
|
|
* This file is subject to the terms and conditions of the GNU Lesser General
|
|
|
|
* Public License. See the file COPYING.LIB in the main directory of this
|
|
|
|
* archive for more details.
|
|
|
|
*/
|
|
|
|
|
2008-01-29 18:15:54 +00:00
|
|
|
#include <config.h>
|
2007-08-21 09:31:12 +00:00
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <sys/un.h>
|
|
|
|
#include <sys/errno.h>
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <fcntl.h>
|
2006-01-12 15:38:07 +00:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <math.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <netinet/in.h>
|
|
|
|
#include <netinet/tcp.h>
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
#include <netdb.h>
|
2006-03-22 13:44:01 +00:00
|
|
|
#include <libxml/uri.h>
|
2007-06-15 15:24:20 +00:00
|
|
|
#include <errno.h>
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2008-11-04 22:30:33 +00:00
|
|
|
#include "virterror_internal.h"
|
2008-11-06 16:36:07 +00:00
|
|
|
#include "logging.h"
|
2008-11-04 23:22:06 +00:00
|
|
|
#include "datatypes.h"
|
2008-07-25 13:17:27 +00:00
|
|
|
#include "xend_internal.h"
|
2006-03-22 13:44:01 +00:00
|
|
|
#include "driver.h"
|
2008-02-08 09:15:16 +00:00
|
|
|
#include "util.h"
|
2006-01-12 15:38:07 +00:00
|
|
|
#include "sexpr.h"
|
2007-06-26 22:33:22 +00:00
|
|
|
#include "buf.h"
|
2007-08-09 20:19:12 +00:00
|
|
|
#include "uuid.h"
|
Move xen driver code into src/xen/ directory
* src/Makefile.am, src/proxy_internal.c, src/proxy_internal.h
src/sexpr.c, src/sexpr.h, src/xen_unified.c, src/xen_unified.h,
src/xen_internal.c, src/xen_internal.h, src/xen_inotify.c,
src/xen_inotify.h, src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h, src/xs_internal.c,
src/xs_internal.h: Move to src/xen/ directory
* proxy/Makefile.am, proxy/libvirt_proxy.c, src/Makefile.am,
src/libvirt.c, tests/sexpr2xmltest.c, tests/statstest.c,
tests/xencapstest.c, tests/xmconfigtest.c, tests/xml2sexprtest.c:
Adapt to changed xen location
* src/stats_linux.h, src/stats_linux.c: Remove xen specific block
stats APIs
* src/qemu_driver.c, src/uml_driver.c: Add missing sys/un.h include
uncovered after change to stats_linux.h
* src/xen/block_stats.h, src/xen/block_stats.c: Add xen specific
block stats APIs
2009-09-15 15:38:33 +00:00
|
|
|
#include "xen_driver.h"
|
|
|
|
#include "xen_hypervisor.h"
|
2006-08-08 20:14:40 +00:00
|
|
|
#include "xs_internal.h" /* To extract VNC port & Serial console TTY */
|
2008-05-29 19:20:22 +00:00
|
|
|
#include "memory.h"
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2007-03-15 07:43:16 +00:00
|
|
|
/* required for cpumap_t */
|
|
|
|
#include <xen/dom0_ops.h>
|
|
|
|
|
2009-01-20 17:13:33 +00:00
|
|
|
#define VIR_FROM_THIS VIR_FROM_XEND
|
|
|
|
|
2006-07-20 13:59:23 +00:00
|
|
|
#ifndef PROXY
|
2008-03-24 09:23:32 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* The number of Xen scheduler parameters
|
|
|
|
*/
|
2010-03-09 18:22:22 +00:00
|
|
|
# define XEN_SCHED_SEDF_NPARAM 6
|
|
|
|
# define XEN_SCHED_CRED_NPARAM 2
|
2008-03-24 09:23:32 +00:00
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#endif /* PROXY */
|
2006-03-29 12:46:03 +00:00
|
|
|
|
2009-01-19 18:12:00 +00:00
|
|
|
#ifdef WITH_RHEL5_API
|
2010-03-09 18:22:22 +00:00
|
|
|
# define XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU 0
|
|
|
|
# define XEND_CONFIG_MIN_VERS_PVFB_NEWCONF 2
|
2009-01-19 18:12:00 +00:00
|
|
|
#else
|
2010-03-09 18:22:22 +00:00
|
|
|
# define XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU 3
|
|
|
|
# define XEND_CONFIG_MIN_VERS_PVFB_NEWCONF 3
|
2009-01-19 18:12:00 +00:00
|
|
|
#endif
|
|
|
|
|
2010-06-04 16:04:03 +00:00
|
|
|
#define XEND_RCV_BUF_MAX_LEN 65536
|
2006-02-27 16:27:18 +00:00
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
#ifndef PROXY
|
|
|
|
static int
|
|
|
|
xenDaemonFormatSxprDisk(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainDiskDefPtr def,
|
|
|
|
virBufferPtr buf,
|
|
|
|
int hvm,
|
2008-08-06 11:26:47 +00:00
|
|
|
int xendConfigVersion,
|
|
|
|
int isAttach);
|
2008-07-25 13:17:27 +00:00
|
|
|
static int
|
|
|
|
xenDaemonFormatSxprNet(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainNetDefPtr def,
|
|
|
|
virBufferPtr buf,
|
|
|
|
int hvm,
|
2008-08-06 11:26:47 +00:00
|
|
|
int xendConfigVersion,
|
|
|
|
int isAttach);
|
2008-07-25 13:17:27 +00:00
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonFormatSxprOnePCI(virDomainHostdevDefPtr def,
|
2009-12-22 09:53:51 +00:00
|
|
|
virBufferPtr buf,
|
|
|
|
int detach);
|
2009-04-03 12:38:52 +00:00
|
|
|
|
|
|
|
static int
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainXMLDevID(virDomainPtr domain,
|
|
|
|
virDomainDeviceDefPtr dev,
|
|
|
|
char *class,
|
|
|
|
char *ref,
|
|
|
|
int ref_len);
|
|
|
|
#endif
|
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
#define virXendError(code, ...) \
|
|
|
|
virReportErrorHelper(NULL, VIR_FROM_XEND, code, __FILE__, \
|
2010-03-01 23:38:28 +00:00
|
|
|
__FUNCTION__, __LINE__, __VA_ARGS__)
|
2008-06-09 12:16:03 +00:00
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
#define virXendErrorInt(code, ival) \
|
|
|
|
virXendError(code, "%d", ival)
|
2006-02-27 19:56:23 +00:00
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
/**
|
|
|
|
* do_connect:
|
|
|
|
* @xend: pointer to the Xen Daemon structure
|
|
|
|
*
|
|
|
|
* Internal routine to (re)connect to the daemon
|
|
|
|
*
|
|
|
|
* Returns the socket file descriptor or -1 in case of error
|
|
|
|
*/
|
|
|
|
static int
|
2006-01-13 16:41:01 +00:00
|
|
|
do_connect(virConnectPtr xend)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
int s;
|
|
|
|
int serrno;
|
2006-07-11 16:57:03 +00:00
|
|
|
int no_slow_start = 1;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) xend->privateData;
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2009-01-22 19:41:48 +00:00
|
|
|
s = socket(priv->addrfamily, SOCK_STREAM, priv->addrprotocol);
|
2006-02-27 16:27:18 +00:00
|
|
|
if (s == -1) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("failed to create a socket"));
|
2006-01-12 15:38:07 +00:00
|
|
|
return -1;
|
2006-02-27 16:27:18 +00:00
|
|
|
}
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2006-07-11 16:57:03 +00:00
|
|
|
/*
|
|
|
|
* try to desactivate slow-start
|
|
|
|
*/
|
|
|
|
setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&no_slow_start,
|
|
|
|
sizeof(no_slow_start));
|
|
|
|
|
|
|
|
|
2009-01-22 19:41:48 +00:00
|
|
|
if (connect(s, (struct sockaddr *)&priv->addr, priv->addrlen) == -1) {
|
2006-01-12 15:38:07 +00:00
|
|
|
serrno = errno;
|
|
|
|
close(s);
|
|
|
|
errno = serrno;
|
|
|
|
s = -1;
|
2008-03-17 17:30:48 +00:00
|
|
|
|
|
|
|
/*
|
2009-01-22 17:49:41 +00:00
|
|
|
* Connecting to XenD when privileged is mandatory, so log this
|
|
|
|
* error
|
2008-03-17 17:30:48 +00:00
|
|
|
*/
|
2009-01-22 17:49:41 +00:00
|
|
|
if (xenHavePrivilege()) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("failed to connect to xend"));
|
2007-11-27 14:39:42 +00:00
|
|
|
}
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* wr_sync:
|
2006-11-07 21:52:44 +00:00
|
|
|
* @xend: the xend connection object
|
2006-01-12 15:38:07 +00:00
|
|
|
* @fd: the file descriptor
|
|
|
|
* @buffer: the I/O buffer
|
|
|
|
* @size: the size of the I/O
|
|
|
|
* @do_read: write operation if 0, read operation otherwise
|
|
|
|
*
|
|
|
|
* Do a synchronous read or write on the file descriptor
|
|
|
|
*
|
|
|
|
* Returns the number of bytes exchanged, or -1 in case of error
|
|
|
|
*/
|
|
|
|
static size_t
|
2010-04-02 23:10:49 +00:00
|
|
|
wr_sync(int fd, void *buffer, size_t size, int do_read)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
size_t offset = 0;
|
|
|
|
|
|
|
|
while (offset < size) {
|
|
|
|
ssize_t len;
|
|
|
|
|
|
|
|
if (do_read) {
|
2006-03-15 12:13:25 +00:00
|
|
|
len = read(fd, ((char *) buffer) + offset, size - offset);
|
2006-01-12 15:38:07 +00:00
|
|
|
} else {
|
2006-03-15 12:13:25 +00:00
|
|
|
len = write(fd, ((char *) buffer) + offset, size - offset);
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* recoverable error, retry */
|
|
|
|
if ((len == -1) && ((errno == EAGAIN) || (errno == EINTR))) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* eof */
|
|
|
|
if (len == 0) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* unrecoverable error */
|
|
|
|
if (len == -1) {
|
2006-03-15 12:13:25 +00:00
|
|
|
if (do_read)
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("failed to read from Xen Daemon"));
|
2006-03-15 12:13:25 +00:00
|
|
|
else
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2010-01-15 09:22:08 +00:00
|
|
|
"%s", _("failed to write to Xen Daemon"));
|
2006-03-15 12:13:25 +00:00
|
|
|
|
|
|
|
return (-1);
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
offset += len;
|
|
|
|
}
|
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* sread:
|
|
|
|
* @fd: the file descriptor
|
|
|
|
* @buffer: the I/O buffer
|
|
|
|
* @size: the size of the I/O
|
|
|
|
*
|
|
|
|
* Internal routine to do a synchronous read
|
|
|
|
*
|
|
|
|
* Returns the number of bytes read, or -1 in case of error
|
|
|
|
*/
|
|
|
|
static ssize_t
|
2010-04-02 23:10:49 +00:00
|
|
|
sread(int fd, void *buffer, size_t size)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
2010-04-02 23:10:49 +00:00
|
|
|
return wr_sync(fd, buffer, size, 1);
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* swrite:
|
|
|
|
* @fd: the file descriptor
|
|
|
|
* @buffer: the I/O buffer
|
|
|
|
* @size: the size of the I/O
|
|
|
|
*
|
|
|
|
* Internal routine to do a synchronous write
|
|
|
|
*
|
|
|
|
* Returns the number of bytes written, or -1 in case of error
|
|
|
|
*/
|
|
|
|
static ssize_t
|
2010-04-02 23:10:49 +00:00
|
|
|
swrite(int fd, const void *buffer, size_t size)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
2010-04-02 23:10:49 +00:00
|
|
|
return wr_sync(fd, (void *) buffer, size, 0);
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* swrites:
|
|
|
|
* @fd: the file descriptor
|
|
|
|
* @string: the string to write
|
|
|
|
*
|
|
|
|
* Internal routine to do a synchronous write of a string
|
|
|
|
*
|
|
|
|
* Returns the number of bytes written, or -1 in case of error
|
|
|
|
*/
|
|
|
|
static ssize_t
|
2010-04-02 23:10:49 +00:00
|
|
|
swrites(int fd, const char *string)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
2010-04-02 23:10:49 +00:00
|
|
|
return swrite(fd, string, strlen(string));
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
2006-07-06 09:29:34 +00:00
|
|
|
/**
|
|
|
|
* sreads:
|
|
|
|
* @fd: the file descriptor
|
|
|
|
* @buffer: the I/O buffer
|
|
|
|
* @n_buffer: the size of the I/O buffer
|
|
|
|
*
|
|
|
|
* Internal routine to do a synchronous read of a line
|
|
|
|
*
|
|
|
|
* Returns the number of bytes read, or -1 in case of error
|
|
|
|
*/
|
|
|
|
static ssize_t
|
2010-04-02 23:10:49 +00:00
|
|
|
sreads(int fd, char *buffer, size_t n_buffer)
|
2006-07-06 09:29:34 +00:00
|
|
|
{
|
|
|
|
size_t offset;
|
|
|
|
|
|
|
|
if (n_buffer < 1)
|
|
|
|
return (-1);
|
|
|
|
|
|
|
|
for (offset = 0; offset < (n_buffer - 1); offset++) {
|
|
|
|
ssize_t ret;
|
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
ret = sread(fd, buffer + offset, 1);
|
2006-07-06 09:29:34 +00:00
|
|
|
if (ret == 0)
|
|
|
|
break;
|
|
|
|
else if (ret == -1)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
if (buffer[offset] == '\n') {
|
|
|
|
offset++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
buffer[offset] = 0;
|
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
2006-01-12 15:38:07 +00:00
|
|
|
|
|
|
|
static int
|
|
|
|
istartswith(const char *haystack, const char *needle)
|
|
|
|
{
|
2008-05-14 19:51:24 +00:00
|
|
|
return STRCASEEQLEN(haystack, needle, strlen(needle));
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
2006-03-30 16:37:15 +00:00
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
/**
|
|
|
|
* xend_req:
|
|
|
|
* @fd: the file descriptor
|
|
|
|
* @content: the buffer to store the content
|
|
|
|
*
|
|
|
|
* Read the HTTP response from a Xen Daemon request.
|
2010-06-03 00:07:17 +00:00
|
|
|
* If the response contains content, memory is allocated to
|
|
|
|
* hold the content.
|
2006-01-12 15:38:07 +00:00
|
|
|
*
|
2010-06-03 00:07:17 +00:00
|
|
|
* Returns the HTTP return code and @content is set to the
|
|
|
|
* allocated memory containing HTTP content.
|
2006-01-12 15:38:07 +00:00
|
|
|
*/
|
2010-06-04 16:04:03 +00:00
|
|
|
static int ATTRIBUTE_NONNULL (2)
|
2010-06-03 00:07:17 +00:00
|
|
|
xend_req(int fd, char **content)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
char buffer[4096];
|
2010-06-03 00:07:17 +00:00
|
|
|
int content_length = 0;
|
2006-01-12 15:38:07 +00:00
|
|
|
int retcode = 0;
|
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
while (sreads(fd, buffer, sizeof(buffer)) > 0) {
|
2008-05-14 19:51:24 +00:00
|
|
|
if (STREQ(buffer, "\r\n"))
|
2006-01-12 15:38:07 +00:00
|
|
|
break;
|
2006-07-06 09:29:34 +00:00
|
|
|
|
|
|
|
if (istartswith(buffer, "Content-Length: "))
|
|
|
|
content_length = atoi(buffer + 16);
|
|
|
|
else if (istartswith(buffer, "HTTP/1.1 "))
|
|
|
|
retcode = atoi(buffer + 9);
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
2010-06-03 00:07:17 +00:00
|
|
|
if (content_length > 0) {
|
2006-07-06 09:29:34 +00:00
|
|
|
ssize_t ret;
|
|
|
|
|
2010-06-04 16:04:03 +00:00
|
|
|
if (content_length > XEND_RCV_BUF_MAX_LEN) {
|
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
_("Xend returned HTTP Content-Length of %d, "
|
|
|
|
"which exceeds maximum of %d"),
|
|
|
|
content_length,
|
|
|
|
XEND_RCV_BUF_MAX_LEN);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Allocate one byte beyond the end of the largest buffer we will read.
|
|
|
|
Combined with the fact that VIR_ALLOC_N zeros the returned buffer,
|
|
|
|
this guarantees that "content" will always be NUL-terminated. */
|
|
|
|
if (VIR_ALLOC_N(*content, content_length + 1) < 0 ) {
|
2010-06-03 00:07:17 +00:00
|
|
|
virReportOOMError();
|
|
|
|
return -1;
|
|
|
|
}
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2010-06-03 00:07:17 +00:00
|
|
|
ret = sread(fd, *content, content_length);
|
2006-07-06 09:29:34 +00:00
|
|
|
if (ret < 0)
|
|
|
|
return -1;
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return retcode;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xend_get:
|
|
|
|
* @xend: pointer to the Xen Daemon structure
|
|
|
|
* @path: the path used for the HTTP request
|
|
|
|
* @content: the buffer to store the content
|
|
|
|
*
|
|
|
|
* Do an HTTP GET RPC with the Xen Daemon
|
|
|
|
*
|
|
|
|
* Returns the HTTP return code or -1 in case or error.
|
|
|
|
*/
|
2010-06-04 16:04:03 +00:00
|
|
|
static int ATTRIBUTE_NONNULL(3)
|
2006-01-13 16:41:01 +00:00
|
|
|
xend_get(virConnectPtr xend, const char *path,
|
2010-06-03 00:07:17 +00:00
|
|
|
char **content)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
int s = do_connect(xend);
|
|
|
|
|
|
|
|
if (s == -1)
|
|
|
|
return s;
|
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
swrites(s, "GET ");
|
|
|
|
swrites(s, path);
|
|
|
|
swrites(s, " HTTP/1.1\r\n");
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
swrites(s,
|
2006-01-12 15:38:07 +00:00
|
|
|
"Host: localhost:8000\r\n"
|
|
|
|
"Accept-Encoding: identity\r\n"
|
|
|
|
"Content-Type: application/x-www-form-urlencoded\r\n" "\r\n");
|
|
|
|
|
2010-06-03 00:07:17 +00:00
|
|
|
ret = xend_req(s, content);
|
2006-01-12 15:38:07 +00:00
|
|
|
close(s);
|
|
|
|
|
2006-10-31 10:25:13 +00:00
|
|
|
if (((ret < 0) || (ret >= 300)) &&
|
2008-05-15 14:21:34 +00:00
|
|
|
((ret != 404) || (!STRPREFIX(path, "/xend/domain/")))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_GET_FAILED,
|
2009-01-15 15:17:53 +00:00
|
|
|
_("%d status from xen daemon: %s:%s"),
|
2010-06-04 16:04:03 +00:00
|
|
|
ret, path, NULLSTR(*content));
|
2006-02-27 16:27:18 +00:00
|
|
|
}
|
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#ifndef PROXY
|
2006-01-12 15:38:07 +00:00
|
|
|
/**
|
|
|
|
* xend_post:
|
|
|
|
* @xend: pointer to the Xen Daemon structure
|
|
|
|
* @path: the path used for the HTTP request
|
2006-07-19 22:24:37 +00:00
|
|
|
* @ops: the information sent for the POST
|
2006-01-12 15:38:07 +00:00
|
|
|
*
|
|
|
|
* Do an HTTP POST RPC with the Xen Daemon, this usually makes changes at the
|
|
|
|
* Xen level.
|
|
|
|
*
|
|
|
|
* Returns the HTTP return code or -1 in case or error.
|
|
|
|
*/
|
|
|
|
static int
|
2010-06-03 00:07:17 +00:00
|
|
|
xend_post(virConnectPtr xend, const char *path, const char *ops)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
char buffer[100];
|
2010-06-03 00:07:17 +00:00
|
|
|
char *err_buf = NULL;
|
2006-01-12 15:38:07 +00:00
|
|
|
int ret;
|
|
|
|
int s = do_connect(xend);
|
|
|
|
|
|
|
|
if (s == -1)
|
|
|
|
return s;
|
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
swrites(s, "POST ");
|
|
|
|
swrites(s, path);
|
|
|
|
swrites(s, " HTTP/1.1\r\n");
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
swrites(s,
|
2006-01-12 15:38:07 +00:00
|
|
|
"Host: localhost:8000\r\n"
|
|
|
|
"Accept-Encoding: identity\r\n"
|
|
|
|
"Content-Type: application/x-www-form-urlencoded\r\n"
|
|
|
|
"Content-Length: ");
|
2006-08-08 22:22:55 +00:00
|
|
|
snprintf(buffer, sizeof(buffer), "%d", (int) strlen(ops));
|
2010-04-02 23:10:49 +00:00
|
|
|
swrites(s, buffer);
|
|
|
|
swrites(s, "\r\n\r\n");
|
|
|
|
swrites(s, ops);
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2010-06-03 00:07:17 +00:00
|
|
|
ret = xend_req(s, &err_buf);
|
2006-01-12 15:38:07 +00:00
|
|
|
close(s);
|
|
|
|
|
2006-02-27 16:27:18 +00:00
|
|
|
if ((ret < 0) || (ret >= 300)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_POST_FAILED,
|
2010-06-03 00:07:17 +00:00
|
|
|
_("xend_post: error from xen daemon: %s"), err_buf);
|
|
|
|
} else if ((ret == 202) && err_buf && (strstr(err_buf, "failed") != NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_POST_FAILED,
|
2010-06-03 00:07:17 +00:00
|
|
|
_("xend_post: error from xen daemon: %s"), err_buf);
|
2007-02-27 15:50:03 +00:00
|
|
|
ret = -1;
|
2010-06-03 00:07:17 +00:00
|
|
|
} else if (((ret >= 200) && (ret <= 202)) && err_buf &&
|
|
|
|
(strstr(err_buf, "xend.err") != NULL)) {
|
2007-03-01 23:24:09 +00:00
|
|
|
/* This is to catch case of things like 'virsh dump Domain-0 foo'
|
|
|
|
* which returns a success code, but the word 'xend.err'
|
|
|
|
* in body to indicate error :-(
|
2007-02-27 15:50:03 +00:00
|
|
|
*/
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_POST_FAILED,
|
2010-06-03 00:07:17 +00:00
|
|
|
_("xend_post: error from xen daemon: %s"), err_buf);
|
2006-04-20 14:28:01 +00:00
|
|
|
ret = -1;
|
2006-02-27 16:27:18 +00:00
|
|
|
}
|
|
|
|
|
2010-06-03 00:07:17 +00:00
|
|
|
VIR_FREE(err_buf);
|
2006-01-12 15:38:07 +00:00
|
|
|
return ret;
|
|
|
|
}
|
2006-08-09 15:21:16 +00:00
|
|
|
#endif /* ! PROXY */
|
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* http2unix:
|
|
|
|
* @ret: the http return code
|
|
|
|
*
|
|
|
|
* Convert the HTTP return code to 0/-1 and set errno if needed
|
|
|
|
*
|
|
|
|
* Return -1 in case of error code 0 otherwise
|
|
|
|
*/
|
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
http2unix(int ret)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
switch (ret) {
|
|
|
|
case -1:
|
|
|
|
break;
|
|
|
|
case 200:
|
|
|
|
case 201:
|
|
|
|
case 202:
|
|
|
|
return 0;
|
|
|
|
case 404:
|
|
|
|
errno = ESRCH;
|
|
|
|
break;
|
2006-08-29 18:12:22 +00:00
|
|
|
case 500:
|
|
|
|
errno = EIO;
|
|
|
|
break;
|
2006-01-12 15:38:07 +00:00
|
|
|
default:
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendErrorInt(VIR_ERR_HTTP_ERROR, ret);
|
2006-01-12 15:38:07 +00:00
|
|
|
errno = EINVAL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#ifndef PROXY
|
2006-01-12 15:38:07 +00:00
|
|
|
/**
|
2008-07-25 09:51:23 +00:00
|
|
|
* xend_op_ext:
|
2006-01-12 15:38:07 +00:00
|
|
|
* @xend: pointer to the Xen Daemon structure
|
|
|
|
* @path: path for the object
|
|
|
|
* @key: the key for the operation
|
|
|
|
* @ap: input values to pass to the operation
|
|
|
|
*
|
|
|
|
* internal routine to run a POST RPC operation to the Xen Daemon
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of failure.
|
|
|
|
*/
|
|
|
|
static int
|
2010-06-03 00:07:17 +00:00
|
|
|
xend_op_ext(virConnectPtr xend, const char *path, const char *key, va_list ap)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
const char *k = key, *v;
|
2008-04-28 15:14:59 +00:00
|
|
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
2007-04-24 13:44:16 +00:00
|
|
|
int ret;
|
2008-04-28 15:14:59 +00:00
|
|
|
char *content;
|
2006-01-12 15:38:07 +00:00
|
|
|
|
|
|
|
while (k) {
|
|
|
|
v = va_arg(ap, const char *);
|
|
|
|
|
2007-04-24 13:44:16 +00:00
|
|
|
virBufferVSprintf(&buf, "%s", k);
|
|
|
|
virBufferVSprintf(&buf, "%s", "=");
|
|
|
|
virBufferVSprintf(&buf, "%s", v);
|
2006-01-12 15:38:07 +00:00
|
|
|
k = va_arg(ap, const char *);
|
|
|
|
|
|
|
|
if (k)
|
2007-04-24 13:44:16 +00:00
|
|
|
virBufferVSprintf(&buf, "%s", "&");
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
2008-04-28 15:14:59 +00:00
|
|
|
if (virBufferError(&buf)) {
|
2009-12-09 23:00:50 +00:00
|
|
|
virBufferFreeAndReset(&buf);
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-04-28 15:14:59 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
content = virBufferContentAndReset(&buf);
|
2010-06-03 00:07:17 +00:00
|
|
|
ret = http2unix(xend_post(xend, path, content));
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(content);
|
2007-04-24 13:44:16 +00:00
|
|
|
|
|
|
|
return ret;
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
/**
|
2008-07-25 09:51:23 +00:00
|
|
|
* xend_op:
|
2006-01-12 15:38:07 +00:00
|
|
|
* @xend: pointer to the Xen Daemon structure
|
|
|
|
* @name: the domain name target of this operation
|
|
|
|
* @key: the key for the operation
|
|
|
|
* @ap: input values to pass to the operation
|
|
|
|
* @...: input values to pass to the operation
|
|
|
|
*
|
|
|
|
* internal routine to run a POST RPC operation to the Xen Daemon targetting
|
|
|
|
* a given domain.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of failure.
|
|
|
|
*/
|
2009-11-30 09:49:05 +00:00
|
|
|
static int ATTRIBUTE_SENTINEL
|
2007-09-29 18:16:26 +00:00
|
|
|
xend_op(virConnectPtr xend, const char *name, const char *key, ...)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
char buffer[1024];
|
|
|
|
va_list ap;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
snprintf(buffer, sizeof(buffer), "/xend/domain/%s", name);
|
|
|
|
|
|
|
|
va_start(ap, key);
|
2010-06-03 00:07:17 +00:00
|
|
|
ret = xend_op_ext(xend, buffer, key, ap);
|
2006-01-12 15:38:07 +00:00
|
|
|
va_end(ap);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#endif /* ! PROXY */
|
2006-01-12 15:38:07 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* sexpr_get:
|
|
|
|
* @xend: pointer to the Xen Daemon structure
|
|
|
|
* @fmt: format string for the path of the operation
|
|
|
|
* @...: extra data to build the path of the operation
|
|
|
|
*
|
|
|
|
* Internal routine to run a simple GET RPC operation to the Xen Daemon
|
|
|
|
*
|
|
|
|
* Returns a parsed S-Expression in case of success, NULL in case of failure
|
|
|
|
*/
|
2007-10-17 10:33:16 +00:00
|
|
|
static struct sexpr *sexpr_get(virConnectPtr xend, const char *fmt, ...)
|
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 15:07:32 +00:00
|
|
|
ATTRIBUTE_FMT_PRINTF(2,3);
|
2007-10-17 10:33:16 +00:00
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
static struct sexpr *
|
2006-01-13 16:41:01 +00:00
|
|
|
sexpr_get(virConnectPtr xend, const char *fmt, ...)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
2010-06-03 00:07:17 +00:00
|
|
|
char *buffer = NULL;
|
2006-01-12 15:38:07 +00:00
|
|
|
char path[1024];
|
|
|
|
va_list ap;
|
|
|
|
int ret;
|
2010-06-03 00:07:17 +00:00
|
|
|
struct sexpr *res = NULL;
|
2006-01-12 15:38:07 +00:00
|
|
|
|
|
|
|
va_start(ap, fmt);
|
|
|
|
vsnprintf(path, sizeof(path), fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
2010-06-03 00:07:17 +00:00
|
|
|
ret = xend_get(xend, path, &buffer);
|
2010-04-02 23:10:49 +00:00
|
|
|
ret = http2unix(ret);
|
2006-01-12 15:38:07 +00:00
|
|
|
if (ret == -1)
|
2010-06-03 00:07:17 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (buffer == NULL)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
res = string2sexpr(buffer);
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2010-06-03 00:07:17 +00:00
|
|
|
cleanup:
|
|
|
|
VIR_FREE(buffer);
|
|
|
|
return res;
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* sexpr_int:
|
|
|
|
* @sexpr: an S-Expression
|
|
|
|
* @name: the name for the value
|
|
|
|
*
|
|
|
|
* convenience function to lookup an int value in the S-Expression
|
|
|
|
*
|
2009-01-29 17:02:00 +00:00
|
|
|
* Returns the value found or 0 if not found (but may not be an error).
|
|
|
|
* This function suffers from the flaw that zero is both a correct
|
|
|
|
* return value and an error indicator: careful!
|
2006-01-12 15:38:07 +00:00
|
|
|
*/
|
|
|
|
static int
|
Adjust sexpr-related interfaces to be const-correct.
* src/sexpr.c (sexpr_cons, append, sexpr_append, sexpr2string)
(sexpr_lookup_key, sexpr_lookup, sexpr_node, sexpr_fmt_node):
Add "const" attribute where appropriate.
* src/xend_internal.c (sexpr_int, sexpr_float, sexpr_u64)
(sexpr_uuid, sexpr_to_xend_domain_info, sexpr_to_xend_node_info)
(sexpr_to_xend_topology_xml, sexpr_to_domain): Likewise.
* src/sexpr.h: Adjust prototypes.
2008-01-21 14:22:15 +00:00
|
|
|
sexpr_int(const struct sexpr *sexpr, const char *name)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
const char *value = sexpr_node(sexpr, name);
|
|
|
|
|
|
|
|
if (value) {
|
|
|
|
return strtol(value, NULL, 0);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
/**
|
|
|
|
* sexpr_float:
|
|
|
|
* @sexpr: an S-Expression
|
|
|
|
* @name: the name for the value
|
|
|
|
*
|
|
|
|
* convenience function to lookup a float value in the S-Expression
|
|
|
|
*
|
|
|
|
* Returns the value found or 0 if not found (but may not be an error)
|
|
|
|
*/
|
|
|
|
static double
|
Adjust sexpr-related interfaces to be const-correct.
* src/sexpr.c (sexpr_cons, append, sexpr_append, sexpr2string)
(sexpr_lookup_key, sexpr_lookup, sexpr_node, sexpr_fmt_node):
Add "const" attribute where appropriate.
* src/xend_internal.c (sexpr_int, sexpr_float, sexpr_u64)
(sexpr_uuid, sexpr_to_xend_domain_info, sexpr_to_xend_node_info)
(sexpr_to_xend_topology_xml, sexpr_to_domain): Likewise.
* src/sexpr.h: Adjust prototypes.
2008-01-21 14:22:15 +00:00
|
|
|
sexpr_float(const struct sexpr *sexpr, const char *name)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
const char *value = sexpr_node(sexpr, name);
|
|
|
|
|
|
|
|
if (value) {
|
|
|
|
return strtod(value, NULL);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* sexpr_u64:
|
|
|
|
* @sexpr: an S-Expression
|
|
|
|
* @name: the name for the value
|
|
|
|
*
|
|
|
|
* convenience function to lookup a 64bits unsigned int value in the
|
|
|
|
* S-Expression
|
|
|
|
*
|
|
|
|
* Returns the value found or 0 if not found (but may not be an error)
|
|
|
|
*/
|
|
|
|
static uint64_t
|
Adjust sexpr-related interfaces to be const-correct.
* src/sexpr.c (sexpr_cons, append, sexpr_append, sexpr2string)
(sexpr_lookup_key, sexpr_lookup, sexpr_node, sexpr_fmt_node):
Add "const" attribute where appropriate.
* src/xend_internal.c (sexpr_int, sexpr_float, sexpr_u64)
(sexpr_uuid, sexpr_to_xend_domain_info, sexpr_to_xend_node_info)
(sexpr_to_xend_topology_xml, sexpr_to_domain): Likewise.
* src/sexpr.h: Adjust prototypes.
2008-01-21 14:22:15 +00:00
|
|
|
sexpr_u64(const struct sexpr *sexpr, const char *name)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
const char *value = sexpr_node(sexpr, name);
|
|
|
|
|
|
|
|
if (value) {
|
|
|
|
return strtoll(value, NULL, 0);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* sexpr_uuid:
|
|
|
|
* @ptr: where to store the UUID, incremented
|
|
|
|
* @sexpr: an S-Expression
|
|
|
|
* @name: the name for the value
|
|
|
|
*
|
|
|
|
* convenience function to lookup an UUID value from the S-Expression
|
|
|
|
*
|
2007-08-09 20:19:12 +00:00
|
|
|
* Returns a -1 on error, 0 on success
|
2006-01-12 15:38:07 +00:00
|
|
|
*/
|
2007-08-09 20:19:12 +00:00
|
|
|
static int
|
Adjust sexpr-related interfaces to be const-correct.
* src/sexpr.c (sexpr_cons, append, sexpr_append, sexpr2string)
(sexpr_lookup_key, sexpr_lookup, sexpr_node, sexpr_fmt_node):
Add "const" attribute where appropriate.
* src/xend_internal.c (sexpr_int, sexpr_float, sexpr_u64)
(sexpr_uuid, sexpr_to_xend_domain_info, sexpr_to_xend_node_info)
(sexpr_to_xend_topology_xml, sexpr_to_domain): Likewise.
* src/sexpr.h: Adjust prototypes.
2008-01-21 14:22:15 +00:00
|
|
|
sexpr_uuid(unsigned char *ptr, const struct sexpr *node, const char *path)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
const char *r = sexpr_node(node, path);
|
2007-08-09 20:19:12 +00:00
|
|
|
if (!r)
|
|
|
|
return -1;
|
|
|
|
return virUUIDParse(r, ptr);
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#ifndef PROXY
|
2006-01-12 15:38:07 +00:00
|
|
|
/**
|
|
|
|
* urlencode:
|
|
|
|
* @string: the input URL
|
|
|
|
*
|
|
|
|
* Encode an URL see RFC 2396 and following
|
|
|
|
*
|
|
|
|
* Returns the new string or NULL in case of error.
|
|
|
|
*/
|
|
|
|
static char *
|
|
|
|
urlencode(const char *string)
|
|
|
|
{
|
|
|
|
size_t len = strlen(string);
|
2008-05-29 19:20:22 +00:00
|
|
|
char *buffer;
|
|
|
|
char *ptr;
|
2006-01-12 15:38:07 +00:00
|
|
|
size_t i;
|
|
|
|
|
2008-05-29 19:20:22 +00:00
|
|
|
if (VIR_ALLOC_N(buffer, len * 3 + 1) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2006-03-15 12:13:25 +00:00
|
|
|
return (NULL);
|
2007-04-24 13:44:16 +00:00
|
|
|
}
|
2008-05-29 19:20:22 +00:00
|
|
|
ptr = buffer;
|
2006-01-12 15:38:07 +00:00
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
switch (string[i]) {
|
|
|
|
case ' ':
|
|
|
|
case '\n':
|
2007-03-23 16:15:07 +00:00
|
|
|
snprintf(ptr, 4, "%%%02x", string[i]);
|
2006-01-12 15:38:07 +00:00
|
|
|
ptr += 3;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
*ptr = string[i];
|
|
|
|
ptr++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*ptr = 0;
|
|
|
|
|
|
|
|
return buffer;
|
|
|
|
}
|
2008-05-07 18:50:23 +00:00
|
|
|
#endif /* ! PROXY */
|
2008-05-07 14:04:40 +00:00
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
/* PUBLIC FUNCTIONS */
|
|
|
|
|
|
|
|
/**
|
2006-03-22 13:44:01 +00:00
|
|
|
* xenDaemonOpen_unix:
|
2006-01-13 16:41:01 +00:00
|
|
|
* @conn: an existing virtual connection block
|
2006-01-12 15:38:07 +00:00
|
|
|
* @path: the path for the Xen Daemon socket
|
|
|
|
*
|
|
|
|
* Creates a localhost Xen Daemon connection
|
|
|
|
* Note: this doesn't try to check if the connection actually works
|
|
|
|
*
|
2006-01-13 16:41:01 +00:00
|
|
|
* Returns 0 in case of success, -1 in case of error.
|
2006-01-12 15:38:07 +00:00
|
|
|
*/
|
2006-01-13 16:41:01 +00:00
|
|
|
int
|
2006-06-29 14:44:37 +00:00
|
|
|
xenDaemonOpen_unix(virConnectPtr conn, const char *path)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
struct sockaddr_un *addr;
|
2010-01-06 11:59:21 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2006-06-29 14:44:37 +00:00
|
|
|
if ((conn == NULL) || (path == NULL))
|
2006-03-15 12:13:25 +00:00
|
|
|
return (-1);
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2010-01-06 11:59:21 +00:00
|
|
|
priv = (xenUnifiedPrivatePtr) conn->privateData;
|
2009-01-22 19:41:48 +00:00
|
|
|
memset(&priv->addr, 0, sizeof(priv->addr));
|
|
|
|
priv->addrfamily = AF_UNIX;
|
2009-01-28 14:36:23 +00:00
|
|
|
/*
|
|
|
|
* This must be zero on Solaris at least for AF_UNIX (which should
|
|
|
|
* really be PF_UNIX, but doesn't matter).
|
|
|
|
*/
|
|
|
|
priv->addrprotocol = 0;
|
2009-01-22 19:41:48 +00:00
|
|
|
priv->addrlen = sizeof(struct sockaddr_un);
|
|
|
|
|
|
|
|
addr = (struct sockaddr_un *)&priv->addr;
|
2006-01-12 15:38:07 +00:00
|
|
|
addr->sun_family = AF_UNIX;
|
|
|
|
memset(addr->sun_path, 0, sizeof(addr->sun_path));
|
2009-08-03 12:37:44 +00:00
|
|
|
if (virStrcpyStatic(addr->sun_path, path) == NULL)
|
|
|
|
return -1;
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2006-03-15 12:13:25 +00:00
|
|
|
return (0);
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#ifndef PROXY
|
2006-01-12 15:38:07 +00:00
|
|
|
/**
|
2006-03-22 13:44:01 +00:00
|
|
|
* xenDaemonOpen_tcp:
|
2006-01-13 16:41:01 +00:00
|
|
|
* @conn: an existing virtual connection block
|
2006-01-12 15:38:07 +00:00
|
|
|
* @host: the host name for the Xen Daemon
|
2008-02-05 19:27:37 +00:00
|
|
|
* @port: the port
|
2006-01-12 15:38:07 +00:00
|
|
|
*
|
|
|
|
* Creates a possibly remote Xen Daemon connection
|
|
|
|
* Note: this doesn't try to check if the connection actually works
|
|
|
|
*
|
2006-01-13 16:41:01 +00:00
|
|
|
* Returns 0 in case of success, -1 in case of error.
|
2006-01-12 15:38:07 +00:00
|
|
|
*/
|
2008-07-25 09:51:23 +00:00
|
|
|
static int
|
2009-01-22 19:41:48 +00:00
|
|
|
xenDaemonOpen_tcp(virConnectPtr conn, const char *host, const char *port)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2009-01-22 19:41:48 +00:00
|
|
|
struct addrinfo *res, *r;
|
|
|
|
struct addrinfo hints;
|
|
|
|
int saved_errno = EINVAL;
|
|
|
|
int ret;
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2009-01-22 19:41:48 +00:00
|
|
|
if ((conn == NULL) || (host == NULL) || (port == NULL))
|
2006-03-15 12:13:25 +00:00
|
|
|
return (-1);
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
priv = (xenUnifiedPrivatePtr) conn->privateData;
|
|
|
|
|
2009-01-22 19:41:48 +00:00
|
|
|
priv->addrlen = 0;
|
|
|
|
memset(&priv->addr, 0, sizeof(priv->addr));
|
|
|
|
|
|
|
|
// http://people.redhat.com/drepper/userapi-ipv6.html
|
|
|
|
memset (&hints, 0, sizeof hints);
|
|
|
|
hints.ai_socktype = SOCK_STREAM;
|
|
|
|
hints.ai_flags = AI_ADDRCONFIG;
|
|
|
|
|
|
|
|
ret = getaddrinfo (host, port, &hints, &res);
|
|
|
|
if (ret != 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_UNKNOWN_HOST,
|
2009-01-22 19:41:48 +00:00
|
|
|
_("unable to resolve hostname '%s': %s"),
|
|
|
|
host, gai_strerror (ret));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Try to connect to each returned address in turn. */
|
|
|
|
for (r = res; r; r = r->ai_next) {
|
|
|
|
int sock;
|
|
|
|
|
|
|
|
sock = socket (r->ai_family, SOCK_STREAM, r->ai_protocol);
|
|
|
|
if (sock == -1) {
|
|
|
|
saved_errno = errno;
|
|
|
|
continue;
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
2009-01-22 19:41:48 +00:00
|
|
|
|
|
|
|
if (connect (sock, r->ai_addr, r->ai_addrlen) == -1) {
|
|
|
|
saved_errno = errno;
|
|
|
|
close (sock);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
priv->addrlen = r->ai_addrlen;
|
|
|
|
priv->addrfamily = r->ai_family;
|
|
|
|
priv->addrprotocol = r->ai_protocol;
|
|
|
|
memcpy(&priv->addr,
|
|
|
|
r->ai_addr,
|
|
|
|
r->ai_addrlen);
|
|
|
|
close(sock);
|
|
|
|
break;
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
2009-01-22 19:41:48 +00:00
|
|
|
freeaddrinfo (res);
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2009-01-22 19:41:48 +00:00
|
|
|
if (!priv->addrlen) {
|
2009-01-29 23:01:37 +00:00
|
|
|
/* Don't raise error when unprivileged, since proxy takes over */
|
|
|
|
if (xenHavePrivilege())
|
2010-02-04 20:02:58 +00:00
|
|
|
virReportSystemError(saved_errno,
|
2009-01-29 23:01:37 +00:00
|
|
|
_("unable to connect to '%s:%s'"),
|
|
|
|
host, port);
|
2009-01-22 19:41:48 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2009-01-22 19:41:48 +00:00
|
|
|
return 0;
|
2006-01-12 15:38:07 +00:00
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
/**
|
|
|
|
* xend_wait_for_devices:
|
|
|
|
* @xend: pointer to the Xem Daemon block
|
|
|
|
* @name: name for the domain
|
|
|
|
*
|
|
|
|
* Block the domain until all the virtual devices are ready. This operation
|
|
|
|
* is needed when creating a domain before resuming it.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 (with errno) in case of error.
|
|
|
|
*/
|
|
|
|
int
|
2006-01-13 16:41:01 +00:00
|
|
|
xend_wait_for_devices(virConnectPtr xend, const char *name)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
return xend_op(xend, name, "op", "wait_for_devices", NULL);
|
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
|
|
|
|
#endif /* PROXY */
|
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
|
|
|
|
/**
|
2006-06-14 15:44:14 +00:00
|
|
|
* xenDaemonListDomainsOld:
|
2006-01-12 15:38:07 +00:00
|
|
|
* @xend: pointer to the Xem Daemon block
|
|
|
|
*
|
|
|
|
* This method will return an array of names of currently running
|
|
|
|
* domains. The memory should be released will a call to free().
|
|
|
|
*
|
|
|
|
* Returns a list of names or NULL in case of error.
|
|
|
|
*/
|
2006-06-29 23:53:31 +00:00
|
|
|
char **
|
2006-06-14 15:44:14 +00:00
|
|
|
xenDaemonListDomainsOld(virConnectPtr xend)
|
2006-01-12 15:38:07 +00:00
|
|
|
{
|
|
|
|
size_t extra = 0;
|
|
|
|
struct sexpr *root = NULL;
|
|
|
|
char **ret = NULL;
|
|
|
|
int count = 0;
|
|
|
|
int i;
|
|
|
|
char *ptr;
|
|
|
|
struct sexpr *_for_i, *node;
|
|
|
|
|
|
|
|
root = sexpr_get(xend, "/xend/domain");
|
|
|
|
if (root == NULL)
|
|
|
|
goto error;
|
|
|
|
|
2007-09-29 18:16:26 +00:00
|
|
|
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
|
|
|
|
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
|
2006-01-12 15:38:07 +00:00
|
|
|
if (node->kind != SEXPR_VALUE)
|
|
|
|
continue;
|
2007-09-29 18:16:26 +00:00
|
|
|
extra += strlen(node->u.value) + 1;
|
2006-01-12 15:38:07 +00:00
|
|
|
count++;
|
|
|
|
}
|
|
|
|
|
2009-03-10 11:13:32 +00:00
|
|
|
/*
|
|
|
|
* We can'tuse the normal allocation routines as we are mixing
|
|
|
|
* an array of char * at the beginning followed by an array of char
|
|
|
|
* ret points to the NULL terminated array of char *
|
|
|
|
* ptr points to the current string after that array but in the same
|
|
|
|
* allocated block
|
|
|
|
*/
|
|
|
|
if (virAlloc((void *)&ptr,
|
|
|
|
(count + 1) * sizeof(char *) + extra * sizeof(char)) < 0)
|
2006-01-12 15:38:07 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
ret = (char **) ptr;
|
|
|
|
ptr += sizeof(char *) * (count + 1);
|
|
|
|
|
|
|
|
i = 0;
|
2007-09-29 18:16:26 +00:00
|
|
|
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
|
|
|
|
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
|
2006-01-12 15:38:07 +00:00
|
|
|
if (node->kind != SEXPR_VALUE)
|
|
|
|
continue;
|
|
|
|
ret[i] = ptr;
|
2007-09-29 18:16:26 +00:00
|
|
|
strcpy(ptr, node->u.value);
|
|
|
|
ptr += strlen(node->u.value) + 1;
|
2006-01-12 15:38:07 +00:00
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret[i] = NULL;
|
|
|
|
|
|
|
|
error:
|
|
|
|
sexpr_free(root);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#ifndef PROXY
|
2006-01-12 15:38:07 +00:00
|
|
|
/**
|
2008-10-10 09:32:27 +00:00
|
|
|
* xenDaemonDomainCreateXML:
|
2006-02-16 22:50:52 +00:00
|
|
|
* @xend: A xend instance
|
|
|
|
* @sexpr: An S-Expr description of the domain.
|
|
|
|
*
|
|
|
|
* This method will create a domain based the passed in description. The
|
|
|
|
* domain will be paused after creation and must be unpaused with
|
2006-03-22 13:44:01 +00:00
|
|
|
* xenDaemonResumeDomain() to begin execution.
|
2006-02-16 22:50:52 +00:00
|
|
|
* This method may be deprecated once switching to XML-RPC based communcations
|
|
|
|
* with xend.
|
|
|
|
*
|
|
|
|
* Returns 0 for success, -1 (with errno) on error
|
|
|
|
*/
|
|
|
|
|
|
|
|
int
|
2008-10-10 09:32:27 +00:00
|
|
|
xenDaemonDomainCreateXML(virConnectPtr xend, const char *sexpr)
|
2006-02-16 22:50:52 +00:00
|
|
|
{
|
|
|
|
int ret, serrno;
|
|
|
|
char *ptr;
|
|
|
|
|
|
|
|
ptr = urlencode(sexpr);
|
2006-02-27 19:56:23 +00:00
|
|
|
if (ptr == NULL) {
|
2006-03-15 12:13:25 +00:00
|
|
|
/* this should be caught at the interface but ... */
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("failed to urlencode the create S-Expr"));
|
2006-03-15 12:13:25 +00:00
|
|
|
return (-1);
|
2006-02-27 19:56:23 +00:00
|
|
|
}
|
2006-02-16 22:50:52 +00:00
|
|
|
|
|
|
|
ret = xend_op(xend, "", "op", "create", "config", ptr, NULL);
|
|
|
|
|
|
|
|
serrno = errno;
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(ptr);
|
2006-02-16 22:50:52 +00:00
|
|
|
errno = serrno;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
2006-08-09 15:21:16 +00:00
|
|
|
#endif /* ! PROXY */
|
2006-02-16 22:50:52 +00:00
|
|
|
|
2006-01-19 10:23:15 +00:00
|
|
|
/**
|
2006-03-22 13:44:01 +00:00
|
|
|
* xenDaemonDomainLookupByName_ids:
|
2006-01-19 10:23:15 +00:00
|
|
|
* @xend: A xend instance
|
2006-02-23 10:13:55 +00:00
|
|
|
* @domname: The name of the domain
|
|
|
|
* @uuid: return value for the UUID if not NULL
|
2006-01-19 10:23:15 +00:00
|
|
|
*
|
|
|
|
* This method looks up the id of a domain
|
|
|
|
*
|
|
|
|
* Returns the id on success; -1 (with errno) on error
|
|
|
|
*/
|
|
|
|
int
|
2006-03-22 13:44:01 +00:00
|
|
|
xenDaemonDomainLookupByName_ids(virConnectPtr xend, const char *domname,
|
2008-04-10 16:54:54 +00:00
|
|
|
unsigned char *uuid)
|
2006-01-19 10:23:15 +00:00
|
|
|
{
|
|
|
|
struct sexpr *root;
|
|
|
|
const char *value;
|
|
|
|
int ret = -1;
|
|
|
|
|
2006-03-15 12:13:25 +00:00
|
|
|
if (uuid != NULL)
|
Mon Jan 23 14:36:18 IST 2007 Mark McLoughlin <markmc@redhat.com>
* include/libvirt/libvirt.h.in: add VIR_UUID_BUFLEN and
VIR_UUID_STRING_BUFLEN
* libvirt/proxy/libvirt_proxy.c, libvirt/src/hash.c,
libvirt/src/internal.h, libvirt/src/libvirt.c,
libvirt/src/proxy_internal.c, libvirt/src/test.c,
libvirt/src/virsh.c, libvirt/src/xend_internal.c,
libvirt/src/xm_internal.c, libvirt/src/xml.c,
libvirt/python/libvir.c: use them
2007-01-23 14:39:45 +00:00
|
|
|
memset(uuid, 0, VIR_UUID_BUFLEN);
|
2006-01-19 10:23:15 +00:00
|
|
|
root = sexpr_get(xend, "/xend/domain/%s?detail=1", domname);
|
|
|
|
if (root == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
value = sexpr_node(root, "domain/domid");
|
2006-02-27 19:56:23 +00:00
|
|
|
if (value == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing domid"));
|
2006-01-19 10:23:15 +00:00
|
|
|
goto error;
|
2006-02-27 19:56:23 +00:00
|
|
|
}
|
2006-01-19 10:23:15 +00:00
|
|
|
ret = strtol(value, NULL, 0);
|
2006-02-23 10:13:55 +00:00
|
|
|
if ((ret == 0) && (value[0] != '0')) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incorrect domid not numeric"));
|
2006-01-19 10:23:15 +00:00
|
|
|
ret = -1;
|
2006-02-23 10:13:55 +00:00
|
|
|
} else if (uuid != NULL) {
|
2007-08-09 20:19:12 +00:00
|
|
|
if (sexpr_uuid(uuid, root, "domain/uuid") < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing uuid"));
|
2006-03-15 12:13:25 +00:00
|
|
|
}
|
2006-02-23 10:13:55 +00:00
|
|
|
}
|
2006-01-19 10:23:15 +00:00
|
|
|
|
2006-03-15 12:13:25 +00:00
|
|
|
error:
|
2006-01-19 10:23:15 +00:00
|
|
|
sexpr_free(root);
|
2006-03-15 12:13:25 +00:00
|
|
|
return (ret);
|
2006-01-19 10:23:15 +00:00
|
|
|
}
|
|
|
|
|
2006-07-07 18:58:35 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonDomainLookupByID:
|
|
|
|
* @xend: A xend instance
|
|
|
|
* @id: The id of the domain
|
|
|
|
* @name: return value for the name if not NULL
|
|
|
|
* @uuid: return value for the UUID if not NULL
|
|
|
|
*
|
|
|
|
* This method looks up the name of a domain based on its id
|
|
|
|
*
|
|
|
|
* Returns the 0 on success; -1 (with errno) on error
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainLookupByID(virConnectPtr xend,
|
2008-04-10 16:54:54 +00:00
|
|
|
int id,
|
|
|
|
char **domname,
|
|
|
|
unsigned char *uuid)
|
2006-07-07 18:58:35 +00:00
|
|
|
{
|
|
|
|
const char *name = NULL;
|
|
|
|
struct sexpr *root;
|
|
|
|
|
Mon Jan 23 14:36:18 IST 2007 Mark McLoughlin <markmc@redhat.com>
* include/libvirt/libvirt.h.in: add VIR_UUID_BUFLEN and
VIR_UUID_STRING_BUFLEN
* libvirt/proxy/libvirt_proxy.c, libvirt/src/hash.c,
libvirt/src/internal.h, libvirt/src/libvirt.c,
libvirt/src/proxy_internal.c, libvirt/src/test.c,
libvirt/src/virsh.c, libvirt/src/xend_internal.c,
libvirt/src/xm_internal.c, libvirt/src/xml.c,
libvirt/python/libvir.c: use them
2007-01-23 14:39:45 +00:00
|
|
|
memset(uuid, 0, VIR_UUID_BUFLEN);
|
2006-07-07 18:58:35 +00:00
|
|
|
|
|
|
|
root = sexpr_get(xend, "/xend/domain/%d?detail=1", id);
|
|
|
|
if (root == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
name = sexpr_node(root, "domain/name");
|
|
|
|
if (name == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing name"));
|
2006-07-07 18:58:35 +00:00
|
|
|
goto error;
|
|
|
|
}
|
2009-11-08 21:08:54 +00:00
|
|
|
if (domname) {
|
2006-07-07 18:58:35 +00:00
|
|
|
*domname = strdup(name);
|
2009-11-08 21:08:54 +00:00
|
|
|
if (*domname == NULL) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-11-08 21:08:54 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
}
|
2006-07-07 18:58:35 +00:00
|
|
|
|
2007-08-09 20:19:12 +00:00
|
|
|
if (sexpr_uuid(uuid, root, "domain/uuid") < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing uuid"));
|
2006-07-07 18:58:35 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
sexpr_free(root);
|
|
|
|
return (0);
|
|
|
|
|
|
|
|
error:
|
|
|
|
sexpr_free(root);
|
2008-05-29 19:20:22 +00:00
|
|
|
if (domname)
|
|
|
|
VIR_FREE(*domname);
|
2006-07-07 18:58:35 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
2006-01-12 15:38:07 +00:00
|
|
|
|
2007-03-06 21:55:44 +00:00
|
|
|
#ifndef PROXY
|
2006-12-14 01:56:14 +00:00
|
|
|
static int
|
|
|
|
xend_detect_config_version(virConnectPtr conn) {
|
2006-09-12 01:16:22 +00:00
|
|
|
struct sexpr *root;
|
|
|
|
const char *value;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2006-09-12 01:16:22 +00:00
|
|
|
|
|
|
|
if (!VIR_IS_CONNECT(conn)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
2006-09-12 01:16:22 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
priv = (xenUnifiedPrivatePtr) conn->privateData;
|
|
|
|
|
2006-09-12 01:16:22 +00:00
|
|
|
root = sexpr_get(conn, "/xend/node/");
|
|
|
|
if (root == NULL)
|
|
|
|
return (-1);
|
2008-02-05 19:27:37 +00:00
|
|
|
|
2006-09-12 01:16:22 +00:00
|
|
|
value = sexpr_node(root, "node/xend_config_format");
|
2008-02-05 19:27:37 +00:00
|
|
|
|
2006-09-12 01:16:22 +00:00
|
|
|
if (value) {
|
2007-04-04 14:19:49 +00:00
|
|
|
priv->xendConfigVersion = strtol(value, NULL, 10);
|
2006-12-14 01:56:14 +00:00
|
|
|
} else {
|
|
|
|
/* Xen prior to 3.0.3 did not have the xend_config_format
|
|
|
|
field, and is implicitly version 1. */
|
2007-04-04 14:19:49 +00:00
|
|
|
priv->xendConfigVersion = 1;
|
2006-12-14 01:56:14 +00:00
|
|
|
}
|
2006-09-12 01:16:22 +00:00
|
|
|
sexpr_free(root);
|
2007-04-13 00:43:57 +00:00
|
|
|
return (0);
|
2006-09-12 01:16:22 +00:00
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#endif /* PROXY */
|
2006-02-20 17:22:16 +00:00
|
|
|
|
2006-03-23 15:42:10 +00:00
|
|
|
/*****************************************************************
|
|
|
|
******
|
2008-07-25 10:49:33 +00:00
|
|
|
****** Parsing of SEXPR into virDomainDef objects
|
2006-03-23 15:42:10 +00:00
|
|
|
******
|
|
|
|
*****************************************************************/
|
2006-07-10 11:21:24 +00:00
|
|
|
|
|
|
|
/**
|
2008-07-25 10:49:33 +00:00
|
|
|
* xenDaemonParseSxprOS
|
2006-07-10 11:21:24 +00:00
|
|
|
* @node: the root of the parsed S-Expression
|
2008-07-25 10:49:33 +00:00
|
|
|
* @def: the domain config
|
2008-02-05 19:27:37 +00:00
|
|
|
* @hvm: true or 1 if no contains HVM S-Expression
|
2007-04-13 00:43:57 +00:00
|
|
|
* @bootloader: true or 1 if a bootloader is defined
|
2006-07-10 11:21:24 +00:00
|
|
|
*
|
|
|
|
* Parse the xend sexp for description of os and append it to buf.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success and -1 in case of error
|
|
|
|
*/
|
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonParseSxprOS(const struct sexpr *node,
|
2008-07-25 10:49:33 +00:00
|
|
|
virDomainDefPtr def,
|
|
|
|
int hvm)
|
2006-07-10 11:21:24 +00:00
|
|
|
{
|
|
|
|
if (hvm) {
|
2008-07-25 10:49:33 +00:00
|
|
|
if (sexpr_node_copy(node, "domain/image/hvm/loader", &def->os.loader) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
if (def->os.loader == NULL) {
|
|
|
|
if (sexpr_node_copy(node, "domain/image/hvm/kernel", &def->os.loader) < 0)
|
|
|
|
goto no_memory;
|
2008-02-05 16:21:25 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (def->os.loader == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing HVM loader"));
|
2008-02-05 16:21:25 +00:00
|
|
|
return(-1);
|
2007-04-13 00:43:57 +00:00
|
|
|
}
|
2008-02-05 16:21:25 +00:00
|
|
|
} else {
|
2008-07-25 10:49:33 +00:00
|
|
|
if (sexpr_node_copy(node, "domain/image/hvm/kernel", &def->os.kernel) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
if (sexpr_node_copy(node, "domain/image/hvm/ramdisk", &def->os.initrd) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
if (sexpr_node_copy(node, "domain/image/hvm/args", &def->os.cmdline) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
if (sexpr_node_copy(node, "domain/image/hvm/root", &def->os.root) < 0)
|
|
|
|
goto no_memory;
|
2006-07-10 11:21:24 +00:00
|
|
|
}
|
|
|
|
} else {
|
2008-07-25 10:49:33 +00:00
|
|
|
if (sexpr_node_copy(node, "domain/image/linux/kernel", &def->os.kernel) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
if (sexpr_node_copy(node, "domain/image/linux/ramdisk", &def->os.initrd) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
if (sexpr_node_copy(node, "domain/image/linux/args", &def->os.cmdline) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
if (sexpr_node_copy(node, "domain/image/linux/root", &def->os.root) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If HVM kenrel == loader, then old xend, so kill off kernel */
|
|
|
|
if (hvm &&
|
|
|
|
def->os.kernel &&
|
|
|
|
STREQ(def->os.kernel, def->os.loader)) {
|
|
|
|
VIR_FREE(def->os.kernel);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!def->os.kernel &&
|
|
|
|
hvm) {
|
|
|
|
const char *boot = sexpr_node(node, "domain/image/hvm/boot");
|
|
|
|
if ((boot != NULL) && (boot[0] != 0)) {
|
|
|
|
while (*boot &&
|
|
|
|
def->os.nBootDevs < VIR_DOMAIN_BOOT_LAST) {
|
|
|
|
if (*boot == 'a')
|
|
|
|
def->os.bootDevs[def->os.nBootDevs++] = VIR_DOMAIN_BOOT_FLOPPY;
|
|
|
|
else if (*boot == 'c')
|
|
|
|
def->os.bootDevs[def->os.nBootDevs++] = VIR_DOMAIN_BOOT_DISK;
|
|
|
|
else if (*boot == 'd')
|
|
|
|
def->os.bootDevs[def->os.nBootDevs++] = VIR_DOMAIN_BOOT_CDROM;
|
|
|
|
else if (*boot == 'n')
|
|
|
|
def->os.bootDevs[def->os.nBootDevs++] = VIR_DOMAIN_BOOT_NET;
|
|
|
|
boot++;
|
2008-02-05 16:21:25 +00:00
|
|
|
}
|
2007-04-13 00:43:57 +00:00
|
|
|
}
|
2006-07-10 11:21:24 +00:00
|
|
|
}
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (!hvm &&
|
|
|
|
!def->os.kernel &&
|
|
|
|
!def->os.bootloader) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing kernel & bootloader"));
|
2008-07-25 10:49:33 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
no_memory:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-07-25 10:49:33 +00:00
|
|
|
return -1;
|
2006-07-10 11:21:24 +00:00
|
|
|
}
|
|
|
|
|
2008-07-25 13:50:08 +00:00
|
|
|
virDomainChrDefPtr
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonParseSxprChar(const char *value,
|
2008-07-25 10:49:33 +00:00
|
|
|
const char *tty)
|
|
|
|
{
|
2009-08-03 12:37:44 +00:00
|
|
|
const char *prefix;
|
2008-07-25 10:49:33 +00:00
|
|
|
char *tmp;
|
|
|
|
virDomainChrDefPtr def;
|
|
|
|
|
|
|
|
if (VIR_ALLOC(def) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-07-25 10:49:33 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2009-08-03 12:37:44 +00:00
|
|
|
prefix = value;
|
2008-07-25 10:49:33 +00:00
|
|
|
|
|
|
|
if (value[0] == '/') {
|
|
|
|
def->type = VIR_DOMAIN_CHR_TYPE_DEV;
|
|
|
|
} else {
|
2009-08-03 12:37:44 +00:00
|
|
|
if ((tmp = strchr(value, ':')) != NULL) {
|
2008-07-25 10:49:33 +00:00
|
|
|
*tmp = '\0';
|
2009-08-03 12:37:44 +00:00
|
|
|
value = tmp + 1;
|
2008-07-25 10:49:33 +00:00
|
|
|
}
|
|
|
|
|
2009-08-03 12:37:44 +00:00
|
|
|
if (STRPREFIX(prefix, "telnet")) {
|
2008-07-25 10:49:33 +00:00
|
|
|
def->type = VIR_DOMAIN_CHR_TYPE_TCP;
|
|
|
|
def->data.tcp.protocol = VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET;
|
|
|
|
} else {
|
|
|
|
if ((def->type = virDomainChrTypeFromString(prefix)) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 10:49:33 +00:00
|
|
|
_("unknown chr device type '%s'"), prefix);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Compat with legacy <console tty='/dev/pts/5'/> syntax */
|
|
|
|
switch (def->type) {
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_PTY:
|
|
|
|
if (tty != NULL &&
|
|
|
|
!(def->data.file.path = strdup(tty)))
|
|
|
|
goto no_memory;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_FILE:
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_PIPE:
|
|
|
|
if (!(def->data.file.path = strdup(value)))
|
|
|
|
goto no_memory;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_TCP:
|
|
|
|
{
|
|
|
|
const char *offset = strchr(value, ':');
|
|
|
|
const char *offset2;
|
|
|
|
|
|
|
|
if (offset == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("malformed char device string"));
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (offset != value &&
|
|
|
|
(def->data.tcp.host = strndup(value, offset - value)) == NULL)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
offset2 = strchr(offset, ',');
|
|
|
|
if (offset2 == NULL)
|
|
|
|
def->data.tcp.service = strdup(offset+1);
|
|
|
|
else
|
|
|
|
def->data.tcp.service = strndup(offset+1, offset2-(offset+1));
|
|
|
|
if (def->data.tcp.service == NULL)
|
|
|
|
goto no_memory;
|
|
|
|
|
2010-05-26 02:31:27 +00:00
|
|
|
if (offset2 && strstr(offset2, ",server"))
|
2008-07-25 10:49:33 +00:00
|
|
|
def->data.tcp.listen = 1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_UDP:
|
|
|
|
{
|
|
|
|
const char *offset = strchr(value, ':');
|
|
|
|
const char *offset2, *offset3;
|
|
|
|
|
|
|
|
if (offset == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("malformed char device string"));
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (offset != value &&
|
|
|
|
(def->data.udp.connectHost = strndup(value, offset - value)) == NULL)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
offset2 = strchr(offset, '@');
|
|
|
|
if (offset2 != NULL) {
|
|
|
|
if ((def->data.udp.connectService = strndup(offset + 1, offset2-(offset+1))) == NULL)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
offset3 = strchr(offset2, ':');
|
|
|
|
if (offset3 == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("malformed char device string"));
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (offset3 > (offset2 + 1) &&
|
|
|
|
(def->data.udp.bindHost = strndup(offset2 + 1, offset3 - (offset2+1))) == NULL)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if ((def->data.udp.bindService = strdup(offset3 + 1)) == NULL)
|
|
|
|
goto no_memory;
|
|
|
|
} else {
|
|
|
|
if ((def->data.udp.connectService = strdup(offset + 1)) == NULL)
|
|
|
|
goto no_memory;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_UNIX:
|
|
|
|
{
|
|
|
|
const char *offset = strchr(value, ',');
|
|
|
|
if (offset)
|
|
|
|
def->data.nix.path = strndup(value, (offset - value));
|
|
|
|
else
|
|
|
|
def->data.nix.path = strdup(value);
|
|
|
|
if (def->data.nix.path == NULL)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if (offset != NULL &&
|
2010-05-26 02:31:27 +00:00
|
|
|
strstr(offset, ",server") != NULL)
|
2008-07-25 10:49:33 +00:00
|
|
|
def->data.nix.listen = 1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return def;
|
|
|
|
|
|
|
|
no_memory:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-07-25 10:49:33 +00:00
|
|
|
error:
|
|
|
|
virDomainChrDefFree(def);
|
|
|
|
return NULL;
|
|
|
|
}
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
|
|
|
|
/**
|
2008-07-25 10:49:33 +00:00
|
|
|
* xend_parse_sexp_desc_disks
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
* @conn: connection
|
|
|
|
* @root: root sexpr
|
|
|
|
* @xendConfigVersion: version of xend
|
|
|
|
*
|
2008-07-25 10:49:33 +00:00
|
|
|
* This parses out block devices from the domain sexpr
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
*
|
|
|
|
* Returns 0 if successful or -1 if failed.
|
|
|
|
*/
|
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonParseSxprDisks(virDomainDefPtr def,
|
2008-08-01 14:43:12 +00:00
|
|
|
const struct sexpr *root,
|
2008-07-25 10:49:33 +00:00
|
|
|
int hvm,
|
|
|
|
int xendConfigVersion)
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
{
|
2008-08-01 14:43:12 +00:00
|
|
|
const struct sexpr *cur, *node;
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainDiskDefPtr disk = NULL;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
|
|
|
|
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") ||
|
2010-08-24 17:31:14 +00:00
|
|
|
sexpr_lookup(node, "device/tap") ||
|
|
|
|
sexpr_lookup(node, "device/tap2")) {
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
char *offset;
|
|
|
|
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");
|
2010-08-24 17:31:14 +00:00
|
|
|
} else if (sexpr_lookup(node, "device/tap2")) {
|
|
|
|
src = sexpr_node(node, "device/tap2/uname");
|
|
|
|
dst = sexpr_node(node, "device/tap2/dev");
|
|
|
|
mode = sexpr_node(node, "device/tap2/mode");
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
} else {
|
|
|
|
src = sexpr_node(node, "device/tap/uname");
|
|
|
|
dst = sexpr_node(node, "device/tap/dev");
|
|
|
|
mode = sexpr_node(node, "device/tap/mode");
|
|
|
|
}
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (VIR_ALLOC(disk) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
if (dst == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, vbd has no dev"));
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (src == NULL) {
|
|
|
|
/* There is a case without the uname to the CD-ROM device */
|
|
|
|
offset = strchr(dst, ':');
|
2008-07-25 10:49:33 +00:00
|
|
|
if (!offset ||
|
|
|
|
!hvm ||
|
|
|
|
STRNEQ(offset, ":cdrom")) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, vbd has no src"));
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (src != NULL) {
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
offset = strchr(src, ':');
|
|
|
|
if (!offset) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("cannot parse vbd filename, missing driver name"));
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (VIR_ALLOC_N(disk->driverName, (offset-src)+1) < 0)
|
|
|
|
goto no_memory;
|
2009-08-03 12:37:44 +00:00
|
|
|
if (virStrncpy(disk->driverName, src, offset-src,
|
|
|
|
(offset-src)+1) == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-08-03 12:37:44 +00:00
|
|
|
_("Driver name %s too big for destination"),
|
|
|
|
src);
|
|
|
|
goto error;
|
|
|
|
}
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
|
|
|
|
src = offset + 1;
|
|
|
|
|
2010-08-24 17:31:14 +00:00
|
|
|
if (STREQ (disk->driverName, "tap") ||
|
|
|
|
STREQ (disk->driverName, "tap2")) {
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
offset = strchr(src, ':');
|
|
|
|
if (!offset) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("cannot parse vbd filename, missing driver type"));
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (VIR_ALLOC_N(disk->driverType, (offset-src)+1)< 0)
|
|
|
|
goto no_memory;
|
2009-08-03 12:37:44 +00:00
|
|
|
if (virStrncpy(disk->driverType, src, offset-src,
|
|
|
|
(offset-src)+1) == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-08-03 12:37:44 +00:00
|
|
|
_("Driver type %s too big for destination"),
|
|
|
|
src);
|
|
|
|
goto error;
|
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
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 */
|
2008-07-25 10:49:33 +00:00
|
|
|
disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
|
|
|
|
} else if (STREQ(disk->driverName, "phy")) {
|
|
|
|
disk->type = VIR_DOMAIN_DISK_TYPE_BLOCK;
|
|
|
|
} else if (STREQ(disk->driverName, "file")) {
|
|
|
|
disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
} else {
|
|
|
|
/* No CDROM media so can't really tell. We'll just
|
|
|
|
call if a FILE for now and update when media
|
|
|
|
is inserted later */
|
|
|
|
disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (STREQLEN (dst, "ioemu:", 6))
|
|
|
|
dst += 6;
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
/* New style disk config from Xen >= 3.0.3 */
|
|
|
|
if (xendConfigVersion > 1) {
|
|
|
|
offset = strrchr(dst, ':');
|
|
|
|
if (offset) {
|
|
|
|
if (STREQ (offset, ":cdrom")) {
|
2008-07-25 10:49:33 +00:00
|
|
|
disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
} else if (STREQ (offset, ":disk")) {
|
|
|
|
/* The default anyway */
|
|
|
|
} else {
|
|
|
|
/* Unknown, lets pretend its a disk too */
|
|
|
|
}
|
|
|
|
offset[0] = '\0';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (!(disk->dst = strdup(dst)))
|
|
|
|
goto no_memory;
|
|
|
|
if (src &&
|
|
|
|
!(disk->src = strdup(src)))
|
|
|
|
goto no_memory;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (STRPREFIX(disk->dst, "xvd"))
|
|
|
|
disk->bus = VIR_DOMAIN_DISK_BUS_XEN;
|
|
|
|
else if (STRPREFIX(disk->dst, "hd"))
|
|
|
|
disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
|
|
|
|
else if (STRPREFIX(disk->dst, "sd"))
|
|
|
|
disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
|
|
|
|
else
|
|
|
|
disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
|
|
|
|
|
|
|
|
if (mode &&
|
|
|
|
strchr(mode, 'r'))
|
|
|
|
disk->readonly = 1;
|
|
|
|
if (mode &&
|
|
|
|
strchr(mode, '!'))
|
|
|
|
disk->shared = 1;
|
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
|
|
|
|
goto no_memory;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
def->disks[def->ndisks++] = disk;
|
2008-07-25 10:49:33 +00:00
|
|
|
disk = NULL;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2008-07-25 10:49:33 +00:00
|
|
|
|
|
|
|
no_memory:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-07-25 10:49:33 +00:00
|
|
|
|
|
|
|
error:
|
|
|
|
virDomainDiskDefFree(disk);
|
|
|
|
return -1;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonParseSxprNets(virDomainDefPtr def,
|
2008-08-01 14:43:12 +00:00
|
|
|
const struct sexpr *root)
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
{
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainNetDefPtr net = NULL;
|
2008-08-01 14:43:12 +00:00
|
|
|
const struct sexpr *cur, *node;
|
2008-07-25 10:49:33 +00:00
|
|
|
const char *tmp;
|
|
|
|
int vif_index = 0;
|
|
|
|
|
|
|
|
for (cur = root; cur->kind == SEXPR_CONS; cur = cur->u.s.cdr) {
|
|
|
|
node = cur->u.s.car;
|
|
|
|
if (sexpr_lookup(node, "device/vif")) {
|
Support for interface model='netfront'
Xen HVM guests with PV drivers end up with two network interfaces for
each configured interface. One of them being emulated by qemu and the
other one paravirtual. As this might not be desirable, the attached
patch provides a way for users to specify that only paravirtual network
interface should be presented to the guest.
The configuration was inspired by qemu/kvm driver, for which users can
specify model='virtio' to use paravirtual network interface.
The patch adds support for model='netfront' which results in
type=netfront instead of type=ioemu (or nothing for newer xen versions)
in guests native configuration. Xen's qemu ignores interfaces with
type != ioemu and only paravirtual network device will be seen in the
guest.
Four possible configuration scenarios follow:
- no model specified in domain's XML
- libvirt will behave like before this change; it will set
type=ioemu for HVM guests on xen host which is not newer than
XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU
- covered by existing tests
- PV guest, any model
- no functional change, model is passed as is (and ignored by the
hypervisor)
- covered by existing tests (e.g., *-net-e1000.*)
- HVM guest, model=netfront
- type is set to "netfront", model is not specified
- covered by new *-net-netfront.* tests
- HVM guest, model != netfront
- type is set to "ioemu", model is passed as is
- covered by new *-net-ioemu.* tests
The fourth scenario feels like a regression for xen newer than
XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU as users who had a model specified
in their guest's configuration won't see a paravirtual interface in
their guests any more. On the other hand, the reason for specifying a
model is most likely the fact that they want to use such model which
implies emulated interface. Users of older xen won't be affected at all
as their xen provides paravirtual interface regardless of the type used.
- src/xen/xend_internal.c: add netfront support for the xend backend
- src/xen/xm_internal.c: add netfront support for the XM serialization too
2009-12-04 15:55:59 +00:00
|
|
|
const char *tmp2, *model, *type;
|
2008-07-25 10:49:33 +00:00
|
|
|
char buf[50];
|
|
|
|
tmp2 = sexpr_node(node, "device/vif/script");
|
|
|
|
tmp = sexpr_node(node, "device/vif/bridge");
|
|
|
|
model = sexpr_node(node, "device/vif/model");
|
Support for interface model='netfront'
Xen HVM guests with PV drivers end up with two network interfaces for
each configured interface. One of them being emulated by qemu and the
other one paravirtual. As this might not be desirable, the attached
patch provides a way for users to specify that only paravirtual network
interface should be presented to the guest.
The configuration was inspired by qemu/kvm driver, for which users can
specify model='virtio' to use paravirtual network interface.
The patch adds support for model='netfront' which results in
type=netfront instead of type=ioemu (or nothing for newer xen versions)
in guests native configuration. Xen's qemu ignores interfaces with
type != ioemu and only paravirtual network device will be seen in the
guest.
Four possible configuration scenarios follow:
- no model specified in domain's XML
- libvirt will behave like before this change; it will set
type=ioemu for HVM guests on xen host which is not newer than
XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU
- covered by existing tests
- PV guest, any model
- no functional change, model is passed as is (and ignored by the
hypervisor)
- covered by existing tests (e.g., *-net-e1000.*)
- HVM guest, model=netfront
- type is set to "netfront", model is not specified
- covered by new *-net-netfront.* tests
- HVM guest, model != netfront
- type is set to "ioemu", model is passed as is
- covered by new *-net-ioemu.* tests
The fourth scenario feels like a regression for xen newer than
XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU as users who had a model specified
in their guest's configuration won't see a paravirtual interface in
their guests any more. On the other hand, the reason for specifying a
model is most likely the fact that they want to use such model which
implies emulated interface. Users of older xen won't be affected at all
as their xen provides paravirtual interface regardless of the type used.
- src/xen/xend_internal.c: add netfront support for the xend backend
- src/xen/xm_internal.c: add netfront support for the XM serialization too
2009-12-04 15:55:59 +00:00
|
|
|
type = sexpr_node(node, "device/vif/type");
|
2008-07-25 10:49:33 +00:00
|
|
|
|
|
|
|
if (VIR_ALLOC(net) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
|
2009-02-05 17:17:33 +00:00
|
|
|
if (tmp != NULL ||
|
|
|
|
(tmp2 != NULL && STREQ(tmp2, DEFAULT_VIF_SCRIPT))) {
|
2008-07-25 10:49:33 +00:00
|
|
|
net->type = VIR_DOMAIN_NET_TYPE_BRIDGE;
|
|
|
|
/* XXX virtual network reverse resolve */
|
|
|
|
|
|
|
|
if (tmp &&
|
|
|
|
!(net->data.bridge.brname = strdup(tmp)))
|
|
|
|
goto no_memory;
|
2009-01-22 18:29:13 +00:00
|
|
|
if (tmp2 &&
|
|
|
|
net->type == VIR_DOMAIN_NET_TYPE_BRIDGE &&
|
|
|
|
!(net->data.bridge.script = strdup(tmp2)))
|
|
|
|
goto no_memory;
|
2009-01-23 01:48:47 +00:00
|
|
|
tmp = sexpr_node(node, "device/vif/ip");
|
|
|
|
if (tmp &&
|
|
|
|
!(net->data.bridge.ipaddr = strdup(tmp)))
|
|
|
|
goto no_memory;
|
2008-07-25 10:49:33 +00:00
|
|
|
} else {
|
|
|
|
net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
|
2009-01-22 18:29:13 +00:00
|
|
|
if (tmp2 &&
|
|
|
|
!(net->data.ethernet.script = strdup(tmp2)))
|
|
|
|
goto no_memory;
|
2009-01-23 01:48:47 +00:00
|
|
|
tmp = sexpr_node(node, "device/vif/ip");
|
|
|
|
if (tmp &&
|
|
|
|
!(net->data.ethernet.ipaddr = strdup(tmp)))
|
|
|
|
goto no_memory;
|
2008-07-25 10:49:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
tmp = sexpr_node(node, "device/vif/vifname");
|
|
|
|
if (!tmp) {
|
|
|
|
snprintf(buf, sizeof(buf), "vif%d.%d", def->id, vif_index);
|
|
|
|
tmp = buf;
|
|
|
|
}
|
|
|
|
if (!(net->ifname = strdup(tmp)))
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
tmp = sexpr_node(node, "device/vif/mac");
|
|
|
|
if (tmp) {
|
2010-03-30 14:29:53 +00:00
|
|
|
if (virParseMacAddr(tmp, net->mac) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2010-03-30 14:29:53 +00:00
|
|
|
_("malformed mac address '%s'"), tmp);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (model &&
|
|
|
|
!(net->model = strdup(model)))
|
|
|
|
goto no_memory;
|
|
|
|
|
Support for interface model='netfront'
Xen HVM guests with PV drivers end up with two network interfaces for
each configured interface. One of them being emulated by qemu and the
other one paravirtual. As this might not be desirable, the attached
patch provides a way for users to specify that only paravirtual network
interface should be presented to the guest.
The configuration was inspired by qemu/kvm driver, for which users can
specify model='virtio' to use paravirtual network interface.
The patch adds support for model='netfront' which results in
type=netfront instead of type=ioemu (or nothing for newer xen versions)
in guests native configuration. Xen's qemu ignores interfaces with
type != ioemu and only paravirtual network device will be seen in the
guest.
Four possible configuration scenarios follow:
- no model specified in domain's XML
- libvirt will behave like before this change; it will set
type=ioemu for HVM guests on xen host which is not newer than
XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU
- covered by existing tests
- PV guest, any model
- no functional change, model is passed as is (and ignored by the
hypervisor)
- covered by existing tests (e.g., *-net-e1000.*)
- HVM guest, model=netfront
- type is set to "netfront", model is not specified
- covered by new *-net-netfront.* tests
- HVM guest, model != netfront
- type is set to "ioemu", model is passed as is
- covered by new *-net-ioemu.* tests
The fourth scenario feels like a regression for xen newer than
XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU as users who had a model specified
in their guest's configuration won't see a paravirtual interface in
their guests any more. On the other hand, the reason for specifying a
model is most likely the fact that they want to use such model which
implies emulated interface. Users of older xen won't be affected at all
as their xen provides paravirtual interface regardless of the type used.
- src/xen/xend_internal.c: add netfront support for the xend backend
- src/xen/xm_internal.c: add netfront support for the XM serialization too
2009-12-04 15:55:59 +00:00
|
|
|
if (!model && type &&
|
|
|
|
STREQ(type, "netfront") &&
|
|
|
|
!(net->model = strdup("netfront")))
|
|
|
|
goto no_memory;
|
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
if (VIR_REALLOC_N(def->nets, def->nnets + 1) < 0)
|
|
|
|
goto no_memory;
|
2008-10-01 15:31:02 +00:00
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
def->nets[def->nnets++] = net;
|
2008-07-25 10:49:33 +00:00
|
|
|
vif_index++;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
no_memory:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-07-25 10:49:33 +00:00
|
|
|
cleanup:
|
|
|
|
virDomainNetDefFree(net);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2008-07-25 13:50:08 +00:00
|
|
|
|
|
|
|
int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonParseSxprSound(virDomainDefPtr def,
|
2008-07-25 10:49:33 +00:00
|
|
|
const char *str)
|
|
|
|
{
|
|
|
|
if (STREQ(str, "all")) {
|
|
|
|
int i;
|
2008-10-10 16:08:01 +00:00
|
|
|
|
2009-01-20 22:15:55 +00:00
|
|
|
/*
|
|
|
|
* Special compatability code for Xen with a bogus
|
|
|
|
* sound=all in config.
|
|
|
|
*
|
|
|
|
* NB delibrately, don't include all possible
|
|
|
|
* sound models anymore, just the 2 that were
|
|
|
|
* historically present in Xen's QEMU.
|
|
|
|
*
|
|
|
|
* ie just es1370 + sb16.
|
|
|
|
*
|
|
|
|
* Hence use of MODEL_ES1370 + 1, instead of MODEL_LAST
|
|
|
|
*/
|
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
if (VIR_ALLOC_N(def->sounds,
|
2009-01-20 22:15:55 +00:00
|
|
|
VIR_DOMAIN_SOUND_MODEL_ES1370 + 1) < 0)
|
2008-10-10 16:08:01 +00:00
|
|
|
goto no_memory;
|
|
|
|
|
2009-01-20 22:15:55 +00:00
|
|
|
|
|
|
|
for (i = 0 ; i < (VIR_DOMAIN_SOUND_MODEL_ES1370 + 1) ; i++) {
|
2008-07-25 10:49:33 +00:00
|
|
|
virDomainSoundDefPtr sound;
|
|
|
|
if (VIR_ALLOC(sound) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
sound->model = i;
|
2008-10-10 16:08:01 +00:00
|
|
|
def->sounds[def->nsounds++] = sound;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
} else {
|
2008-07-25 10:49:33 +00:00
|
|
|
char model[10];
|
|
|
|
const char *offset = str, *offset2;
|
2008-10-10 16:08:01 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
do {
|
|
|
|
int len;
|
|
|
|
virDomainSoundDefPtr sound;
|
|
|
|
offset2 = strchr(offset, ',');
|
|
|
|
if (offset2)
|
|
|
|
len = (offset2 - offset);
|
|
|
|
else
|
|
|
|
len = strlen(offset);
|
2009-08-03 12:37:44 +00:00
|
|
|
if (virStrncpy(model, offset, len, sizeof(model)) == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-08-03 12:37:44 +00:00
|
|
|
_("Sound model %s too big for destination"),
|
|
|
|
offset);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (VIR_ALLOC(sound) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if ((sound->model = virDomainSoundModelTypeFromString(model)) < 0) {
|
|
|
|
VIR_FREE(sound);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
if (VIR_REALLOC_N(def->sounds, def->nsounds+1) < 0) {
|
|
|
|
virDomainSoundDefFree(sound);
|
|
|
|
goto no_memory;
|
|
|
|
}
|
|
|
|
|
|
|
|
def->sounds[def->nsounds++] = sound;
|
2008-07-25 10:49:33 +00:00
|
|
|
offset = offset2 ? offset2 + 1 : NULL;
|
|
|
|
} while (offset);
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
no_memory:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-07-25 10:49:33 +00:00
|
|
|
error:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2010-02-04 18:19:08 +00:00
|
|
|
xenDaemonParseSxprUSB(virDomainDefPtr def,
|
2008-08-01 14:43:12 +00:00
|
|
|
const struct sexpr *root)
|
2008-07-25 10:49:33 +00:00
|
|
|
{
|
|
|
|
struct sexpr *cur, *node;
|
|
|
|
const char *tmp;
|
|
|
|
|
|
|
|
for (cur = sexpr_lookup(root, "domain/image/hvm"); cur && cur->kind == SEXPR_CONS; cur = cur->u.s.cdr) {
|
|
|
|
node = cur->u.s.car;
|
|
|
|
if (sexpr_lookup(node, "usbdevice")) {
|
|
|
|
tmp = sexpr_node(node, "usbdevice");
|
|
|
|
if (tmp && *tmp) {
|
|
|
|
if (STREQ(tmp, "tablet") ||
|
|
|
|
STREQ(tmp, "mouse")) {
|
|
|
|
virDomainInputDefPtr input;
|
|
|
|
if (VIR_ALLOC(input) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
input->bus = VIR_DOMAIN_INPUT_BUS_USB;
|
|
|
|
if (STREQ(tmp, "tablet"))
|
|
|
|
input->type = VIR_DOMAIN_INPUT_TYPE_TABLET;
|
|
|
|
else
|
|
|
|
input->type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
|
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
if (VIR_REALLOC_N(def->inputs, def->ninputs+1) < 0) {
|
|
|
|
VIR_FREE(input);
|
|
|
|
goto no_memory;
|
|
|
|
}
|
|
|
|
def->inputs[def->ninputs++] = input;
|
2008-07-25 10:49:33 +00:00
|
|
|
} else {
|
|
|
|
/* XXX Handle other non-input USB devices later */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
no_memory:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-07-25 10:49:33 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenDaemonParseSxprGraphicsOld(virConnectPtr conn,
|
|
|
|
virDomainDefPtr def,
|
2008-08-01 14:43:12 +00:00
|
|
|
const struct sexpr *root,
|
2008-07-25 10:49:33 +00:00
|
|
|
int hvm,
|
|
|
|
int xendConfigVersion)
|
|
|
|
{
|
2009-01-21 18:11:14 +00:00
|
|
|
#ifndef PROXY
|
|
|
|
xenUnifiedPrivatePtr priv = conn->privateData;
|
|
|
|
#endif
|
2008-07-25 10:49:33 +00:00
|
|
|
const char *tmp;
|
|
|
|
virDomainGraphicsDefPtr graphics = NULL;
|
|
|
|
|
|
|
|
if ((tmp = sexpr_fmt_node(root, "domain/image/%s/vnc", hvm ? "hvm" : "linux")) &&
|
|
|
|
tmp[0] == '1') {
|
|
|
|
/* Graphics device (HVM, or old (pre-3.0.4) style PV VNC config) */
|
2009-01-21 18:11:14 +00:00
|
|
|
int port;
|
2008-07-25 10:49:33 +00:00
|
|
|
const char *listenAddr = sexpr_fmt_node(root, "domain/image/%s/vnclisten", hvm ? "hvm" : "linux");
|
|
|
|
const char *vncPasswd = sexpr_fmt_node(root, "domain/image/%s/vncpasswd", hvm ? "hvm" : "linux");
|
|
|
|
const char *keymap = sexpr_fmt_node(root, "domain/image/%s/keymap", hvm ? "hvm" : "linux");
|
|
|
|
const char *unused = sexpr_fmt_node(root, "domain/image/%s/vncunused", hvm ? "hvm" : "linux");
|
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedLock(priv);
|
|
|
|
port = xenStoreDomainGetVNCPort(conn, def->id);
|
|
|
|
xenUnifiedUnlock(priv);
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (VIR_ALLOC(graphics) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
graphics->type = VIR_DOMAIN_GRAPHICS_TYPE_VNC;
|
|
|
|
/* For Xen >= 3.0.3, don't generate a fixed port mapping
|
|
|
|
* because it will almost certainly be wrong ! Just leave
|
|
|
|
* it as -1 which lets caller see that the VNC server isn't
|
|
|
|
* present yet. Subsquent dumps of the XML will eventually
|
|
|
|
* find the port in XenStore once VNC server has started
|
|
|
|
*/
|
|
|
|
if (port == -1 && xendConfigVersion < 2)
|
|
|
|
port = 5900 + def->id;
|
|
|
|
|
|
|
|
if ((unused && STREQ(unused, "1")) || port == -1)
|
|
|
|
graphics->data.vnc.autoport = 1;
|
|
|
|
graphics->data.vnc.port = port;
|
|
|
|
|
|
|
|
if (listenAddr &&
|
|
|
|
!(graphics->data.vnc.listenAddr = strdup(listenAddr)))
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if (vncPasswd &&
|
|
|
|
!(graphics->data.vnc.passwd = strdup(vncPasswd)))
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if (keymap &&
|
|
|
|
!(graphics->data.vnc.keymap = strdup(keymap)))
|
|
|
|
goto no_memory;
|
|
|
|
|
2009-05-07 07:27:49 +00:00
|
|
|
if (VIR_ALLOC_N(def->graphics, 1) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
def->graphics[0] = graphics;
|
|
|
|
def->ngraphics = 1;
|
|
|
|
graphics = NULL;
|
2008-07-25 10:49:33 +00:00
|
|
|
} else if ((tmp = sexpr_fmt_node(root, "domain/image/%s/sdl", hvm ? "hvm" : "linux")) &&
|
|
|
|
tmp[0] == '1') {
|
|
|
|
/* Graphics device (HVM, or old (pre-3.0.4) style PV sdl config) */
|
|
|
|
const char *display = sexpr_fmt_node(root, "domain/image/%s/display", hvm ? "hvm" : "linux");
|
|
|
|
const char *xauth = sexpr_fmt_node(root, "domain/image/%s/xauthority", hvm ? "hvm" : "linux");
|
|
|
|
|
|
|
|
if (VIR_ALLOC(graphics) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
graphics->type = VIR_DOMAIN_GRAPHICS_TYPE_SDL;
|
|
|
|
if (display &&
|
|
|
|
!(graphics->data.sdl.display = strdup(display)))
|
|
|
|
goto no_memory;
|
|
|
|
if (xauth &&
|
|
|
|
!(graphics->data.sdl.xauth = strdup(xauth)))
|
|
|
|
goto no_memory;
|
|
|
|
|
2009-05-07 07:27:49 +00:00
|
|
|
if (VIR_ALLOC_N(def->graphics, 1) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
def->graphics[0] = graphics;
|
|
|
|
def->ngraphics = 1;
|
|
|
|
graphics = NULL;
|
2008-07-25 10:49:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
no_memory:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-07-25 10:49:33 +00:00
|
|
|
virDomainGraphicsDefFree(graphics);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
xenDaemonParseSxprGraphicsNew(virConnectPtr conn,
|
|
|
|
virDomainDefPtr def,
|
2008-08-01 14:43:12 +00:00
|
|
|
const struct sexpr *root)
|
2008-07-25 10:49:33 +00:00
|
|
|
{
|
2009-01-21 18:11:14 +00:00
|
|
|
#ifndef PROXY
|
|
|
|
xenUnifiedPrivatePtr priv = conn->privateData;
|
|
|
|
#endif
|
2008-07-25 10:49:33 +00:00
|
|
|
virDomainGraphicsDefPtr graphics = NULL;
|
2008-08-01 14:43:12 +00:00
|
|
|
const struct sexpr *cur, *node;
|
2008-07-25 10:49:33 +00:00
|
|
|
const char *tmp;
|
|
|
|
|
|
|
|
/* append network devices and framebuffer */
|
|
|
|
for (cur = root; cur->kind == SEXPR_CONS; cur = cur->u.s.cdr) {
|
|
|
|
node = cur->u.s.car;
|
|
|
|
if (sexpr_lookup(node, "device/vfb")) {
|
|
|
|
/* New style graphics config for PV guests in >= 3.0.4,
|
|
|
|
* or for HVM guests in >= 3.0.5 */
|
2009-06-26 18:14:16 +00:00
|
|
|
if (sexpr_node(node, "device/vfb/type")) {
|
|
|
|
tmp = sexpr_node(node, "device/vfb/type");
|
|
|
|
} else if (sexpr_node(node, "device/vfb/vnc")) {
|
|
|
|
tmp = "vnc";
|
|
|
|
} else if (sexpr_node(node, "device/vfb/sdl")) {
|
|
|
|
tmp = "sdl";
|
|
|
|
} else {
|
|
|
|
tmp = "unknown";
|
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
|
|
|
|
if (VIR_ALLOC(graphics) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if ((graphics->type = virDomainGraphicsTypeFromString(tmp)) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 10:49:33 +00:00
|
|
|
_("unknown graphics type '%s'"), tmp);
|
|
|
|
goto error;
|
|
|
|
}
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
|
|
|
const char *display = sexpr_node(node, "device/vfb/display");
|
|
|
|
const char *xauth = sexpr_node(node, "device/vfb/xauthority");
|
|
|
|
if (display &&
|
|
|
|
!(graphics->data.sdl.display = strdup(display)))
|
|
|
|
goto no_memory;
|
|
|
|
if (xauth &&
|
|
|
|
!(graphics->data.sdl.xauth = strdup(xauth)))
|
|
|
|
goto no_memory;
|
|
|
|
} else {
|
2009-01-21 18:11:14 +00:00
|
|
|
int port;
|
2008-07-25 10:49:33 +00:00
|
|
|
const char *listenAddr = sexpr_node(node, "device/vfb/vnclisten");
|
2009-08-05 09:24:23 +00:00
|
|
|
const char *vncPasswd = sexpr_node(node, "device/vfb/vncpasswd");
|
2008-07-25 10:49:33 +00:00
|
|
|
const char *keymap = sexpr_node(node, "device/vfb/keymap");
|
|
|
|
const char *unused = sexpr_node(node, "device/vfb/vncunused");
|
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedLock(priv);
|
|
|
|
port = xenStoreDomainGetVNCPort(conn, def->id);
|
|
|
|
xenUnifiedUnlock(priv);
|
|
|
|
|
2009-01-29 17:02:00 +00:00
|
|
|
// Didn't find port entry in xenstore
|
2009-01-21 18:11:14 +00:00
|
|
|
if (port == -1) {
|
2009-01-29 17:02:00 +00:00
|
|
|
const char *str = sexpr_node(node, "device/vfb/vncdisplay");
|
|
|
|
int val;
|
|
|
|
if (str != NULL && virStrToLong_i(str, NULL, 0, &val) == 0)
|
|
|
|
port = val;
|
2009-01-21 18:11:14 +00:00
|
|
|
}
|
|
|
|
|
2009-01-29 17:02:00 +00:00
|
|
|
if ((unused && STREQ(unused, "1")) || port == -1)
|
2008-07-25 10:49:33 +00:00
|
|
|
graphics->data.vnc.autoport = 1;
|
2008-09-09 13:53:58 +00:00
|
|
|
|
|
|
|
if (port >= 0 && port < 5900)
|
|
|
|
port += 5900;
|
2008-07-25 10:49:33 +00:00
|
|
|
graphics->data.vnc.port = port;
|
|
|
|
|
|
|
|
if (listenAddr &&
|
|
|
|
!(graphics->data.vnc.listenAddr = strdup(listenAddr)))
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if (vncPasswd &&
|
|
|
|
!(graphics->data.vnc.passwd = strdup(vncPasswd)))
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if (keymap &&
|
|
|
|
!(graphics->data.vnc.keymap = strdup(keymap)))
|
|
|
|
goto no_memory;
|
|
|
|
}
|
|
|
|
|
2009-05-07 07:27:49 +00:00
|
|
|
if (VIR_ALLOC_N(def->graphics, 1) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
def->graphics[0] = graphics;
|
|
|
|
def->ngraphics = 1;
|
|
|
|
graphics = NULL;
|
2008-07-25 10:49:33 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
|
|
|
|
return 0;
|
2008-07-25 10:49:33 +00:00
|
|
|
|
|
|
|
no_memory:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-07-25 10:49:33 +00:00
|
|
|
error:
|
|
|
|
virDomainGraphicsDefFree(graphics);
|
|
|
|
return -1;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
|
2009-04-03 12:38:52 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonParseSxprPCI
|
|
|
|
* @root: root sexpr
|
|
|
|
*
|
|
|
|
* This parses out block devices from the domain sexpr
|
|
|
|
*
|
|
|
|
* Returns 0 if successful or -1 if failed.
|
|
|
|
*/
|
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonParseSxprPCI(virDomainDefPtr def,
|
2009-04-03 12:38:52 +00:00
|
|
|
const struct sexpr *root)
|
|
|
|
{
|
|
|
|
const struct sexpr *cur, *tmp = NULL, *node;
|
|
|
|
virDomainHostdevDefPtr dev = NULL;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* With the (domain ...) block we have the following odd setup
|
|
|
|
*
|
|
|
|
* (device
|
|
|
|
* (pci
|
|
|
|
* (dev (domain 0x0000) (bus 0x00) (slot 0x1b) (func 0x0))
|
|
|
|
* (dev (domain 0x0000) (bus 0x00) (slot 0x13) (func 0x0))
|
|
|
|
* )
|
|
|
|
* )
|
|
|
|
*
|
|
|
|
* Normally there is one (device ...) block per device, but in
|
|
|
|
* wierd world of Xen PCI, once (device ...) covers multiple
|
|
|
|
* devices.
|
|
|
|
*/
|
|
|
|
|
|
|
|
for (cur = root; cur->kind == SEXPR_CONS; cur = cur->u.s.cdr) {
|
|
|
|
node = cur->u.s.car;
|
|
|
|
if ((tmp = sexpr_lookup(node, "device/pci")) != NULL)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!tmp)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
for (cur = tmp; cur->kind == SEXPR_CONS; cur = cur->u.s.cdr) {
|
|
|
|
const char *domain = NULL;
|
|
|
|
const char *bus = NULL;
|
|
|
|
const char *slot = NULL;
|
|
|
|
const char *func = NULL;
|
|
|
|
int domainID;
|
|
|
|
int busID;
|
|
|
|
int slotID;
|
|
|
|
int funcID;
|
|
|
|
|
|
|
|
node = cur->u.s.car;
|
|
|
|
if (!sexpr_lookup(node, "dev"))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (!(domain = sexpr_node(node, "dev/domain"))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-04-03 12:38:52 +00:00
|
|
|
"%s", _("missing PCI domain"));
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (!(bus = sexpr_node(node, "dev/bus"))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-04-03 12:38:52 +00:00
|
|
|
"%s", _("missing PCI bus"));
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (!(slot = sexpr_node(node, "dev/slot"))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-04-03 12:38:52 +00:00
|
|
|
"%s", _("missing PCI slot"));
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (!(func = sexpr_node(node, "dev/func"))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-04-03 12:38:52 +00:00
|
|
|
"%s", _("missing PCI func"));
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virStrToLong_i(domain, NULL, 0, &domainID) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-04-03 12:38:52 +00:00
|
|
|
_("cannot parse PCI domain '%s'"), domain);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (virStrToLong_i(bus, NULL, 0, &busID) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-04-03 12:38:52 +00:00
|
|
|
_("cannot parse PCI bus '%s'"), bus);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (virStrToLong_i(slot, NULL, 0, &slotID) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-04-03 12:38:52 +00:00
|
|
|
_("cannot parse PCI slot '%s'"), slot);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (virStrToLong_i(func, NULL, 0, &funcID) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-04-03 12:38:52 +00:00
|
|
|
_("cannot parse PCI func '%s'"), func);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (VIR_ALLOC(dev) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
dev->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
|
|
|
|
dev->managed = 0;
|
|
|
|
dev->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
|
|
|
|
dev->source.subsys.u.pci.domain = domainID;
|
|
|
|
dev->source.subsys.u.pci.bus = busID;
|
|
|
|
dev->source.subsys.u.pci.slot = slotID;
|
|
|
|
dev->source.subsys.u.pci.function = funcID;
|
|
|
|
|
|
|
|
if (VIR_REALLOC_N(def->hostdevs, def->nhostdevs+1) < 0) {
|
|
|
|
goto no_memory;
|
|
|
|
}
|
|
|
|
|
|
|
|
def->hostdevs[def->nhostdevs++] = dev;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
no_memory:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-04-03 12:38:52 +00:00
|
|
|
|
|
|
|
error:
|
|
|
|
virDomainHostdevDefFree(dev);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
|
2006-02-20 17:22:16 +00:00
|
|
|
/**
|
2008-07-25 10:49:33 +00:00
|
|
|
* xenDaemonParseSxpr:
|
2006-10-09 14:32:07 +00:00
|
|
|
* @conn: the connection associated with the XML
|
2006-02-20 17:22:16 +00:00
|
|
|
* @root: the root of the parsed S-Expression
|
2007-09-30 13:09:07 +00:00
|
|
|
* @xendConfigVersion: version of xend
|
2007-10-31 09:39:13 +00:00
|
|
|
* @cpus: set of cpus the domain may be pinned to
|
2006-02-20 17:22:16 +00:00
|
|
|
*
|
|
|
|
* Parse the xend sexp description and turn it into the XML format similar
|
|
|
|
* to the one unsed for creation.
|
|
|
|
*
|
|
|
|
* Returns the 0 terminated XML string or NULL in case of error.
|
|
|
|
* the caller must free() the returned value.
|
|
|
|
*/
|
2008-07-25 10:49:33 +00:00
|
|
|
static virDomainDefPtr
|
|
|
|
xenDaemonParseSxpr(virConnectPtr conn,
|
2008-08-01 15:32:28 +00:00
|
|
|
const struct sexpr *root,
|
2008-07-25 10:49:33 +00:00
|
|
|
int xendConfigVersion,
|
|
|
|
const char *cpus)
|
2006-03-15 12:13:25 +00:00
|
|
|
{
|
2009-01-21 18:11:14 +00:00
|
|
|
#ifndef PROXY
|
|
|
|
xenUnifiedPrivatePtr priv = conn->privateData;
|
|
|
|
#endif
|
2006-02-20 17:22:16 +00:00
|
|
|
const char *tmp;
|
2008-07-25 10:49:33 +00:00
|
|
|
virDomainDefPtr def;
|
|
|
|
int hvm = 0;
|
|
|
|
char *tty = NULL;
|
2006-02-20 17:22:16 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (VIR_ALLOC(def) < 0)
|
|
|
|
goto no_memory;
|
2006-02-20 17:22:16 +00:00
|
|
|
|
2007-03-02 20:19:08 +00:00
|
|
|
tmp = sexpr_node(root, "domain/domid");
|
|
|
|
if (tmp == NULL && xendConfigVersion < 3) { /* Old XenD, domid was mandatory */
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing id"));
|
2007-03-02 20:19:08 +00:00
|
|
|
goto error;
|
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
def->virtType = VIR_DOMAIN_VIRT_XEN;
|
2007-03-02 20:19:08 +00:00
|
|
|
if (tmp)
|
2008-07-25 10:49:33 +00:00
|
|
|
def->id = sexpr_int(root, "domain/domid");
|
2007-03-02 20:19:08 +00:00
|
|
|
else
|
2008-07-25 10:49:33 +00:00
|
|
|
def->id = -1;
|
2006-09-21 15:24:37 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (sexpr_node_copy(root, "domain/name", &def->name) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
if (def->name == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing name"));
|
2006-03-15 12:13:25 +00:00
|
|
|
goto error;
|
2006-02-20 17:22:16 +00:00
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
|
2006-04-27 14:14:23 +00:00
|
|
|
tmp = sexpr_node(root, "domain/uuid");
|
2007-08-09 20:19:12 +00:00
|
|
|
if (tmp == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing name"));
|
2007-08-09 20:19:12 +00:00
|
|
|
goto error;
|
2006-04-27 14:14:23 +00:00
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
virUUIDParse(tmp, def->uuid);
|
2007-08-09 20:19:12 +00:00
|
|
|
|
2009-12-09 14:25:31 +00:00
|
|
|
if (sexpr_node_copy(root, "domain/description", &def->description) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
|
2007-09-30 15:36:47 +00:00
|
|
|
hvm = sexpr_lookup(root, "domain/image/hvm") ? 1 : 0;
|
|
|
|
if (!hvm) {
|
2008-07-25 10:49:33 +00:00
|
|
|
if (sexpr_node_copy(root, "domain/bootloader",
|
|
|
|
&def->os.bootloader) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if (!def->os.bootloader &&
|
|
|
|
sexpr_has(root, "domain/bootloader") &&
|
|
|
|
(def->os.bootloader = strdup("")) == NULL)
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if (def->os.bootloader &&
|
|
|
|
sexpr_node_copy(root, "domain/bootloader_args",
|
|
|
|
&def->os.bootloaderArgs) < 0)
|
|
|
|
goto no_memory;
|
2007-06-07 13:50:18 +00:00
|
|
|
}
|
2006-07-10 11:21:24 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (!(def->os.type = strdup(hvm ? "hvm" : "linux")))
|
|
|
|
goto no_memory;
|
|
|
|
|
|
|
|
if (def->id != 0) {
|
2007-04-13 00:43:57 +00:00
|
|
|
if (sexpr_lookup(root, "domain/image")) {
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonParseSxprOS(root, def, hvm) < 0)
|
2007-09-29 18:31:05 +00:00
|
|
|
goto error;
|
2007-04-13 00:43:57 +00:00
|
|
|
}
|
2006-02-20 17:22:16 +00:00
|
|
|
}
|
2006-07-10 11:21:24 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
def->maxmem = (unsigned long) (sexpr_u64(root, "domain/maxmem") << 10);
|
|
|
|
def->memory = (unsigned long) (sexpr_u64(root, "domain/memory") << 10);
|
|
|
|
if (def->memory > def->maxmem)
|
|
|
|
def->maxmem = def->memory;
|
2008-02-05 19:27:37 +00:00
|
|
|
|
2007-10-31 09:39:13 +00:00
|
|
|
if (cpus != NULL) {
|
2009-01-29 18:40:32 +00:00
|
|
|
def->cpumasklen = VIR_DOMAIN_CPUMASK_LEN;
|
|
|
|
if (VIR_ALLOC_N(def->cpumask, def->cpumasklen) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-01-29 18:40:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
2010-02-09 18:58:01 +00:00
|
|
|
if (virDomainCpuSetParse(&cpus,
|
2008-07-25 10:49:33 +00:00
|
|
|
0, def->cpumask,
|
2009-01-29 18:40:32 +00:00
|
|
|
def->cpumasklen) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-01-29 18:40:32 +00:00
|
|
|
_("invalid CPU mask %s"), cpus);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
2009-01-29 18:40:32 +00:00
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
}
|
2009-01-29 18:40:32 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
def->vcpus = sexpr_int(root, "domain/vcpus");
|
|
|
|
|
2006-04-10 08:32:34 +00:00
|
|
|
tmp = sexpr_node(root, "domain/on_poweroff");
|
2008-07-25 10:49:33 +00:00
|
|
|
if (tmp != NULL) {
|
|
|
|
if ((def->onPoweroff = virDomainLifecycleTypeFromString(tmp)) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 10:49:33 +00:00
|
|
|
_("unknown lifecycle type %s"), tmp);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
def->onPoweroff = VIR_DOMAIN_LIFECYCLE_DESTROY;
|
|
|
|
|
2006-04-10 08:32:34 +00:00
|
|
|
tmp = sexpr_node(root, "domain/on_reboot");
|
2008-07-25 10:49:33 +00:00
|
|
|
if (tmp != NULL) {
|
|
|
|
if ((def->onReboot = virDomainLifecycleTypeFromString(tmp)) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 10:49:33 +00:00
|
|
|
_("unknown lifecycle type %s"), tmp);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
def->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART;
|
|
|
|
|
2006-04-10 08:32:34 +00:00
|
|
|
tmp = sexpr_node(root, "domain/on_crash");
|
2008-07-25 10:49:33 +00:00
|
|
|
if (tmp != NULL) {
|
2010-08-12 17:15:44 +00:00
|
|
|
if ((def->onCrash = virDomainLifecycleCrashTypeFromString(tmp)) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 10:49:33 +00:00
|
|
|
_("unknown lifecycle type %s"), tmp);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
def->onCrash = VIR_DOMAIN_LIFECYCLE_DESTROY;
|
2006-04-10 08:32:34 +00:00
|
|
|
|
2010-02-02 17:22:03 +00:00
|
|
|
def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
|
2008-07-25 10:49:33 +00:00
|
|
|
if (hvm) {
|
2006-08-15 17:01:42 +00:00
|
|
|
if (sexpr_int(root, "domain/image/hvm/acpi"))
|
2008-07-25 10:49:33 +00:00
|
|
|
def->features |= (1 << VIR_DOMAIN_FEATURE_ACPI);
|
2006-08-15 17:01:42 +00:00
|
|
|
if (sexpr_int(root, "domain/image/hvm/apic"))
|
2008-07-25 10:49:33 +00:00
|
|
|
def->features |= (1 << VIR_DOMAIN_FEATURE_APIC);
|
2006-08-15 17:01:42 +00:00
|
|
|
if (sexpr_int(root, "domain/image/hvm/pae"))
|
2008-07-25 10:49:33 +00:00
|
|
|
def->features |= (1 << VIR_DOMAIN_FEATURE_PAE);
|
2007-07-16 21:30:30 +00:00
|
|
|
|
2009-04-01 10:36:52 +00:00
|
|
|
/* Old XenD only allows localtime here for HVM */
|
2008-07-25 10:49:33 +00:00
|
|
|
if (sexpr_int(root, "domain/image/hvm/localtime"))
|
2010-02-02 17:22:03 +00:00
|
|
|
def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME;
|
2006-08-15 17:01:42 +00:00
|
|
|
}
|
2006-09-21 15:24:37 +00:00
|
|
|
|
2009-04-01 10:36:52 +00:00
|
|
|
/* Current XenD allows localtime here, for PV and HVM */
|
|
|
|
if (sexpr_int(root, "domain/localtime"))
|
2010-02-02 17:22:03 +00:00
|
|
|
def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME;
|
2009-04-01 10:36:52 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (sexpr_node_copy(root, hvm ?
|
|
|
|
"domain/image/hvm/device_model" :
|
|
|
|
"domain/image/linux/device_model",
|
|
|
|
&def->emulator) < 0)
|
|
|
|
goto no_memory;
|
2006-07-10 11:21:24 +00:00
|
|
|
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
/* append block devices */
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonParseSxprDisks(def, root, hvm, xendConfigVersion) < 0)
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
goto error;
|
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonParseSxprNets(def, root) < 0)
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
2006-11-15 00:38:13 +00:00
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonParseSxprPCI(def, root) < 0)
|
2009-04-03 12:38:52 +00:00
|
|
|
goto error;
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
/* New style graphics device config */
|
|
|
|
if (xenDaemonParseSxprGraphicsNew(conn, def, root) < 0)
|
|
|
|
goto error;
|
2006-12-06 23:44:17 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
/* Graphics device (HVM <= 3.0.4, or PV <= 3.0.3) vnc config */
|
2009-05-07 07:27:49 +00:00
|
|
|
if ((def->ngraphics == 0) &&
|
2008-07-25 10:49:33 +00:00
|
|
|
xenDaemonParseSxprGraphicsOld(conn, def, root, hvm, xendConfigVersion) < 0)
|
|
|
|
goto error;
|
2006-03-15 12:13:25 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
|
|
|
|
/* Old style cdrom config from Xen <= 3.0.2 */
|
|
|
|
if (hvm &&
|
|
|
|
xendConfigVersion == 1) {
|
|
|
|
tmp = sexpr_node(root, "domain/image/hvm/cdrom");
|
2006-08-11 14:40:04 +00:00
|
|
|
if ((tmp != NULL) && (tmp[0] != 0)) {
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainDiskDefPtr disk;
|
2008-07-25 10:49:33 +00:00
|
|
|
if (VIR_ALLOC(disk) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
if (!(disk->src = strdup(tmp))) {
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainDiskDefFree(disk);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto no_memory;
|
|
|
|
}
|
|
|
|
disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
|
|
|
|
disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
|
|
|
|
if (!(disk->dst = strdup("hdc"))) {
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainDiskDefFree(disk);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto no_memory;
|
|
|
|
}
|
|
|
|
if (!(disk->driverName = strdup("file"))) {
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainDiskDefFree(disk);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto no_memory;
|
|
|
|
}
|
|
|
|
disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
|
|
|
|
disk->readonly = 1;
|
2006-09-12 01:16:22 +00:00
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0) {
|
|
|
|
virDomainDiskDefFree(disk);
|
|
|
|
goto no_memory;
|
2006-09-12 01:16:22 +00:00
|
|
|
}
|
2008-10-10 16:08:01 +00:00
|
|
|
def->disks[def->ndisks++] = disk;
|
2006-08-11 14:40:04 +00:00
|
|
|
}
|
2006-08-26 15:30:44 +00:00
|
|
|
}
|
2006-10-09 14:32:07 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
|
|
|
|
/* Floppy disk config */
|
2007-07-18 21:08:22 +00:00
|
|
|
if (hvm) {
|
2008-07-25 10:49:33 +00:00
|
|
|
const char *const fds[] = { "fda", "fdb" };
|
|
|
|
int i;
|
2008-10-28 17:43:24 +00:00
|
|
|
for (i = 0 ; i < ARRAY_CARDINALITY(fds) ; i++) {
|
2008-07-25 10:49:33 +00:00
|
|
|
tmp = sexpr_fmt_node(root, "domain/image/hvm/%s", fds[i]);
|
|
|
|
if ((tmp != NULL) && (tmp[0] != 0)) {
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainDiskDefPtr disk;
|
2008-07-25 10:49:33 +00:00
|
|
|
if (VIR_ALLOC(disk) < 0)
|
|
|
|
goto no_memory;
|
|
|
|
if (!(disk->src = strdup(tmp))) {
|
|
|
|
VIR_FREE(disk);
|
|
|
|
goto no_memory;
|
2007-07-18 21:08:22 +00:00
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
|
|
|
|
disk->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
|
|
|
|
if (!(disk->dst = strdup(fds[i]))) {
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainDiskDefFree(disk);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto no_memory;
|
2008-04-10 16:54:54 +00:00
|
|
|
}
|
2008-07-25 10:49:33 +00:00
|
|
|
if (!(disk->driverName = strdup("file"))) {
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainDiskDefFree(disk);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto no_memory;
|
|
|
|
}
|
|
|
|
disk->bus = VIR_DOMAIN_DISK_BUS_FDC;
|
2006-10-09 14:32:07 +00:00
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0) {
|
|
|
|
virDomainDiskDefFree(disk);
|
|
|
|
goto no_memory;
|
2008-07-25 10:49:33 +00:00
|
|
|
}
|
2008-10-10 16:08:01 +00:00
|
|
|
def->disks[def->ndisks++] = disk;
|
2007-07-18 21:08:22 +00:00
|
|
|
}
|
2007-05-11 14:21:28 +00:00
|
|
|
}
|
2006-02-20 17:22:16 +00:00
|
|
|
}
|
2006-10-09 14:32:07 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
/* in case of HVM we have USB device emulation */
|
|
|
|
if (hvm &&
|
2010-02-04 18:19:08 +00:00
|
|
|
xenDaemonParseSxprUSB(def, root) < 0)
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* Character device config */
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedLock(priv);
|
2008-07-25 10:49:33 +00:00
|
|
|
tty = xenStoreDomainGetConsolePath(conn, def->id);
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedUnlock(priv);
|
2008-04-26 14:22:02 +00:00
|
|
|
if (hvm) {
|
|
|
|
tmp = sexpr_node(root, "domain/image/hvm/serial");
|
|
|
|
if (tmp && STRNEQ(tmp, "none")) {
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainChrDefPtr chr;
|
2010-04-02 23:10:49 +00:00
|
|
|
if ((chr = xenDaemonParseSxprChar(tmp, tty)) == NULL)
|
2008-04-26 14:22:02 +00:00
|
|
|
goto error;
|
2008-10-10 16:08:01 +00:00
|
|
|
if (VIR_REALLOC_N(def->serials, def->nserials+1) < 0) {
|
|
|
|
virDomainChrDefFree(chr);
|
|
|
|
goto no_memory;
|
|
|
|
}
|
2010-07-13 19:05:34 +00:00
|
|
|
chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
|
2008-10-10 16:08:01 +00:00
|
|
|
def->serials[def->nserials++] = chr;
|
2008-04-26 14:22:02 +00:00
|
|
|
}
|
|
|
|
tmp = sexpr_node(root, "domain/image/hvm/parallel");
|
|
|
|
if (tmp && STRNEQ(tmp, "none")) {
|
2008-10-10 16:08:01 +00:00
|
|
|
virDomainChrDefPtr chr;
|
2008-04-26 14:22:02 +00:00
|
|
|
/* XXX does XenD stuff parallel port tty info into xenstore somewhere ? */
|
2010-04-02 23:10:49 +00:00
|
|
|
if ((chr = xenDaemonParseSxprChar(tmp, NULL)) == NULL)
|
2008-04-26 14:22:02 +00:00
|
|
|
goto error;
|
2008-10-10 16:08:01 +00:00
|
|
|
if (VIR_REALLOC_N(def->parallels, def->nparallels+1) < 0) {
|
|
|
|
virDomainChrDefFree(chr);
|
|
|
|
goto no_memory;
|
|
|
|
}
|
2010-07-13 19:05:34 +00:00
|
|
|
chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL;
|
2008-10-10 16:08:01 +00:00
|
|
|
def->parallels[def->nparallels++] = chr;
|
2008-04-26 14:22:02 +00:00
|
|
|
}
|
|
|
|
} else {
|
2008-07-25 10:49:33 +00:00
|
|
|
/* Fake a paravirt console, since that's not in the sexpr */
|
2010-04-02 23:10:49 +00:00
|
|
|
if (!(def->console = xenDaemonParseSxprChar("pty", tty)))
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
2010-07-13 19:05:34 +00:00
|
|
|
def->console->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
|
2010-07-22 17:56:21 +00:00
|
|
|
def->console->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
|
2006-08-08 20:14:40 +00:00
|
|
|
}
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(tty);
|
2006-08-08 20:14:40 +00:00
|
|
|
|
2006-02-20 17:22:16 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
/* Sound device config */
|
|
|
|
if (hvm &&
|
|
|
|
(tmp = sexpr_node(root, "domain/image/hvm/soundhw")) != NULL &&
|
|
|
|
*tmp) {
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonParseSxprSound(def, tmp) < 0)
|
2008-07-25 10:49:33 +00:00
|
|
|
goto error;
|
2008-04-28 15:14:59 +00:00
|
|
|
}
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
return def;
|
2006-02-20 17:22:16 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
no_memory:
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-07-25 10:49:33 +00:00
|
|
|
error:
|
|
|
|
VIR_FREE(tty);
|
|
|
|
virDomainDefFree(def);
|
|
|
|
return NULL;
|
2006-02-20 17:22:16 +00:00
|
|
|
}
|
2006-08-09 15:21:16 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
virDomainDefPtr
|
|
|
|
xenDaemonParseSxprString(virConnectPtr conn,
|
|
|
|
const char *sexpr,
|
|
|
|
int xendConfigVersion)
|
|
|
|
{
|
|
|
|
struct sexpr *root = string2sexpr(sexpr);
|
|
|
|
virDomainDefPtr def;
|
2006-08-24 15:05:19 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (!root)
|
|
|
|
return NULL;
|
2006-08-24 15:05:19 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
def = xenDaemonParseSxpr(conn, root, xendConfigVersion, NULL);
|
2006-08-24 15:05:19 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
sexpr_free(root);
|
2006-08-24 15:05:19 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
return def;
|
2006-08-24 15:05:19 +00:00
|
|
|
}
|
2006-02-20 17:22:16 +00:00
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
|
2006-02-20 17:22:16 +00:00
|
|
|
/**
|
2006-03-22 13:44:01 +00:00
|
|
|
* sexpr_to_xend_domain_info:
|
|
|
|
* @root: an S-Expression describing a domain
|
|
|
|
* @info: a info data structure to fill=up
|
|
|
|
*
|
|
|
|
* Internal routine filling up the info structure with the values from
|
|
|
|
* the domain root provided.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of error
|
|
|
|
*/
|
|
|
|
static int
|
Adjust sexpr-related interfaces to be const-correct.
* src/sexpr.c (sexpr_cons, append, sexpr_append, sexpr2string)
(sexpr_lookup_key, sexpr_lookup, sexpr_node, sexpr_fmt_node):
Add "const" attribute where appropriate.
* src/xend_internal.c (sexpr_int, sexpr_float, sexpr_u64)
(sexpr_uuid, sexpr_to_xend_domain_info, sexpr_to_xend_node_info)
(sexpr_to_xend_topology_xml, sexpr_to_domain): Likewise.
* src/sexpr.h: Adjust prototypes.
2008-01-21 14:22:15 +00:00
|
|
|
sexpr_to_xend_domain_info(virDomainPtr domain, const struct sexpr *root,
|
|
|
|
virDomainInfoPtr info)
|
2006-03-22 13:44:01 +00:00
|
|
|
{
|
|
|
|
const char *flags;
|
|
|
|
|
|
|
|
|
|
|
|
if ((root == NULL) || (info == NULL))
|
|
|
|
return (-1);
|
|
|
|
|
|
|
|
info->memory = sexpr_u64(root, "domain/memory") << 10;
|
|
|
|
info->maxMem = sexpr_u64(root, "domain/maxmem") << 10;
|
|
|
|
flags = sexpr_node(root, "domain/state");
|
|
|
|
|
|
|
|
if (flags) {
|
|
|
|
if (strchr(flags, 'c'))
|
|
|
|
info->state = VIR_DOMAIN_CRASHED;
|
|
|
|
else if (strchr(flags, 's'))
|
|
|
|
info->state = VIR_DOMAIN_SHUTOFF;
|
2007-03-14 13:14:50 +00:00
|
|
|
else if (strchr(flags, 'd'))
|
|
|
|
info->state = VIR_DOMAIN_SHUTDOWN;
|
2006-03-22 13:44:01 +00:00
|
|
|
else if (strchr(flags, 'p'))
|
|
|
|
info->state = VIR_DOMAIN_PAUSED;
|
|
|
|
else if (strchr(flags, 'b'))
|
|
|
|
info->state = VIR_DOMAIN_BLOCKED;
|
|
|
|
else if (strchr(flags, 'r'))
|
|
|
|
info->state = VIR_DOMAIN_RUNNING;
|
|
|
|
} else {
|
2006-12-14 01:56:14 +00:00
|
|
|
/* Inactive domains don't have a state reported, so
|
|
|
|
mark them SHUTOFF, rather than NOSTATE */
|
2007-01-22 16:25:27 +00:00
|
|
|
if (domain->id < 0)
|
2006-12-14 01:56:14 +00:00
|
|
|
info->state = VIR_DOMAIN_SHUTOFF;
|
|
|
|
else
|
|
|
|
info->state = VIR_DOMAIN_NOSTATE;
|
2006-03-22 13:44:01 +00:00
|
|
|
}
|
|
|
|
info->cpuTime = sexpr_float(root, "domain/cpu_time") * 1000000000;
|
|
|
|
info->nrVirtCpu = sexpr_int(root, "domain/vcpus");
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
2006-03-29 12:46:03 +00:00
|
|
|
/**
|
|
|
|
* sexpr_to_xend_node_info:
|
|
|
|
* @root: an S-Expression describing a domain
|
|
|
|
* @info: a info data structure to fill up
|
|
|
|
*
|
|
|
|
* Internal routine filling up the info structure with the values from
|
|
|
|
* the node root provided.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of error
|
|
|
|
*/
|
|
|
|
static int
|
Adjust sexpr-related interfaces to be const-correct.
* src/sexpr.c (sexpr_cons, append, sexpr_append, sexpr2string)
(sexpr_lookup_key, sexpr_lookup, sexpr_node, sexpr_fmt_node):
Add "const" attribute where appropriate.
* src/xend_internal.c (sexpr_int, sexpr_float, sexpr_u64)
(sexpr_uuid, sexpr_to_xend_domain_info, sexpr_to_xend_node_info)
(sexpr_to_xend_topology_xml, sexpr_to_domain): Likewise.
* src/sexpr.h: Adjust prototypes.
2008-01-21 14:22:15 +00:00
|
|
|
sexpr_to_xend_node_info(const struct sexpr *root, virNodeInfoPtr info)
|
2006-03-29 12:46:03 +00:00
|
|
|
{
|
|
|
|
const char *machine;
|
|
|
|
|
|
|
|
|
|
|
|
if ((root == NULL) || (info == NULL))
|
|
|
|
return (-1);
|
|
|
|
|
|
|
|
machine = sexpr_node(root, "node/machine");
|
2007-12-17 23:04:33 +00:00
|
|
|
if (machine == NULL) {
|
2006-03-29 12:46:03 +00:00
|
|
|
info->model[0] = 0;
|
2007-12-17 23:04:33 +00:00
|
|
|
} else {
|
2006-03-29 12:46:03 +00:00
|
|
|
snprintf(&info->model[0], sizeof(info->model) - 1, "%s", machine);
|
2007-12-17 23:04:33 +00:00
|
|
|
info->model[sizeof(info->model) - 1] = 0;
|
2006-03-29 12:46:03 +00:00
|
|
|
}
|
|
|
|
info->memory = (unsigned long) sexpr_u64(root, "node/total_memory") << 10;
|
|
|
|
|
|
|
|
info->cpus = sexpr_int(root, "node/nr_cpus");
|
|
|
|
info->mhz = sexpr_int(root, "node/cpu_mhz");
|
|
|
|
info->nodes = sexpr_int(root, "node/nr_nodes");
|
|
|
|
info->sockets = sexpr_int(root, "node/sockets_per_node");
|
2008-01-20 15:56:49 +00:00
|
|
|
info->cores = sexpr_int(root, "node/cores_per_socket");
|
|
|
|
info->threads = sexpr_int(root, "node/threads_per_core");
|
|
|
|
|
2007-12-17 23:04:33 +00:00
|
|
|
/* Xen 3.2.0 replaces sockets_per_node with 'nr_cpus'.
|
|
|
|
* Old Xen calculated sockets_per_node using its internal
|
|
|
|
* nr_cpus / (nodes*cores*threads), so fake it ourselves
|
|
|
|
* in the same way
|
|
|
|
*/
|
|
|
|
if (info->sockets == 0) {
|
|
|
|
int nr_cpus = sexpr_int(root, "node/nr_cpus");
|
2008-01-20 15:56:49 +00:00
|
|
|
int procs = info->nodes * info->cores * info->threads;
|
|
|
|
if (procs == 0) /* Sanity check in case of Xen bugs in futures..*/
|
|
|
|
return (-1);
|
|
|
|
info->sockets = nr_cpus / procs;
|
|
|
|
/* Should already be fine, but for further sanity make
|
2007-12-17 23:04:33 +00:00
|
|
|
* sure we have at least one socket
|
|
|
|
*/
|
|
|
|
if (info->sockets == 0)
|
|
|
|
info->sockets = 1;
|
|
|
|
}
|
2006-03-29 12:46:03 +00:00
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
2008-02-27 04:35:08 +00:00
|
|
|
|
2007-09-28 14:28:12 +00:00
|
|
|
/**
|
2008-02-27 04:35:08 +00:00
|
|
|
* sexpr_to_xend_topology
|
2007-09-28 14:28:12 +00:00
|
|
|
* @root: an S-Expression describing a node
|
2008-02-27 04:35:08 +00:00
|
|
|
* @caps: capability info
|
2007-09-28 14:28:12 +00:00
|
|
|
*
|
2008-02-27 04:35:08 +00:00
|
|
|
* Internal routine populating capability info with
|
|
|
|
* NUMA node mapping details
|
2007-09-28 14:28:12 +00:00
|
|
|
*
|
2009-01-19 20:16:10 +00:00
|
|
|
* Does nothing when the system doesn't support NUMA (not an error).
|
|
|
|
*
|
2007-09-28 14:28:12 +00:00
|
|
|
* Returns 0 in case of success, -1 in case of error
|
|
|
|
*/
|
2008-02-05 19:27:37 +00:00
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
sexpr_to_xend_topology(const struct sexpr *root,
|
2008-02-27 04:35:08 +00:00
|
|
|
virCapsPtr caps)
|
2007-09-28 14:28:12 +00:00
|
|
|
{
|
|
|
|
const char *nodeToCpu;
|
2008-02-27 04:35:08 +00:00
|
|
|
const char *cur;
|
|
|
|
char *cpuset = NULL;
|
|
|
|
int *cpuNums = NULL;
|
|
|
|
int cell, cpu, nb_cpus;
|
|
|
|
int n = 0;
|
2007-09-28 14:28:12 +00:00
|
|
|
int numCpus;
|
|
|
|
|
|
|
|
nodeToCpu = sexpr_node(root, "node/node_to_cpu");
|
2009-01-19 20:16:10 +00:00
|
|
|
if (nodeToCpu == NULL)
|
|
|
|
return 0; /* no NUMA support */
|
2007-09-28 14:28:12 +00:00
|
|
|
|
|
|
|
numCpus = sexpr_int(root, "node/nr_cpus");
|
|
|
|
|
2008-02-27 04:35:08 +00:00
|
|
|
|
2008-05-29 19:20:22 +00:00
|
|
|
if (VIR_ALLOC_N(cpuset, numCpus) < 0)
|
2008-02-27 04:35:08 +00:00
|
|
|
goto memory_error;
|
2008-05-29 19:20:22 +00:00
|
|
|
if (VIR_ALLOC_N(cpuNums, numCpus) < 0)
|
2008-02-27 04:35:08 +00:00
|
|
|
goto memory_error;
|
|
|
|
|
|
|
|
cur = nodeToCpu;
|
|
|
|
while (*cur != 0) {
|
|
|
|
/*
|
|
|
|
* Find the next NUMA cell described in the xend output
|
|
|
|
*/
|
|
|
|
cur = strstr(cur, "node");
|
|
|
|
if (cur == NULL)
|
|
|
|
break;
|
|
|
|
cur += 4;
|
|
|
|
cell = virParseNumber(&cur);
|
|
|
|
if (cell < 0)
|
|
|
|
goto parse_error;
|
|
|
|
virSkipSpaces(&cur);
|
|
|
|
if (*cur != ':')
|
|
|
|
goto parse_error;
|
|
|
|
cur++;
|
|
|
|
virSkipSpaces(&cur);
|
2008-05-15 14:21:34 +00:00
|
|
|
if (STRPREFIX(cur, "no cpus")) {
|
2008-02-27 04:35:08 +00:00
|
|
|
nb_cpus = 0;
|
|
|
|
for (cpu = 0; cpu < numCpus; cpu++)
|
|
|
|
cpuset[cpu] = 0;
|
|
|
|
} else {
|
2010-02-09 18:58:01 +00:00
|
|
|
nb_cpus = virDomainCpuSetParse(&cur, 'n', cpuset, numCpus);
|
2008-02-27 04:35:08 +00:00
|
|
|
if (nb_cpus < 0)
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (n = 0, cpu = 0; cpu < numCpus; cpu++)
|
|
|
|
if (cpuset[cpu] == 1)
|
|
|
|
cpuNums[n++] = cpu;
|
|
|
|
|
|
|
|
if (virCapabilitiesAddHostNUMACell(caps,
|
|
|
|
cell,
|
|
|
|
nb_cpus,
|
|
|
|
cpuNums) < 0)
|
|
|
|
goto memory_error;
|
|
|
|
}
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(cpuNums);
|
|
|
|
VIR_FREE(cpuset);
|
2007-09-28 14:28:12 +00:00
|
|
|
return (0);
|
2008-02-05 19:27:37 +00:00
|
|
|
|
2008-02-27 04:35:08 +00:00
|
|
|
parse_error:
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_XEN_CALL, "%s", _("topology syntax error"));
|
2008-02-27 04:35:08 +00:00
|
|
|
error:
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(cpuNums);
|
|
|
|
VIR_FREE(cpuset);
|
2007-09-28 14:28:12 +00:00
|
|
|
|
2008-02-27 04:35:08 +00:00
|
|
|
return (-1);
|
2008-02-05 19:27:37 +00:00
|
|
|
|
2008-02-27 04:35:08 +00:00
|
|
|
memory_error:
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(cpuNums);
|
|
|
|
VIR_FREE(cpuset);
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2007-09-28 14:28:12 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
2008-02-27 04:35:08 +00:00
|
|
|
|
2006-07-20 13:59:23 +00:00
|
|
|
#ifndef PROXY
|
2006-03-23 15:42:10 +00:00
|
|
|
/**
|
|
|
|
* sexpr_to_domain:
|
|
|
|
* @conn: an existing virtual connection block
|
|
|
|
* @root: an S-Expression describing a domain
|
|
|
|
*
|
|
|
|
* Internal routine returning the associated virDomainPtr for this domain
|
|
|
|
*
|
|
|
|
* Returns the domain pointer or NULL in case of error.
|
|
|
|
*/
|
|
|
|
static virDomainPtr
|
Adjust sexpr-related interfaces to be const-correct.
* src/sexpr.c (sexpr_cons, append, sexpr_append, sexpr2string)
(sexpr_lookup_key, sexpr_lookup, sexpr_node, sexpr_fmt_node):
Add "const" attribute where appropriate.
* src/xend_internal.c (sexpr_int, sexpr_float, sexpr_u64)
(sexpr_uuid, sexpr_to_xend_domain_info, sexpr_to_xend_node_info)
(sexpr_to_xend_topology_xml, sexpr_to_domain): Likewise.
* src/sexpr.h: Adjust prototypes.
2008-01-21 14:22:15 +00:00
|
|
|
sexpr_to_domain(virConnectPtr conn, const struct sexpr *root)
|
2006-03-23 15:42:10 +00:00
|
|
|
{
|
2006-04-09 13:11:22 +00:00
|
|
|
virDomainPtr ret = NULL;
|
2007-08-09 20:19:12 +00:00
|
|
|
unsigned char uuid[VIR_UUID_BUFLEN];
|
2006-03-23 15:42:10 +00:00
|
|
|
const char *name;
|
2006-12-14 01:56:14 +00:00
|
|
|
const char *tmp;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2006-03-23 15:42:10 +00:00
|
|
|
|
|
|
|
if ((conn == NULL) || (root == NULL))
|
|
|
|
return(NULL);
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
priv = (xenUnifiedPrivatePtr) conn->privateData;
|
|
|
|
|
2007-08-09 20:19:12 +00:00
|
|
|
if (sexpr_uuid(uuid, root, "domain/uuid") < 0)
|
2006-04-09 13:11:22 +00:00
|
|
|
goto error;
|
|
|
|
name = sexpr_node(root, "domain/name");
|
|
|
|
if (name == NULL)
|
|
|
|
goto error;
|
|
|
|
|
2007-08-09 20:19:12 +00:00
|
|
|
ret = virGetDomain(conn, name, uuid);
|
2007-07-06 15:02:09 +00:00
|
|
|
if (ret == NULL) return NULL;
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
tmp = sexpr_node(root, "domain/domid");
|
|
|
|
/* New 3.0.4 XenD will not report a domid for inactive domains,
|
|
|
|
* so only error out for old XenD
|
|
|
|
*/
|
2007-04-04 14:19:49 +00:00
|
|
|
if (!tmp && priv->xendConfigVersion < 3)
|
2006-03-23 15:42:10 +00:00
|
|
|
goto error;
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
if (tmp)
|
2007-01-22 16:25:27 +00:00
|
|
|
ret->id = sexpr_int(root, "domain/domid");
|
2006-12-14 01:56:14 +00:00
|
|
|
else
|
2007-01-22 16:25:27 +00:00
|
|
|
ret->id = -1; /* An inactive domain */
|
2006-12-14 01:56:14 +00:00
|
|
|
|
2006-03-23 15:42:10 +00:00
|
|
|
return (ret);
|
2006-04-09 13:11:22 +00:00
|
|
|
|
2006-03-23 15:42:10 +00:00
|
|
|
error:
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("failed to parse Xend domain information"));
|
2006-04-09 13:11:22 +00:00
|
|
|
if (ret != NULL)
|
2008-01-21 16:29:10 +00:00
|
|
|
virUnrefDomain(ret);
|
2006-03-23 15:42:10 +00:00
|
|
|
return(NULL);
|
|
|
|
}
|
2006-07-20 13:59:23 +00:00
|
|
|
#endif /* !PROXY */
|
2006-03-22 13:44:01 +00:00
|
|
|
|
|
|
|
/*****************************************************************
|
|
|
|
******
|
|
|
|
******
|
|
|
|
******
|
|
|
|
******
|
|
|
|
Refactored
|
|
|
|
******
|
|
|
|
******
|
|
|
|
******
|
|
|
|
******
|
|
|
|
*****************************************************************/
|
2006-07-20 13:59:23 +00:00
|
|
|
#ifndef PROXY
|
2006-03-22 13:44:01 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonOpen:
|
|
|
|
* @conn: an existing virtual connection block
|
|
|
|
* @name: optional argument to select a connection type
|
|
|
|
* @flags: combination of virDrvOpenFlag(s)
|
|
|
|
*
|
|
|
|
* Creates a localhost Xen Daemon connection
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of error.
|
|
|
|
*/
|
2008-12-17 21:26:16 +00:00
|
|
|
virDrvOpenStatus
|
2007-12-05 18:28:05 +00:00
|
|
|
xenDaemonOpen(virConnectPtr conn,
|
|
|
|
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
|
2007-04-30 17:30:11 +00:00
|
|
|
int flags ATTRIBUTE_UNUSED)
|
2006-03-22 13:44:01 +00:00
|
|
|
{
|
2009-01-29 23:01:37 +00:00
|
|
|
char *port = NULL;
|
|
|
|
int ret = VIR_DRV_OPEN_ERROR;
|
2007-11-14 11:40:57 +00:00
|
|
|
|
|
|
|
/* Switch on the scheme, which we expect to be NULL (file),
|
|
|
|
* "http" or "xen".
|
2007-04-04 14:19:49 +00:00
|
|
|
*/
|
2008-11-17 11:44:51 +00:00
|
|
|
if (conn->uri->scheme == NULL) {
|
2007-11-14 11:40:57 +00:00
|
|
|
/* It should be a file access */
|
2008-11-17 11:44:51 +00:00
|
|
|
if (conn->uri->path == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_CONNECT, __FUNCTION__);
|
2007-11-14 11:40:57 +00:00
|
|
|
goto failed;
|
|
|
|
}
|
2009-01-29 23:01:37 +00:00
|
|
|
if (xenDaemonOpen_unix(conn, conn->uri->path) < 0 ||
|
|
|
|
xend_detect_config_version(conn) == -1)
|
2007-11-14 11:40:57 +00:00
|
|
|
goto failed;
|
|
|
|
}
|
2008-11-17 11:44:51 +00:00
|
|
|
else if (STRCASEEQ (conn->uri->scheme, "xen")) {
|
2006-07-06 09:29:34 +00:00
|
|
|
/*
|
2007-04-04 14:19:49 +00:00
|
|
|
* try first to open the unix socket
|
|
|
|
*/
|
2009-01-29 23:01:37 +00:00
|
|
|
if (xenDaemonOpen_unix(conn, "/var/lib/xend/xend-socket") == 0 &&
|
|
|
|
xend_detect_config_version(conn) != -1)
|
2007-04-04 14:19:49 +00:00
|
|
|
goto done;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* try though http on port 8000
|
|
|
|
*/
|
2009-01-29 23:01:37 +00:00
|
|
|
if (xenDaemonOpen_tcp(conn, "localhost", "8000") < 0 ||
|
|
|
|
xend_detect_config_version(conn) == -1)
|
2007-04-04 14:19:49 +00:00
|
|
|
goto failed;
|
2008-11-17 11:44:51 +00:00
|
|
|
} else if (STRCASEEQ (conn->uri->scheme, "http")) {
|
2009-06-12 12:06:15 +00:00
|
|
|
if (conn->uri->port &&
|
2009-11-08 21:08:54 +00:00
|
|
|
virAsprintf(&port, "%d", conn->uri->port) == -1) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-01-22 19:41:48 +00:00
|
|
|
goto failed;
|
2009-11-08 21:08:54 +00:00
|
|
|
}
|
2009-01-29 23:01:37 +00:00
|
|
|
|
2009-06-12 12:06:15 +00:00
|
|
|
if (xenDaemonOpen_tcp(conn,
|
|
|
|
conn->uri->server ? conn->uri->server : "localhost",
|
|
|
|
port ? port : "8000") < 0 ||
|
2009-01-29 23:01:37 +00:00
|
|
|
xend_detect_config_version(conn) == -1)
|
2007-04-04 14:19:49 +00:00
|
|
|
goto failed;
|
2007-11-14 11:40:57 +00:00
|
|
|
} else {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_CONNECT, __FUNCTION__);
|
2007-11-14 11:40:57 +00:00
|
|
|
goto failed;
|
2006-06-12 22:21:04 +00:00
|
|
|
}
|
2006-03-22 13:44:01 +00:00
|
|
|
|
2007-04-13 00:43:57 +00:00
|
|
|
done:
|
2009-01-29 23:01:37 +00:00
|
|
|
ret = VIR_DRV_OPEN_SUCCESS;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2006-07-06 09:29:34 +00:00
|
|
|
failed:
|
2009-01-29 23:01:37 +00:00
|
|
|
VIR_FREE(port);
|
|
|
|
return ret;
|
2006-03-22 13:44:01 +00:00
|
|
|
}
|
2006-08-09 15:21:16 +00:00
|
|
|
|
2006-03-22 13:44:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonClose:
|
|
|
|
* @conn: an existing virtual connection block
|
|
|
|
*
|
|
|
|
* This method should be called when a connection to xend instance
|
|
|
|
* initialized with xenDaemonOpen is no longer needed
|
|
|
|
* to free the associated resources.
|
|
|
|
*
|
2007-04-04 14:19:49 +00:00
|
|
|
* Returns 0 in case of success, -1 in case of error
|
2006-03-22 13:44:01 +00:00
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonClose(virConnectPtr conn ATTRIBUTE_UNUSED)
|
|
|
|
{
|
2007-04-04 14:19:49 +00:00
|
|
|
return 0;
|
2006-03-22 13:44:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonDomainSuspend:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
*
|
|
|
|
* Pause the domain, the domain is not scheduled anymore though its resources
|
|
|
|
* are preserved. Use xenDaemonDomainResume() to resume execution.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 (with errno) in case of error.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainSuspend(virDomainPtr domain)
|
|
|
|
{
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-22 13:44:01 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2009-02-05 17:24:51 +00:00
|
|
|
|
|
|
|
if (domain->id < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID,
|
2009-02-05 17:24:51 +00:00
|
|
|
_("Domain %s isn't running."), domain->name);
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
2009-02-05 17:24:51 +00:00
|
|
|
}
|
|
|
|
|
2006-03-22 13:44:01 +00:00
|
|
|
return xend_op(domain->conn, domain->name, "op", "pause", NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonDomainResume:
|
|
|
|
* @xend: pointer to the Xem Daemon block
|
|
|
|
* @name: name for the domain
|
|
|
|
*
|
|
|
|
* Resume the domain after xenDaemonDomainSuspend() has been called
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 (with errno) in case of error.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainResume(virDomainPtr domain)
|
|
|
|
{
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-22 13:44:01 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2009-02-05 17:24:51 +00:00
|
|
|
|
|
|
|
if (domain->id < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID,
|
2009-02-05 17:24:51 +00:00
|
|
|
_("Domain %s isn't running."), domain->name);
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
2009-02-05 17:24:51 +00:00
|
|
|
}
|
|
|
|
|
2006-03-22 13:44:01 +00:00
|
|
|
return xend_op(domain->conn, domain->name, "op", "unpause", NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonDomainShutdown:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
*
|
|
|
|
* Shutdown the domain, the OS is requested to properly shutdown
|
|
|
|
* and the domain may ignore it. It will return immediately
|
|
|
|
* after queuing the request.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 (with errno) in case of error.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainShutdown(virDomainPtr domain)
|
|
|
|
{
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-22 13:44:01 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2009-02-05 17:24:51 +00:00
|
|
|
|
|
|
|
if (domain->id < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID,
|
2009-02-05 17:24:51 +00:00
|
|
|
_("Domain %s isn't running."), domain->name);
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
2009-02-05 17:24:51 +00:00
|
|
|
}
|
|
|
|
|
2008-09-04 09:07:42 +00:00
|
|
|
return xend_op(domain->conn, domain->name, "op", "shutdown", "reason", "poweroff", NULL);
|
2006-03-22 13:44:01 +00:00
|
|
|
}
|
|
|
|
|
2006-04-03 13:46:43 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainReboot:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
* @flags: extra flags for the reboot operation, not used yet
|
|
|
|
*
|
|
|
|
* Reboot the domain, the OS is requested to properly shutdown
|
|
|
|
* and restart but the domain may ignore it. It will return immediately
|
|
|
|
* after queuing the request.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 (with errno) in case of error.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainReboot(virDomainPtr domain, unsigned int flags ATTRIBUTE_UNUSED)
|
|
|
|
{
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-04-03 13:46:43 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2009-02-05 17:24:51 +00:00
|
|
|
|
|
|
|
if (domain->id < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID,
|
2009-02-05 17:24:51 +00:00
|
|
|
_("Domain %s isn't running."), domain->name);
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
2009-02-05 17:24:51 +00:00
|
|
|
}
|
|
|
|
|
2006-04-03 13:46:43 +00:00
|
|
|
return xend_op(domain->conn, domain->name, "op", "shutdown", "reason", "reboot", NULL);
|
|
|
|
}
|
|
|
|
|
2006-03-22 13:44:01 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainDestroy:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
*
|
|
|
|
* Abruptly halt the domain, the OS is not properly shutdown and the
|
|
|
|
* resources allocated for the domain are immediately freed, mounted
|
|
|
|
* filesystems will be marked as uncleanly shutdown.
|
|
|
|
* After calling this function, the domain's status will change to
|
|
|
|
* dying and will go away completely once all of the resources have been
|
|
|
|
* unmapped (usually from the backend devices).
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 (with errno) in case of error.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainDestroy(virDomainPtr domain)
|
|
|
|
{
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-22 13:44:01 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2009-02-05 17:24:51 +00:00
|
|
|
|
|
|
|
if (domain->id < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID,
|
2009-02-05 17:24:51 +00:00
|
|
|
_("Domain %s isn't running."), domain->name);
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
2009-02-05 17:24:51 +00:00
|
|
|
}
|
|
|
|
|
2006-03-22 13:44:01 +00:00
|
|
|
return xend_op(domain->conn, domain->name, "op", "destroy", NULL);
|
|
|
|
}
|
|
|
|
|
2007-04-13 00:43:57 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainGetOSType:
|
|
|
|
* @domain: a domain object
|
|
|
|
*
|
|
|
|
* Get the type of domain operation system.
|
|
|
|
*
|
|
|
|
* Returns the new string or NULL in case of error, the string must be
|
|
|
|
* freed by the caller.
|
|
|
|
*/
|
|
|
|
static char *
|
|
|
|
xenDaemonDomainGetOSType(virDomainPtr domain)
|
|
|
|
{
|
|
|
|
char *type;
|
|
|
|
struct sexpr *root;
|
|
|
|
xenUnifiedPrivatePtr priv;
|
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2007-04-13 00:43:57 +00:00
|
|
|
return(NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
|
|
|
if (domain->id < 0 && priv->xendConfigVersion < 3)
|
|
|
|
return(NULL);
|
|
|
|
|
|
|
|
/* can we ask for a subset ? worth it ? */
|
|
|
|
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
|
|
|
|
if (root == NULL)
|
|
|
|
return(NULL);
|
|
|
|
|
|
|
|
if (sexpr_lookup(root, "domain/image/hvm")) {
|
|
|
|
type = strdup("hvm");
|
|
|
|
} else {
|
|
|
|
type = strdup("linux");
|
|
|
|
}
|
|
|
|
|
2009-11-08 21:08:54 +00:00
|
|
|
if (type == NULL)
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-11-08 21:08:54 +00:00
|
|
|
|
2007-04-13 00:43:57 +00:00
|
|
|
sexpr_free(root);
|
|
|
|
|
|
|
|
return(type);
|
|
|
|
}
|
|
|
|
|
2006-03-22 13:44:01 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainSave:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
* @filename: path for the output file
|
|
|
|
*
|
|
|
|
* This method will suspend a domain and save its memory contents to
|
|
|
|
* a file on disk. Use xenDaemonDomainRestore() to restore a domain after
|
|
|
|
* saving.
|
|
|
|
* Note that for remote Xen Daemon the file path will be interpreted in
|
|
|
|
* the remote host.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 (with errno) in case of error.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainSave(virDomainPtr domain, const char *filename)
|
|
|
|
{
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
|
2009-02-05 17:24:51 +00:00
|
|
|
(filename == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-22 13:44:01 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2008-02-05 19:27:37 +00:00
|
|
|
|
2009-02-05 17:24:51 +00:00
|
|
|
if (domain->id < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID,
|
2009-02-05 17:24:51 +00:00
|
|
|
_("Domain %s isn't running."), domain->name);
|
|
|
|
return(-1);
|
|
|
|
}
|
2007-04-24 13:44:16 +00:00
|
|
|
|
|
|
|
/* We can't save the state of Domain-0, that would mean stopping it too */
|
|
|
|
if (domain->id == 0) {
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
2007-04-24 13:44:16 +00:00
|
|
|
}
|
|
|
|
|
2006-03-22 13:44:01 +00:00
|
|
|
return xend_op(domain->conn, domain->name, "op", "save", "file", filename, NULL);
|
|
|
|
}
|
|
|
|
|
2006-11-22 17:48:29 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainCoreDump:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
* @filename: path for the output file
|
|
|
|
* @flags: extra flags, currently unused
|
|
|
|
*
|
|
|
|
* This method will dump the core of a domain on a given file for analysis.
|
|
|
|
* Note that for remote Xen Daemon the file path will be interpreted in
|
|
|
|
* the remote host.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of error.
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
xenDaemonDomainCoreDump(virDomainPtr domain, const char *filename,
|
|
|
|
int flags ATTRIBUTE_UNUSED)
|
|
|
|
{
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
|
|
|
|
(filename == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-11-22 17:48:29 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2009-02-05 17:24:51 +00:00
|
|
|
|
|
|
|
if (domain->id < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID,
|
2009-02-05 17:24:51 +00:00
|
|
|
_("Domain %s isn't running."), domain->name);
|
2006-11-22 17:48:29 +00:00
|
|
|
return(-1);
|
2009-02-05 17:24:51 +00:00
|
|
|
}
|
|
|
|
|
2009-12-14 10:59:27 +00:00
|
|
|
return xend_op(domain->conn, domain->name,
|
|
|
|
"op", "dump", "file", filename, "live", "0",
|
2009-12-14 11:10:38 +00:00
|
|
|
"live", (flags & VIR_DUMP_LIVE ? "1" : "0"),
|
2009-12-14 10:59:27 +00:00
|
|
|
"crash", (flags & VIR_DUMP_CRASH ? "1" : "0"),
|
|
|
|
NULL);
|
2006-11-22 17:48:29 +00:00
|
|
|
}
|
|
|
|
|
2006-03-22 13:44:01 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainRestore:
|
|
|
|
* @conn: pointer to the Xem Daemon block
|
|
|
|
* @filename: path for the output file
|
|
|
|
*
|
|
|
|
* This method will restore a domain saved to disk by xenDaemonDomainSave().
|
|
|
|
* Note that for remote Xen Daemon the file path will be interpreted in
|
|
|
|
* the remote host.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 (with errno) in case of error.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainRestore(virConnectPtr conn, const char *filename)
|
|
|
|
{
|
|
|
|
if ((conn == NULL) || (filename == NULL)) {
|
|
|
|
/* this should be caught at the interface but ... */
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-22 13:44:01 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
return xend_op(conn, "", "op", "restore", "file", filename, NULL);
|
|
|
|
}
|
2006-08-09 15:21:16 +00:00
|
|
|
#endif /* !PROXY */
|
2006-03-22 13:44:01 +00:00
|
|
|
|
2006-03-23 15:42:10 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainGetMaxMemory:
|
|
|
|
* @domain: pointer to the domain block
|
|
|
|
*
|
|
|
|
* Ask the Xen Daemon for the maximum memory allowed for a domain
|
|
|
|
*
|
|
|
|
* Returns the memory size in kilobytes or 0 in case of error.
|
|
|
|
*/
|
|
|
|
unsigned long
|
|
|
|
xenDaemonDomainGetMaxMemory(virDomainPtr domain)
|
|
|
|
{
|
|
|
|
unsigned long ret = 0;
|
|
|
|
struct sexpr *root;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2006-03-23 15:42:10 +00:00
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-23 15:42:10 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
|
|
|
if (domain->id < 0 && priv->xendConfigVersion < 3)
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
2006-03-23 15:42:10 +00:00
|
|
|
|
|
|
|
/* can we ask for a subset ? worth it ? */
|
|
|
|
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
|
|
|
|
if (root == NULL)
|
|
|
|
return(0);
|
|
|
|
|
|
|
|
ret = (unsigned long) sexpr_u64(root, "domain/memory") << 10;
|
|
|
|
sexpr_free(root);
|
|
|
|
|
|
|
|
return(ret);
|
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#ifndef PROXY
|
2006-03-22 13:44:01 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainSetMaxMemory:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
* @memory: The maximum memory in kilobytes
|
|
|
|
*
|
|
|
|
* This method will set the maximum amount of memory that can be allocated to
|
|
|
|
* a domain. Please note that a domain is able to allocate up to this amount
|
2006-04-13 17:18:49 +00:00
|
|
|
* on its own.
|
2006-03-22 13:44:01 +00:00
|
|
|
*
|
|
|
|
* Returns 0 for success; -1 (with errno) on error
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainSetMaxMemory(virDomainPtr domain, unsigned long memory)
|
|
|
|
{
|
|
|
|
char buf[1024];
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2006-03-22 13:44:01 +00:00
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-22 13:44:01 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
|
|
|
if (domain->id < 0 && priv->xendConfigVersion < 3)
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
|
|
|
|
2006-03-22 13:44:01 +00:00
|
|
|
snprintf(buf, sizeof(buf), "%lu", memory >> 10);
|
|
|
|
return xend_op(domain->conn, domain->name, "op", "maxmem_set", "memory",
|
|
|
|
buf, NULL);
|
|
|
|
}
|
|
|
|
|
2006-04-13 17:18:49 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainSetMemory:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
* @memory: The target memory in kilobytes
|
|
|
|
*
|
|
|
|
* This method will set a target memory allocation for a given domain and
|
|
|
|
* request that the guest meet this target. The guest may or may not actually
|
|
|
|
* achieve this target. When this function returns, it does not signify that
|
|
|
|
* the domain has actually reached that target.
|
|
|
|
*
|
|
|
|
* Memory for a domain can only be allocated up to the maximum memory setting.
|
|
|
|
* There is no safe guard for allocations that are too small so be careful
|
|
|
|
* when using this function to reduce a domain's memory usage.
|
|
|
|
*
|
|
|
|
* Returns 0 for success; -1 (with errno) on error
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainSetMemory(virDomainPtr domain, unsigned long memory)
|
|
|
|
{
|
|
|
|
char buf[1024];
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2006-04-13 17:18:49 +00:00
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-04-13 17:18:49 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
|
|
|
if (domain->id < 0 && priv->xendConfigVersion < 3)
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
|
|
|
|
2006-04-13 17:18:49 +00:00
|
|
|
snprintf(buf, sizeof(buf), "%lu", memory >> 10);
|
|
|
|
return xend_op(domain->conn, domain->name, "op", "mem_target_set",
|
|
|
|
"target", buf, NULL);
|
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#endif /* ! PROXY */
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainDefPtr
|
|
|
|
xenDaemonDomainFetch(virConnectPtr conn,
|
|
|
|
int domid,
|
|
|
|
const char *name,
|
|
|
|
const char *cpus)
|
2006-12-14 01:56:14 +00:00
|
|
|
{
|
|
|
|
struct sexpr *root;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2008-07-25 10:49:33 +00:00
|
|
|
virDomainDefPtr def;
|
2006-12-14 01:56:14 +00:00
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
if (name)
|
|
|
|
root = sexpr_get(conn, "/xend/domain/%s?detail=1", name);
|
|
|
|
else
|
|
|
|
root = sexpr_get(conn, "/xend/domain/%d?detail=1", domid);
|
2007-06-21 15:49:09 +00:00
|
|
|
if (root == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_XEN_CALL,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("xenDaemonDomainFetch failed to"
|
2008-02-04 19:31:30 +00:00
|
|
|
" find this domain"));
|
2006-09-12 01:16:22 +00:00
|
|
|
return (NULL);
|
2007-06-21 15:49:09 +00:00
|
|
|
}
|
2006-09-12 01:16:22 +00:00
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
priv = (xenUnifiedPrivatePtr) conn->privateData;
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
if (!(def = xenDaemonParseSxpr(conn,
|
|
|
|
root,
|
|
|
|
priv->xendConfigVersion,
|
2008-07-25 10:49:33 +00:00
|
|
|
cpus)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
cleanup:
|
2006-08-09 15:21:16 +00:00
|
|
|
sexpr_free(root);
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
return (def);
|
2006-08-09 15:21:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-07-20 13:59:23 +00:00
|
|
|
#ifndef PROXY
|
2006-03-22 13:44:01 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainDumpXML:
|
2006-02-20 17:22:16 +00:00
|
|
|
* @domain: a domain object
|
2007-10-31 09:39:13 +00:00
|
|
|
* @flags: potential dump flags
|
|
|
|
* @cpus: list of cpu the domain is pinned to.
|
2006-02-20 17:22:16 +00:00
|
|
|
*
|
2006-02-20 23:08:47 +00:00
|
|
|
* Provide an XML description of the domain.
|
2006-02-20 17:22:16 +00:00
|
|
|
*
|
|
|
|
* Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of error.
|
|
|
|
* the caller must free() the returned value.
|
|
|
|
*/
|
|
|
|
char *
|
2007-10-31 09:39:13 +00:00
|
|
|
xenDaemonDomainDumpXML(virDomainPtr domain, int flags, const char *cpus)
|
2006-03-15 12:13:25 +00:00
|
|
|
{
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainDefPtr def;
|
|
|
|
char *xml;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2006-03-22 13:44:01 +00:00
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-22 13:44:01 +00:00
|
|
|
return(NULL);
|
2006-02-27 19:56:23 +00:00
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
2007-06-21 15:49:09 +00:00
|
|
|
if (domain->id < 0 && priv->xendConfigVersion < 3) {
|
2008-04-10 16:54:54 +00:00
|
|
|
// fall-through to the next driver to handle
|
2006-11-15 21:03:34 +00:00
|
|
|
return(NULL);
|
2007-06-21 15:49:09 +00:00
|
|
|
}
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
if (!(def = xenDaemonDomainFetch(domain->conn,
|
|
|
|
domain->id,
|
|
|
|
domain->name,
|
|
|
|
cpus)))
|
|
|
|
return(NULL);
|
|
|
|
|
2010-02-09 18:58:01 +00:00
|
|
|
xml = virDomainDefFormat(def, flags);
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
virDomainDefFree(def);
|
|
|
|
|
|
|
|
return xml;
|
2006-02-20 17:22:16 +00:00
|
|
|
}
|
2006-07-20 13:59:23 +00:00
|
|
|
#endif /* !PROXY */
|
2006-03-22 13:44:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonDomainGetInfo:
|
|
|
|
* @domain: a domain object
|
|
|
|
* @info: pointer to a virDomainInfo structure allocated by the user
|
|
|
|
*
|
|
|
|
* This method looks up information about a domain and update the
|
|
|
|
* information block provided.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of error
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
|
|
|
|
{
|
|
|
|
struct sexpr *root;
|
|
|
|
int ret;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2006-03-22 13:44:01 +00:00
|
|
|
|
2006-03-23 15:42:10 +00:00
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL) ||
|
|
|
|
(info == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-23 15:42:10 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
|
|
|
if (domain->id < 0 && priv->xendConfigVersion < 3)
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
2006-03-22 13:44:01 +00:00
|
|
|
|
|
|
|
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
|
|
|
|
if (root == NULL)
|
|
|
|
return (-1);
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
ret = sexpr_to_xend_domain_info(domain, root, info);
|
2006-03-22 13:44:01 +00:00
|
|
|
sexpr_free(root);
|
|
|
|
return (ret);
|
|
|
|
}
|
|
|
|
|
2006-07-20 13:59:23 +00:00
|
|
|
#ifndef PROXY
|
2006-03-23 15:42:10 +00:00
|
|
|
/**
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
* xenDaemonLookupByName:
|
2006-03-23 15:42:10 +00:00
|
|
|
* @conn: A xend instance
|
|
|
|
* @name: The name of the domain
|
|
|
|
*
|
|
|
|
* This method looks up information about a domain and returns
|
|
|
|
* it in the form of a struct xend_domain. This should be
|
|
|
|
* free()'d when no longer needed.
|
|
|
|
*
|
|
|
|
* Returns domain info on success; NULL (with errno) on error
|
|
|
|
*/
|
|
|
|
virDomainPtr
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
xenDaemonLookupByName(virConnectPtr conn, const char *domname)
|
2006-03-23 15:42:10 +00:00
|
|
|
{
|
|
|
|
struct sexpr *root;
|
|
|
|
virDomainPtr ret = NULL;
|
|
|
|
|
|
|
|
if ((conn == NULL) || (domname == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-12-14 01:56:14 +00:00
|
|
|
return(NULL);
|
2006-03-23 15:42:10 +00:00
|
|
|
}
|
2006-12-14 01:56:14 +00:00
|
|
|
|
2006-03-23 15:42:10 +00:00
|
|
|
root = sexpr_get(conn, "/xend/domain/%s?detail=1", domname);
|
|
|
|
if (root == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
ret = sexpr_to_domain(conn, root);
|
|
|
|
|
|
|
|
error:
|
|
|
|
sexpr_free(root);
|
|
|
|
return(ret);
|
|
|
|
}
|
2006-08-09 15:21:16 +00:00
|
|
|
#endif /* ! PROXY */
|
2006-03-23 15:42:10 +00:00
|
|
|
|
2006-03-29 12:46:03 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonNodeGetInfo:
|
|
|
|
* @conn: pointer to the Xen Daemon block
|
|
|
|
* @info: pointer to a virNodeInfo structure allocated by the user
|
2008-02-05 19:27:37 +00:00
|
|
|
*
|
2006-03-29 12:46:03 +00:00
|
|
|
* Extract hardware information about the node.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success and -1 in case of failure.
|
|
|
|
*/
|
2006-07-03 11:12:12 +00:00
|
|
|
int
|
2006-03-29 12:46:03 +00:00
|
|
|
xenDaemonNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info) {
|
|
|
|
int ret = -1;
|
|
|
|
struct sexpr *root;
|
|
|
|
|
|
|
|
if (!VIR_IS_CONNECT(conn)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
2006-03-29 12:46:03 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
if (info == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-29 12:46:03 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
root = sexpr_get(conn, "/xend/node/");
|
|
|
|
if (root == NULL)
|
|
|
|
return (-1);
|
|
|
|
|
|
|
|
ret = sexpr_to_xend_node_info(root, info);
|
|
|
|
sexpr_free(root);
|
|
|
|
return (ret);
|
|
|
|
}
|
|
|
|
|
2007-09-28 14:28:12 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonNodeGetTopology:
|
|
|
|
* @conn: pointer to the Xen Daemon block
|
2008-02-27 04:35:08 +00:00
|
|
|
* @caps: capabilities info
|
2007-09-28 14:28:12 +00:00
|
|
|
*
|
|
|
|
* This method retrieves a node's topology information.
|
|
|
|
*
|
|
|
|
* Returns -1 in case of error, 0 otherwise.
|
|
|
|
*/
|
|
|
|
int
|
2008-02-27 04:35:08 +00:00
|
|
|
xenDaemonNodeGetTopology(virConnectPtr conn,
|
|
|
|
virCapsPtr caps) {
|
2007-09-28 14:28:12 +00:00
|
|
|
int ret = -1;
|
|
|
|
struct sexpr *root;
|
|
|
|
|
|
|
|
if (!VIR_IS_CONNECT(conn)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
2007-09-28 14:28:12 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
2008-02-27 04:35:08 +00:00
|
|
|
if (caps == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2007-09-28 14:28:12 +00:00
|
|
|
return (-1);
|
2008-02-27 04:35:08 +00:00
|
|
|
}
|
2007-09-28 14:28:12 +00:00
|
|
|
|
|
|
|
root = sexpr_get(conn, "/xend/node/");
|
|
|
|
if (root == NULL) {
|
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
ret = sexpr_to_xend_topology(root, caps);
|
2007-09-28 14:28:12 +00:00
|
|
|
sexpr_free(root);
|
|
|
|
return (ret);
|
|
|
|
}
|
|
|
|
|
2006-03-29 12:46:03 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonGetVersion:
|
|
|
|
* @conn: pointer to the Xen Daemon block
|
|
|
|
* @hvVer: return value for the version of the running hypervisor (OUT)
|
|
|
|
*
|
|
|
|
* Get the version level of the Hypervisor running.
|
|
|
|
*
|
|
|
|
* Returns -1 in case of error, 0 otherwise. if the version can't be
|
|
|
|
* extracted by lack of capacities returns 0 and @hvVer is 0, otherwise
|
|
|
|
* @hvVer value is major * 1,000,000 + minor * 1,000 + release
|
|
|
|
*/
|
2006-06-29 14:44:37 +00:00
|
|
|
int
|
2006-03-29 12:46:03 +00:00
|
|
|
xenDaemonGetVersion(virConnectPtr conn, unsigned long *hvVer)
|
|
|
|
{
|
2006-09-21 09:15:33 +00:00
|
|
|
struct sexpr *root;
|
2007-06-19 09:12:55 +00:00
|
|
|
int major, minor;
|
2006-09-21 09:15:33 +00:00
|
|
|
unsigned long version;
|
2008-02-05 19:27:37 +00:00
|
|
|
|
2006-03-29 12:46:03 +00:00
|
|
|
if (!VIR_IS_CONNECT(conn)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_CONN, __FUNCTION__);
|
2006-03-29 12:46:03 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
if (hvVer == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-03-29 12:46:03 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
2006-09-21 09:15:33 +00:00
|
|
|
root = sexpr_get(conn, "/xend/node/");
|
|
|
|
if (root == NULL)
|
2008-04-10 16:54:54 +00:00
|
|
|
return(-1);
|
2006-09-21 09:15:33 +00:00
|
|
|
|
|
|
|
major = sexpr_int(root, "node/xen_major");
|
|
|
|
minor = sexpr_int(root, "node/xen_minor");
|
|
|
|
sexpr_free(root);
|
2007-06-19 09:12:55 +00:00
|
|
|
version = major * 1000000 + minor * 1000;
|
2006-03-29 12:46:03 +00:00
|
|
|
*hvVer = version;
|
|
|
|
return(0);
|
|
|
|
}
|
2006-06-14 15:44:14 +00:00
|
|
|
|
2006-07-20 13:59:23 +00:00
|
|
|
#ifndef PROXY
|
2006-06-14 15:44:14 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonListDomains:
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
* @ids: array to collect the list of IDs of active domains
|
|
|
|
* @maxids: size of @ids
|
|
|
|
*
|
|
|
|
* Collect the list of active domains, and store their ID in @maxids
|
|
|
|
* TODO: this is quite expensive at the moment since there isn't one
|
|
|
|
* xend RPC providing both name and id for all domains.
|
|
|
|
*
|
|
|
|
* Returns the number of domain found or -1 in case of error
|
|
|
|
*/
|
2008-11-28 15:25:04 +00:00
|
|
|
int
|
2006-06-14 15:44:14 +00:00
|
|
|
xenDaemonListDomains(virConnectPtr conn, int *ids, int maxids)
|
|
|
|
{
|
|
|
|
struct sexpr *root = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
struct sexpr *_for_i, *node;
|
|
|
|
long id;
|
|
|
|
|
2008-06-19 14:39:49 +00:00
|
|
|
if (maxids == 0)
|
|
|
|
return(0);
|
|
|
|
|
|
|
|
if ((ids == NULL) || (maxids < 0))
|
2006-06-14 15:44:14 +00:00
|
|
|
goto error;
|
|
|
|
root = sexpr_get(conn, "/xend/domain");
|
|
|
|
if (root == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
2007-09-29 18:16:26 +00:00
|
|
|
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
|
|
|
|
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
|
2006-06-14 15:44:14 +00:00
|
|
|
if (node->kind != SEXPR_VALUE)
|
|
|
|
continue;
|
2007-09-29 18:16:26 +00:00
|
|
|
id = xenDaemonDomainLookupByName_ids(conn, node->u.value, NULL);
|
2006-06-14 15:44:14 +00:00
|
|
|
if (id >= 0)
|
2006-12-07 18:23:19 +00:00
|
|
|
ids[ret++] = (int) id;
|
|
|
|
if (ret >= maxids)
|
|
|
|
break;
|
2006-06-14 15:44:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
error:
|
2008-05-29 19:20:22 +00:00
|
|
|
sexpr_free(root);
|
2006-06-14 15:44:14 +00:00
|
|
|
return(ret);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonNumOfDomains:
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
*
|
|
|
|
* Provides the number of active domains.
|
|
|
|
*
|
|
|
|
* Returns the number of domain found or -1 in case of error
|
|
|
|
*/
|
2009-10-09 09:23:23 +00:00
|
|
|
int
|
2006-06-14 15:44:14 +00:00
|
|
|
xenDaemonNumOfDomains(virConnectPtr conn)
|
|
|
|
{
|
|
|
|
struct sexpr *root = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
struct sexpr *_for_i, *node;
|
|
|
|
|
|
|
|
root = sexpr_get(conn, "/xend/domain");
|
|
|
|
if (root == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
2007-09-29 18:16:26 +00:00
|
|
|
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
|
|
|
|
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
|
2006-06-14 15:44:14 +00:00
|
|
|
if (node->kind != SEXPR_VALUE)
|
|
|
|
continue;
|
2008-04-10 16:54:54 +00:00
|
|
|
ret++;
|
2006-06-14 15:44:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
error:
|
2008-05-29 19:20:22 +00:00
|
|
|
sexpr_free(root);
|
2006-06-14 15:44:14 +00:00
|
|
|
return(ret);
|
|
|
|
}
|
2006-08-09 15:21:16 +00:00
|
|
|
#endif /* ! PROXY */
|
2006-06-15 14:50:48 +00:00
|
|
|
|
2006-07-20 13:59:23 +00:00
|
|
|
#ifndef PROXY
|
2006-06-15 14:50:48 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonLookupByID:
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
* @id: the domain ID number
|
|
|
|
*
|
|
|
|
* Try to find a domain based on the hypervisor ID number
|
|
|
|
*
|
|
|
|
* Returns a new domain object or NULL in case of failure
|
|
|
|
*/
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
virDomainPtr
|
2006-06-15 14:50:48 +00:00
|
|
|
xenDaemonLookupByID(virConnectPtr conn, int id) {
|
|
|
|
char *name = NULL;
|
Mon Jan 23 14:36:18 IST 2007 Mark McLoughlin <markmc@redhat.com>
* include/libvirt/libvirt.h.in: add VIR_UUID_BUFLEN and
VIR_UUID_STRING_BUFLEN
* libvirt/proxy/libvirt_proxy.c, libvirt/src/hash.c,
libvirt/src/internal.h, libvirt/src/libvirt.c,
libvirt/src/proxy_internal.c, libvirt/src/test.c,
libvirt/src/virsh.c, libvirt/src/xend_internal.c,
libvirt/src/xm_internal.c, libvirt/src/xml.c,
libvirt/python/libvir.c: use them
2007-01-23 14:39:45 +00:00
|
|
|
unsigned char uuid[VIR_UUID_BUFLEN];
|
2006-06-15 14:50:48 +00:00
|
|
|
virDomainPtr ret;
|
|
|
|
|
2006-07-07 18:58:35 +00:00
|
|
|
if (xenDaemonDomainLookupByID(conn, id, &name, uuid) < 0) {
|
2006-06-15 14:50:48 +00:00
|
|
|
goto error;
|
2006-07-07 18:58:35 +00:00
|
|
|
}
|
2006-06-15 14:50:48 +00:00
|
|
|
|
|
|
|
ret = virGetDomain(conn, name, uuid);
|
2009-09-08 12:42:10 +00:00
|
|
|
if (ret == NULL) goto error;
|
2007-07-06 15:02:09 +00:00
|
|
|
|
2007-01-22 16:25:27 +00:00
|
|
|
ret->id = id;
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(name);
|
2006-06-15 14:50:48 +00:00
|
|
|
return (ret);
|
|
|
|
|
2006-07-07 18:58:35 +00:00
|
|
|
error:
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(name);
|
2006-06-15 14:50:48 +00:00
|
|
|
return (NULL);
|
|
|
|
}
|
|
|
|
|
2006-08-04 10:41:05 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonDomainSetVcpus:
|
|
|
|
* @domain: pointer to domain object
|
|
|
|
* @nvcpus: the new number of virtual CPUs for this domain
|
|
|
|
*
|
|
|
|
* Dynamically change the number of virtual CPUs used by the domain.
|
|
|
|
*
|
|
|
|
* Returns 0 for success; -1 (with errno) on error
|
|
|
|
*/
|
|
|
|
int
|
2006-08-08 22:22:55 +00:00
|
|
|
xenDaemonDomainSetVcpus(virDomainPtr domain, unsigned int vcpus)
|
2006-08-04 10:41:05 +00:00
|
|
|
{
|
Mon Jan 23 14:36:18 IST 2007 Mark McLoughlin <markmc@redhat.com>
* include/libvirt/libvirt.h.in: add VIR_UUID_BUFLEN and
VIR_UUID_STRING_BUFLEN
* libvirt/proxy/libvirt_proxy.c, libvirt/src/hash.c,
libvirt/src/internal.h, libvirt/src/libvirt.c,
libvirt/src/proxy_internal.c, libvirt/src/test.c,
libvirt/src/virsh.c, libvirt/src/xend_internal.c,
libvirt/src/xm_internal.c, libvirt/src/xml.c,
libvirt/python/libvir.c: use them
2007-01-23 14:39:45 +00:00
|
|
|
char buf[VIR_UUID_BUFLEN];
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2006-08-04 10:41:05 +00:00
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
|
|
|
|
|| (vcpus < 1)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-08-04 10:41:05 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
|
|
|
if (domain->id < 0 && priv->xendConfigVersion < 3)
|
2006-11-15 21:03:34 +00:00
|
|
|
return(-1);
|
|
|
|
|
2006-08-04 10:41:05 +00:00
|
|
|
snprintf(buf, sizeof(buf), "%d", vcpus);
|
|
|
|
return(xend_op(domain->conn, domain->name, "op", "set_vcpus", "vcpus",
|
|
|
|
buf, NULL));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonDomainPinCpu:
|
|
|
|
* @domain: pointer to domain object
|
|
|
|
* @vcpu: virtual CPU number
|
|
|
|
* @cpumap: pointer to a bit map of real CPUs (in 8-bit bytes)
|
|
|
|
* @maplen: length of cpumap in bytes
|
2008-02-05 19:27:37 +00:00
|
|
|
*
|
2006-08-04 10:41:05 +00:00
|
|
|
* Dynamically change the real CPUs which can be allocated to a virtual CPU.
|
2009-05-14 10:31:11 +00:00
|
|
|
* NOTE: The XenD cpu affinity map format changed from "[0,1,2]" to
|
|
|
|
* "0,1,2"
|
|
|
|
* the XenD cpu affinity works only after cset 19579.
|
|
|
|
* there is no fine grained xend version detection possible, so we
|
|
|
|
* use the old format for anything before version 3
|
2006-08-04 10:41:05 +00:00
|
|
|
*
|
|
|
|
* Returns 0 for success; -1 (with errno) on error
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
|
|
|
|
unsigned char *cpumap, int maplen)
|
|
|
|
{
|
2009-05-14 10:31:11 +00:00
|
|
|
char buf[VIR_UUID_BUFLEN], mapstr[sizeof(cpumap_t) * 64];
|
2006-08-04 10:41:05 +00:00
|
|
|
int i, j;
|
2009-05-14 10:31:11 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2006-08-04 10:41:05 +00:00
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
|
|
|
|
|| (cpumap == NULL) || (maplen < 1) || (maplen > (int)sizeof(cpumap_t))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-08-04 10:41:05 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
2009-02-05 17:24:51 +00:00
|
|
|
|
2009-05-14 10:31:11 +00:00
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
if (priv->xendConfigVersion < 3) {
|
2009-07-30 11:29:46 +00:00
|
|
|
mapstr[0] = '[';
|
|
|
|
mapstr[1] = 0;
|
2009-05-14 10:31:11 +00:00
|
|
|
} else {
|
2009-07-30 11:29:46 +00:00
|
|
|
mapstr[0] = 0;
|
2009-05-14 10:31:11 +00:00
|
|
|
}
|
|
|
|
|
2006-08-04 10:41:05 +00:00
|
|
|
/* from bit map, build character string of mapped CPU numbers */
|
|
|
|
for (i = 0; i < maplen; i++) for (j = 0; j < 8; j++)
|
|
|
|
if (cpumap[i] & (1 << j)) {
|
2007-03-23 16:15:07 +00:00
|
|
|
snprintf(buf, sizeof(buf), "%d,", (8 * i) + j);
|
2006-08-04 10:41:05 +00:00
|
|
|
strcat(mapstr, buf);
|
|
|
|
}
|
2009-05-14 10:31:11 +00:00
|
|
|
if (priv->xendConfigVersion < 3)
|
|
|
|
mapstr[strlen(mapstr) - 1] = ']';
|
|
|
|
else
|
|
|
|
mapstr[strlen(mapstr) - 1] = 0;
|
|
|
|
|
2006-08-04 10:41:05 +00:00
|
|
|
snprintf(buf, sizeof(buf), "%d", vcpu);
|
|
|
|
return(xend_op(domain->conn, domain->name, "op", "pincpu", "vcpu", buf,
|
|
|
|
"cpumap", mapstr, NULL));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* virDomainGetVcpus:
|
|
|
|
* @domain: pointer to domain object, or NULL for Domain0
|
|
|
|
* @info: pointer to an array of virVcpuInfo structures (OUT)
|
|
|
|
* @maxinfo: number of structures in info array
|
|
|
|
* @cpumaps: pointer to an bit map of real CPUs for all vcpus of this domain (in 8-bit bytes) (OUT)
|
2008-04-04 07:58:29 +00:00
|
|
|
* If cpumaps is NULL, then no cpumap information is returned by the API.
|
2006-08-04 10:41:05 +00:00
|
|
|
* It's assumed there is <maxinfo> cpumap in cpumaps array.
|
|
|
|
* The memory allocated to cpumaps must be (maxinfo * maplen) bytes
|
|
|
|
* (ie: calloc(maxinfo, maplen)).
|
|
|
|
* One cpumap inside cpumaps has the format described in virDomainPinVcpu() API.
|
|
|
|
* @maplen: number of bytes in one cpumap, from 1 up to size of CPU map in
|
|
|
|
* underlying virtualization system (Xen...).
|
2008-02-05 19:27:37 +00:00
|
|
|
*
|
2006-08-04 10:41:05 +00:00
|
|
|
* Extract information about virtual CPUs of domain, store it in info array
|
2008-04-04 07:58:29 +00:00
|
|
|
* and also in cpumaps if this pointer isn't NULL.
|
2006-08-04 10:41:05 +00:00
|
|
|
*
|
|
|
|
* Returns the number of info filled in case of success, -1 in case of failure.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
xenDaemonDomainGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo,
|
2006-09-28 19:20:52 +00:00
|
|
|
unsigned char *cpumaps, int maplen)
|
2006-08-04 10:41:05 +00:00
|
|
|
{
|
|
|
|
struct sexpr *root, *s, *t;
|
|
|
|
virVcpuInfoPtr ipt = info;
|
|
|
|
int nbinfo = 0, oln;
|
|
|
|
unsigned char *cpumap;
|
|
|
|
int vcpu, cpu;
|
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
|
2006-09-28 19:20:52 +00:00
|
|
|
|| (info == NULL) || (maxinfo < 1)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-08-04 10:41:05 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
if (cpumaps != NULL && maplen < 1) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-08-04 10:41:05 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
2006-11-15 21:03:34 +00:00
|
|
|
|
2006-08-04 10:41:05 +00:00
|
|
|
root = sexpr_get(domain->conn, "/xend/domain/%s?op=vcpuinfo", domain->name);
|
|
|
|
if (root == NULL)
|
|
|
|
return (-1);
|
|
|
|
|
|
|
|
if (cpumaps != NULL)
|
2006-09-28 19:20:52 +00:00
|
|
|
memset(cpumaps, 0, maxinfo * maplen);
|
2006-08-04 10:41:05 +00:00
|
|
|
|
|
|
|
/* scan the sexprs from "(vcpu (number x)...)" and get parameter values */
|
2007-09-29 18:16:26 +00:00
|
|
|
for (s = root; s->kind == SEXPR_CONS; s = s->u.s.cdr) {
|
|
|
|
if ((s->u.s.car->kind == SEXPR_CONS) &&
|
|
|
|
(s->u.s.car->u.s.car->kind == SEXPR_VALUE) &&
|
2008-05-14 19:51:24 +00:00
|
|
|
STREQ(s->u.s.car->u.s.car->u.value, "vcpu")) {
|
2007-09-29 18:16:26 +00:00
|
|
|
t = s->u.s.car;
|
2006-09-28 19:20:52 +00:00
|
|
|
vcpu = ipt->number = sexpr_int(t, "vcpu/number");
|
|
|
|
if ((oln = sexpr_int(t, "vcpu/online")) != 0) {
|
|
|
|
if (sexpr_int(t, "vcpu/running")) ipt->state = VIR_VCPU_RUNNING;
|
|
|
|
if (sexpr_int(t, "vcpu/blocked")) ipt->state = VIR_VCPU_BLOCKED;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ipt->state = VIR_VCPU_OFFLINE;
|
|
|
|
ipt->cpuTime = sexpr_float(t, "vcpu/cpu_time") * 1000000000;
|
|
|
|
ipt->cpu = oln ? sexpr_int(t, "vcpu/cpu") : -1;
|
|
|
|
|
|
|
|
if (cpumaps != NULL && vcpu >= 0 && vcpu < maxinfo) {
|
|
|
|
cpumap = (unsigned char *) VIR_GET_CPUMAP(cpumaps, maplen, vcpu);
|
|
|
|
/*
|
|
|
|
* get sexpr from "(cpumap (x y z...))" and convert values
|
|
|
|
* to bitmap
|
|
|
|
*/
|
2007-09-29 18:16:26 +00:00
|
|
|
for (t = t->u.s.cdr; t->kind == SEXPR_CONS; t = t->u.s.cdr)
|
|
|
|
if ((t->u.s.car->kind == SEXPR_CONS) &&
|
|
|
|
(t->u.s.car->u.s.car->kind == SEXPR_VALUE) &&
|
2008-05-14 19:51:24 +00:00
|
|
|
STREQ(t->u.s.car->u.s.car->u.value, "cpumap") &&
|
2007-09-29 18:16:26 +00:00
|
|
|
(t->u.s.car->u.s.cdr->kind == SEXPR_CONS)) {
|
|
|
|
for (t = t->u.s.car->u.s.cdr->u.s.car; t->kind == SEXPR_CONS; t = t->u.s.cdr)
|
2007-11-12 14:00:32 +00:00
|
|
|
if (t->u.s.car->kind == SEXPR_VALUE
|
2008-02-08 09:15:16 +00:00
|
|
|
&& virStrToLong_i(t->u.s.car->u.value, NULL, 10, &cpu) == 0
|
2007-11-12 14:00:32 +00:00
|
|
|
&& cpu >= 0
|
|
|
|
&& (VIR_CPU_MAPLEN(cpu+1) <= maplen)) {
|
|
|
|
VIR_USE_CPU(cpumap, cpu);
|
2006-09-28 19:20:52 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2006-08-04 10:41:05 +00:00
|
|
|
}
|
|
|
|
|
2006-09-28 19:20:52 +00:00
|
|
|
if (++nbinfo == maxinfo) break;
|
|
|
|
ipt++;
|
|
|
|
}
|
2006-08-04 10:41:05 +00:00
|
|
|
}
|
|
|
|
sexpr_free(root);
|
|
|
|
return(nbinfo);
|
|
|
|
}
|
|
|
|
|
2006-06-15 14:50:48 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonLookupByUUID:
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
* @uuid: the raw UUID for the domain
|
|
|
|
*
|
|
|
|
* Try to lookup a domain on xend based on its UUID.
|
|
|
|
*
|
|
|
|
* Returns a new domain object or NULL in case of failure
|
|
|
|
*/
|
Fri Jul 6 16:08:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* src/proxy_internal.c, src/proxy_internal.h,
src.xen_internal.c, src/xen_internal.h,
src/xen_unified.c, src/xen_unified.h,
src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xm_internal.h,
src/xs_internal.c, src/xs_internal.h: The interface
between xen_unified.c and its underlying driver now uses
a custom structure (struct xenUnifiedDriver) instead
of reusing virDriver.
* src/xen_unified.c: virDomainLookup* functions in Xen
now throw VIR_ERR_NO_DOMAIN if the domain does not exist.
* src/xs_internal.c: Fix indentation.
2007-07-06 15:11:22 +00:00
|
|
|
virDomainPtr
|
2006-06-15 14:50:48 +00:00
|
|
|
xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
|
|
|
|
{
|
|
|
|
virDomainPtr ret;
|
|
|
|
char *name = NULL;
|
|
|
|
int id = -1;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
|
|
|
|
|
2007-03-02 20:19:08 +00:00
|
|
|
/* Old approach for xen <= 3.0.3 */
|
2007-04-04 14:19:49 +00:00
|
|
|
if (priv->xendConfigVersion < 3) {
|
2007-03-02 20:19:08 +00:00
|
|
|
char **names, **tmp;
|
|
|
|
unsigned char ident[VIR_UUID_BUFLEN];
|
|
|
|
names = xenDaemonListDomainsOld(conn);
|
|
|
|
tmp = names;
|
|
|
|
|
|
|
|
if (names == NULL) {
|
2006-06-15 14:50:48 +00:00
|
|
|
return (NULL);
|
2007-03-02 20:19:08 +00:00
|
|
|
}
|
|
|
|
while (*tmp != NULL) {
|
|
|
|
id = xenDaemonDomainLookupByName_ids(conn, *tmp, &ident[0]);
|
|
|
|
if (id >= 0) {
|
|
|
|
if (!memcmp(uuid, ident, VIR_UUID_BUFLEN)) {
|
|
|
|
name = strdup(*tmp);
|
2009-11-08 21:08:54 +00:00
|
|
|
|
|
|
|
if (name == NULL)
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-11-08 21:08:54 +00:00
|
|
|
|
2007-03-02 20:19:08 +00:00
|
|
|
break;
|
|
|
|
}
|
2006-06-15 14:50:48 +00:00
|
|
|
}
|
2007-03-02 20:19:08 +00:00
|
|
|
tmp++;
|
2006-06-15 14:50:48 +00:00
|
|
|
}
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(names);
|
2007-03-02 20:19:08 +00:00
|
|
|
} else { /* New approach for xen >= 3.0.4 */
|
|
|
|
char *domname = NULL;
|
|
|
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
|
|
struct sexpr *root = NULL;
|
|
|
|
|
2007-08-09 20:19:12 +00:00
|
|
|
virUUIDFormat(uuid, uuidstr);
|
2007-03-02 20:19:08 +00:00
|
|
|
root = sexpr_get(conn, "/xend/domain/%s?detail=1", uuidstr);
|
|
|
|
if (root == NULL)
|
|
|
|
return (NULL);
|
|
|
|
domname = (char*)sexpr_node(root, "domain/name");
|
|
|
|
if (sexpr_node(root, "domain/domid")) /* only active domains have domid */
|
|
|
|
id = sexpr_int(root, "domain/domid");
|
|
|
|
else
|
|
|
|
id = -1;
|
2009-11-08 21:08:54 +00:00
|
|
|
|
|
|
|
if (domname) {
|
|
|
|
name = strdup(domname);
|
|
|
|
|
|
|
|
if (name == NULL)
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-11-08 21:08:54 +00:00
|
|
|
}
|
|
|
|
|
2007-03-02 20:19:08 +00:00
|
|
|
sexpr_free(root);
|
2006-06-15 14:50:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (name == NULL)
|
2007-03-02 20:19:08 +00:00
|
|
|
return (NULL);
|
2006-06-15 14:50:48 +00:00
|
|
|
|
|
|
|
ret = virGetDomain(conn, name, uuid);
|
2009-09-08 14:48:20 +00:00
|
|
|
if (ret == NULL) goto cleanup;
|
2007-07-06 15:02:09 +00:00
|
|
|
|
2007-01-22 16:25:27 +00:00
|
|
|
ret->id = id;
|
2009-09-08 14:48:20 +00:00
|
|
|
|
|
|
|
cleanup:
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(name);
|
2006-06-15 14:50:48 +00:00
|
|
|
return (ret);
|
|
|
|
}
|
2006-06-16 12:36:40 +00:00
|
|
|
|
|
|
|
/**
|
2008-10-10 09:32:27 +00:00
|
|
|
* xenDaemonCreateXML:
|
2006-06-16 12:36:40 +00:00
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
* @xmlDesc: an XML description of the domain
|
|
|
|
* @flags: an optional set of virDomainFlags
|
|
|
|
*
|
|
|
|
* Launch a new Linux guest domain, based on an XML description similar
|
|
|
|
* to the one returned by virDomainGetXMLDesc()
|
2008-03-17 10:27:31 +00:00
|
|
|
* This function may requires privileged access to the hypervisor.
|
2008-02-05 19:27:37 +00:00
|
|
|
*
|
2006-06-16 12:36:40 +00:00
|
|
|
* Returns a new domain object or NULL in case of failure
|
|
|
|
*/
|
|
|
|
static virDomainPtr
|
2008-10-10 09:32:27 +00:00
|
|
|
xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc,
|
2010-05-25 17:13:13 +00:00
|
|
|
unsigned int flags)
|
2006-06-16 12:36:40 +00:00
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
char *sexpr;
|
2007-02-22 19:09:29 +00:00
|
|
|
virDomainPtr dom = NULL;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainDefPtr def;
|
2006-06-16 12:36:40 +00:00
|
|
|
|
2010-05-25 17:13:13 +00:00
|
|
|
virCheckFlags(0, NULL);
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
priv = (xenUnifiedPrivatePtr) conn->privateData;
|
|
|
|
|
2010-02-09 18:58:01 +00:00
|
|
|
if (!(def = virDomainDefParseString(priv->caps,
|
2009-01-08 13:54:20 +00:00
|
|
|
xmlDesc,
|
|
|
|
VIR_DOMAIN_XML_INACTIVE)))
|
2008-07-25 13:17:27 +00:00
|
|
|
return (NULL);
|
2006-06-16 12:36:40 +00:00
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
if (!(sexpr = xenDaemonFormatSxpr(conn, def, priv->xendConfigVersion))) {
|
|
|
|
virDomainDefFree(def);
|
2006-06-16 12:36:40 +00:00
|
|
|
return (NULL);
|
|
|
|
}
|
|
|
|
|
2008-10-10 09:32:27 +00:00
|
|
|
ret = xenDaemonDomainCreateXML(conn, sexpr);
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(sexpr);
|
2006-06-16 12:36:40 +00:00
|
|
|
if (ret != 0) {
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
2007-02-22 19:09:29 +00:00
|
|
|
/* This comes before wait_for_devices, to ensure that latter
|
|
|
|
cleanup will destroy the domain upon failure */
|
2008-07-25 13:17:27 +00:00
|
|
|
if (!(dom = virDomainLookupByName(conn, def->name)))
|
2006-06-16 12:36:40 +00:00
|
|
|
goto error;
|
|
|
|
|
2009-09-04 17:14:09 +00:00
|
|
|
if (xend_wait_for_devices(conn, def->name) < 0)
|
2006-06-16 12:36:40 +00:00
|
|
|
goto error;
|
|
|
|
|
2009-09-04 17:14:09 +00:00
|
|
|
if (xenDaemonDomainResume(dom) < 0)
|
2006-06-16 12:36:40 +00:00
|
|
|
goto error;
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainDefFree(def);
|
2006-06-16 12:36:40 +00:00
|
|
|
return (dom);
|
2007-02-22 19:09:29 +00:00
|
|
|
|
2006-06-16 12:36:40 +00:00
|
|
|
error:
|
2007-02-22 19:09:29 +00:00
|
|
|
/* Make sure we don't leave a still-born domain around */
|
|
|
|
if (dom != NULL) {
|
|
|
|
xenDaemonDomainDestroy(dom);
|
2008-01-21 16:29:10 +00:00
|
|
|
virUnrefDomain(dom);
|
2007-02-22 19:09:29 +00:00
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainDefFree(def);
|
2006-06-16 12:36:40 +00:00
|
|
|
return (NULL);
|
|
|
|
}
|
2006-11-16 18:11:28 +00:00
|
|
|
|
|
|
|
/**
|
2010-01-14 01:44:26 +00:00
|
|
|
* xenDaemonAttachDeviceFlags:
|
2006-11-16 18:11:28 +00:00
|
|
|
* @domain: pointer to domain object
|
|
|
|
* @xml: pointer to XML description of device
|
2010-01-14 01:44:26 +00:00
|
|
|
* @flags: an OR'ed set of virDomainDeviceModifyFlags
|
2008-02-05 19:27:37 +00:00
|
|
|
*
|
2006-11-16 18:11:28 +00:00
|
|
|
* Create a virtual device attachment to backend.
|
|
|
|
* XML description is translated into S-expression.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of failure.
|
|
|
|
*/
|
|
|
|
static int
|
2010-01-14 01:44:26 +00:00
|
|
|
xenDaemonAttachDeviceFlags(virDomainPtr domain, const char *xml,
|
|
|
|
unsigned int flags)
|
2006-11-16 18:11:28 +00:00
|
|
|
{
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2008-07-25 13:17:27 +00:00
|
|
|
char *sexpr = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
virDomainDeviceDefPtr dev = NULL;
|
|
|
|
virDomainDefPtr def = NULL;
|
|
|
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
2007-09-10 11:47:17 +00:00
|
|
|
char class[8], ref[80];
|
2006-11-16 18:11:28 +00:00
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2008-07-25 13:17:27 +00:00
|
|
|
return -1;
|
2006-11-16 18:11:28 +00:00
|
|
|
}
|
2006-12-14 01:56:14 +00:00
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
2010-01-14 01:44:26 +00:00
|
|
|
if (domain->id < 0) {
|
|
|
|
/* If xendConfigVersion < 3 only live config can be changed */
|
|
|
|
if (priv->xendConfigVersion < 3) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-01-14 01:44:26 +00:00
|
|
|
_("Xend version does not support modifying "
|
2010-03-22 13:13:53 +00:00
|
|
|
"persistent config"));
|
2010-01-14 01:44:26 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/* Cannot modify live config if domain is inactive */
|
|
|
|
if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-01-14 01:44:26 +00:00
|
|
|
_("Cannot modify live config if domain is inactive"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* Only live config can be changed if xendConfigVersion < 3 */
|
|
|
|
if (priv->xendConfigVersion < 3 &&
|
2010-07-28 23:12:16 +00:00
|
|
|
(flags != VIR_DOMAIN_DEVICE_MODIFY_CURRENT &&
|
2010-01-14 01:44:26 +00:00
|
|
|
flags != VIR_DOMAIN_DEVICE_MODIFY_LIVE)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-01-14 01:44:26 +00:00
|
|
|
_("Xend version does not support modifying "
|
2010-03-22 13:13:53 +00:00
|
|
|
"persistent config"));
|
2010-01-14 01:44:26 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2010-03-22 13:13:53 +00:00
|
|
|
/* Xen only supports modifying both live and persistent config if
|
2010-01-14 01:44:26 +00:00
|
|
|
* xendConfigVersion >= 3
|
|
|
|
*/
|
|
|
|
if (flags != (VIR_DOMAIN_DEVICE_MODIFY_LIVE |
|
|
|
|
VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-01-14 01:44:26 +00:00
|
|
|
_("Xend only supports modifying both live and "
|
2010-03-22 13:13:53 +00:00
|
|
|
"persistent config"));
|
2010-01-14 01:44:26 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
2007-08-16 15:38:38 +00:00
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
if (!(def = xenDaemonDomainFetch(domain->conn,
|
|
|
|
domain->id,
|
|
|
|
domain->name,
|
|
|
|
NULL)))
|
|
|
|
goto cleanup;
|
|
|
|
|
2010-02-09 18:58:01 +00:00
|
|
|
if (!(dev = virDomainDeviceDefParse(priv->caps,
|
2009-01-08 19:52:15 +00:00
|
|
|
def, xml, VIR_DOMAIN_XML_INACTIVE)))
|
2008-07-25 13:17:27 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
|
|
|
|
switch (dev->type) {
|
|
|
|
case VIR_DOMAIN_DEVICE_DISK:
|
|
|
|
if (xenDaemonFormatSxprDisk(domain->conn,
|
|
|
|
dev->data.disk,
|
|
|
|
&buf,
|
|
|
|
STREQ(def->os.type, "hvm") ? 1 : 0,
|
2008-08-06 11:26:47 +00:00
|
|
|
priv->xendConfigVersion, 1) < 0)
|
2008-07-25 13:17:27 +00:00
|
|
|
goto cleanup;
|
With the recent refactoring of the domain code, plus the changes with the Xend
code, a couple of bugs were introduced into the attach-disk and attach-interface
functionality. This patch fixes 3 bugs:
1) In xenDaemonAttachDevice(), there is a switch statement to determine which
of the xenDaemonFormatSxpr{Disk,Net} functions to call. Unfortunately, the case
statements are all missing the corresponding "break", so we always fall-through
to the default error case. This patch just adds the appropriate break statements.
2) (minor) In xenDaemonDomainDefineXML (that's a mouthful!), there is a stray
"fprintf". This is now converted to a proper virXendError().
3) xenDaemonFormatSxpr{Disk,Net} were adding an extra (device to the front of
the sexpr expressions that xend did not expect (this is Xend on RHEL 5.2).
Because of this, the attaches would fail. The patch fixes this by removing the
(device from the front, which makes attach-disk and attach-interface work again.
Signed-off-by: Chris Lalancette <clalance@redhat.com>
2008-08-05 16:45:07 +00:00
|
|
|
break;
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
case VIR_DOMAIN_DEVICE_NET:
|
|
|
|
if (xenDaemonFormatSxprNet(domain->conn,
|
|
|
|
dev->data.net,
|
|
|
|
&buf,
|
|
|
|
STREQ(def->os.type, "hvm") ? 1 : 0,
|
2008-08-06 11:26:47 +00:00
|
|
|
priv->xendConfigVersion, 1) < 0)
|
2008-07-25 13:17:27 +00:00
|
|
|
goto cleanup;
|
With the recent refactoring of the domain code, plus the changes with the Xend
code, a couple of bugs were introduced into the attach-disk and attach-interface
functionality. This patch fixes 3 bugs:
1) In xenDaemonAttachDevice(), there is a switch statement to determine which
of the xenDaemonFormatSxpr{Disk,Net} functions to call. Unfortunately, the case
statements are all missing the corresponding "break", so we always fall-through
to the default error case. This patch just adds the appropriate break statements.
2) (minor) In xenDaemonDomainDefineXML (that's a mouthful!), there is a stray
"fprintf". This is now converted to a proper virXendError().
3) xenDaemonFormatSxpr{Disk,Net} were adding an extra (device to the front of
the sexpr expressions that xend did not expect (this is Xend on RHEL 5.2).
Because of this, the attaches would fail. The patch fixes this by removing the
(device from the front, which makes attach-disk and attach-interface work again.
Signed-off-by: Chris Lalancette <clalance@redhat.com>
2008-08-05 16:45:07 +00:00
|
|
|
break;
|
2008-07-25 13:17:27 +00:00
|
|
|
|
2009-04-03 12:38:52 +00:00
|
|
|
case VIR_DOMAIN_DEVICE_HOSTDEV:
|
|
|
|
if (dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
|
|
|
|
dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonFormatSxprOnePCI(dev->data.hostdev,
|
2009-12-22 09:53:51 +00:00
|
|
|
&buf, 0) < 0)
|
2009-04-03 12:38:52 +00:00
|
|
|
goto cleanup;
|
|
|
|
} else {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT, "%s",
|
2009-04-03 12:38:52 +00:00
|
|
|
_("unsupported device type"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
default:
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT, "%s",
|
2008-07-25 13:17:27 +00:00
|
|
|
_("unsupported device type"));
|
|
|
|
goto cleanup;
|
2006-11-16 18:11:28 +00:00
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
sexpr = virBufferContentAndReset(&buf);
|
|
|
|
|
|
|
|
if (virDomainXMLDevID(domain, dev, class, ref, sizeof(ref))) {
|
2007-09-10 11:47:17 +00:00
|
|
|
/* device doesn't exist, define it */
|
|
|
|
ret = xend_op(domain->conn, domain->name, "op", "device_create",
|
2008-07-25 13:17:27 +00:00
|
|
|
"config", sexpr, NULL);
|
2008-02-05 19:27:37 +00:00
|
|
|
}
|
2007-09-10 11:47:17 +00:00
|
|
|
else {
|
|
|
|
/* device exists, attempt to modify it */
|
2008-02-05 19:27:37 +00:00
|
|
|
ret = xend_op(domain->conn, domain->name, "op", "device_configure",
|
2008-07-25 13:17:27 +00:00
|
|
|
"config", sexpr, "dev", ref, NULL);
|
2007-09-10 11:47:17 +00:00
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
cleanup:
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(sexpr);
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainDefFree(def);
|
|
|
|
virDomainDeviceDefFree(dev);
|
2006-11-16 18:11:28 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2010-03-22 13:13:53 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonUpdateDeviceFlags:
|
|
|
|
* @domain: pointer to domain object
|
|
|
|
* @xml: pointer to XML description of device
|
|
|
|
* @flags: an OR'ed set of virDomainDeviceModifyFlags
|
|
|
|
*
|
|
|
|
* Create a virtual device attachment to backend.
|
|
|
|
* XML description is translated into S-expression.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of failure.
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
xenDaemonUpdateDeviceFlags(virDomainPtr domain, const char *xml,
|
|
|
|
unsigned int flags)
|
|
|
|
{
|
|
|
|
xenUnifiedPrivatePtr priv;
|
|
|
|
char *sexpr = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
virDomainDeviceDefPtr dev = NULL;
|
|
|
|
virDomainDefPtr def = NULL;
|
|
|
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
|
|
char class[8], ref[80];
|
|
|
|
|
2010-04-16 12:04:31 +00:00
|
|
|
virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_CURRENT |
|
|
|
|
VIR_DOMAIN_DEVICE_MODIFY_LIVE |
|
|
|
|
VIR_DOMAIN_DEVICE_MODIFY_CONFIG, -1);
|
|
|
|
|
2010-03-22 13:13:53 +00:00
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2010-03-22 13:13:53 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
|
|
|
if (domain->id < 0) {
|
|
|
|
/* If xendConfigVersion < 3 only live config can be changed */
|
|
|
|
if (priv->xendConfigVersion < 3) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-03-22 13:13:53 +00:00
|
|
|
_("Xend version does not support modifying "
|
|
|
|
"persistent config"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/* Cannot modify live config if domain is inactive */
|
|
|
|
if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-03-22 13:13:53 +00:00
|
|
|
_("Cannot modify live config if domain is inactive"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* Only live config can be changed if xendConfigVersion < 3 */
|
|
|
|
if (priv->xendConfigVersion < 3 &&
|
2010-07-28 23:12:16 +00:00
|
|
|
(flags != VIR_DOMAIN_DEVICE_MODIFY_CURRENT &&
|
2010-03-22 13:13:53 +00:00
|
|
|
flags != VIR_DOMAIN_DEVICE_MODIFY_LIVE)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-03-22 13:13:53 +00:00
|
|
|
_("Xend version does not support modifying "
|
|
|
|
"persistent config"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/* Xen only supports modifying both live and persistent config if
|
|
|
|
* xendConfigVersion >= 3
|
|
|
|
*/
|
|
|
|
if (flags != (VIR_DOMAIN_DEVICE_MODIFY_LIVE |
|
|
|
|
VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-03-22 13:13:53 +00:00
|
|
|
_("Xend only supports modifying both live and "
|
|
|
|
"persistent config"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(def = xenDaemonDomainFetch(domain->conn,
|
|
|
|
domain->id,
|
|
|
|
domain->name,
|
|
|
|
NULL)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (!(dev = virDomainDeviceDefParse(priv->caps,
|
|
|
|
def, xml, VIR_DOMAIN_XML_INACTIVE)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
|
|
|
|
switch (dev->type) {
|
|
|
|
case VIR_DOMAIN_DEVICE_DISK:
|
|
|
|
if (xenDaemonFormatSxprDisk(domain->conn,
|
|
|
|
dev->data.disk,
|
|
|
|
&buf,
|
|
|
|
STREQ(def->os.type, "hvm") ? 1 : 0,
|
|
|
|
priv->xendConfigVersion, 1) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT, "%s",
|
2010-03-22 13:13:53 +00:00
|
|
|
_("unsupported device type"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
sexpr = virBufferContentAndReset(&buf);
|
|
|
|
|
|
|
|
if (virDomainXMLDevID(domain, dev, class, ref, sizeof(ref))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-03-22 13:13:53 +00:00
|
|
|
_("requested device does not exist"));
|
|
|
|
goto cleanup;
|
|
|
|
} else {
|
|
|
|
/* device exists, attempt to modify it */
|
|
|
|
ret = xend_op(domain->conn, domain->name, "op", "device_configure",
|
|
|
|
"config", sexpr, "dev", ref, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
VIR_FREE(sexpr);
|
|
|
|
virDomainDefFree(def);
|
|
|
|
virDomainDeviceDefFree(dev);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2006-11-16 18:11:28 +00:00
|
|
|
/**
|
2010-01-14 01:44:26 +00:00
|
|
|
* xenDaemonDetachDeviceFlags:
|
2006-11-16 18:11:28 +00:00
|
|
|
* @domain: pointer to domain object
|
|
|
|
* @xml: pointer to XML description of device
|
2010-01-14 01:44:26 +00:00
|
|
|
* @flags: an OR'ed set of virDomainDeviceModifyFlags
|
2008-02-05 19:27:37 +00:00
|
|
|
*
|
2006-11-16 18:11:28 +00:00
|
|
|
* Destroy a virtual device attachment to backend.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of failure.
|
|
|
|
*/
|
|
|
|
static int
|
2010-01-14 01:44:26 +00:00
|
|
|
xenDaemonDetachDeviceFlags(virDomainPtr domain, const char *xml,
|
|
|
|
unsigned int flags)
|
2006-11-16 18:11:28 +00:00
|
|
|
{
|
2008-07-25 13:17:27 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2006-11-16 18:11:28 +00:00
|
|
|
char class[8], ref[80];
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainDeviceDefPtr dev = NULL;
|
|
|
|
virDomainDefPtr def = NULL;
|
|
|
|
int ret = -1;
|
2009-12-22 09:53:51 +00:00
|
|
|
char *xendev = NULL;
|
|
|
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
2006-11-16 18:11:28 +00:00
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-11-16 18:11:28 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
2010-01-14 01:44:26 +00:00
|
|
|
if (domain->id < 0) {
|
|
|
|
/* If xendConfigVersion < 3 only live config can be changed */
|
|
|
|
if (priv->xendConfigVersion < 3) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-01-14 01:44:26 +00:00
|
|
|
_("Xend version does not support modifying "
|
2010-03-22 13:13:53 +00:00
|
|
|
"persistent config"));
|
2010-01-14 01:44:26 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/* Cannot modify live config if domain is inactive */
|
|
|
|
if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-01-14 01:44:26 +00:00
|
|
|
_("Cannot modify live config if domain is inactive"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* Only live config can be changed if xendConfigVersion < 3 */
|
|
|
|
if (priv->xendConfigVersion < 3 &&
|
2010-07-28 23:12:16 +00:00
|
|
|
(flags != VIR_DOMAIN_DEVICE_MODIFY_CURRENT &&
|
2010-01-14 01:44:26 +00:00
|
|
|
flags != VIR_DOMAIN_DEVICE_MODIFY_LIVE)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-01-14 01:44:26 +00:00
|
|
|
_("Xend version does not support modifying "
|
2010-03-22 13:13:53 +00:00
|
|
|
"persistent config"));
|
2010-01-14 01:44:26 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2010-03-22 13:13:53 +00:00
|
|
|
/* Xen only supports modifying both live and persistent config if
|
2010-01-14 01:44:26 +00:00
|
|
|
* xendConfigVersion >= 3
|
|
|
|
*/
|
|
|
|
if (flags != (VIR_DOMAIN_DEVICE_MODIFY_LIVE |
|
|
|
|
VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
2010-01-14 01:44:26 +00:00
|
|
|
_("Xend only supports modifying both live and "
|
2010-03-22 13:13:53 +00:00
|
|
|
"persistent config"));
|
2010-01-14 01:44:26 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
if (!(def = xenDaemonDomainFetch(domain->conn,
|
|
|
|
domain->id,
|
|
|
|
domain->name,
|
|
|
|
NULL)))
|
|
|
|
goto cleanup;
|
|
|
|
|
2010-02-09 18:58:01 +00:00
|
|
|
if (!(dev = virDomainDeviceDefParse(priv->caps,
|
2009-01-08 19:52:15 +00:00
|
|
|
def, xml, VIR_DOMAIN_XML_INACTIVE)))
|
2008-07-25 13:17:27 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (virDomainXMLDevID(domain, dev, class, ref, sizeof(ref)))
|
|
|
|
goto cleanup;
|
|
|
|
|
2009-12-22 09:53:51 +00:00
|
|
|
if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
|
|
|
|
if (dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
|
|
|
|
dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonFormatSxprOnePCI(dev->data.hostdev,
|
2009-12-22 09:53:51 +00:00
|
|
|
&buf, 1) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
} else {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT, "%s",
|
2009-12-22 09:53:51 +00:00
|
|
|
_("unsupported device type"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
xendev = virBufferContentAndReset(&buf);
|
|
|
|
ret = xend_op(domain->conn, domain->name, "op", "device_configure",
|
|
|
|
"config", xendev, "dev", ref, NULL);
|
|
|
|
VIR_FREE(xendev);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
ret = xend_op(domain->conn, domain->name, "op", "device_destroy",
|
|
|
|
"type", class, "dev", ref, "force", "0", "rm_cfg", "1",
|
|
|
|
NULL);
|
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
cleanup:
|
|
|
|
virDomainDefFree(def);
|
|
|
|
virDomainDeviceDefFree(dev);
|
|
|
|
|
|
|
|
return ret;
|
2006-11-16 18:11:28 +00:00
|
|
|
}
|
2006-12-14 01:56:14 +00:00
|
|
|
|
2008-05-09 08:17:18 +00:00
|
|
|
int
|
|
|
|
xenDaemonDomainGetAutostart(virDomainPtr domain,
|
|
|
|
int *autostart)
|
|
|
|
{
|
|
|
|
struct sexpr *root;
|
|
|
|
const char *tmp;
|
|
|
|
xenUnifiedPrivatePtr priv;
|
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2008-05-09 08:17:18 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* xm_internal.c (the support for defined domains from /etc/xen
|
|
|
|
* config files used by old Xen) will handle this.
|
|
|
|
*/
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
if (priv->xendConfigVersion < 3)
|
|
|
|
return(-1);
|
|
|
|
|
|
|
|
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
|
|
|
|
if (root == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_XEN_CALL,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("xenDaemonGetAutostart failed to find this domain"));
|
2008-05-09 08:17:18 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
*autostart = 0;
|
|
|
|
|
|
|
|
tmp = sexpr_node(root, "domain/on_xend_start");
|
|
|
|
if (tmp && STREQ(tmp, "start")) {
|
|
|
|
*autostart = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sexpr_free(root);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
xenDaemonDomainSetAutostart(virDomainPtr domain,
|
|
|
|
int autostart)
|
|
|
|
{
|
|
|
|
struct sexpr *root, *autonode;
|
|
|
|
char buf[4096];
|
|
|
|
int ret = -1;
|
|
|
|
xenUnifiedPrivatePtr priv;
|
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR, __FUNCTION__);
|
2008-05-09 08:17:18 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* xm_internal.c (the support for defined domains from /etc/xen
|
|
|
|
* config files used by old Xen) will handle this.
|
|
|
|
*/
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
if (priv->xendConfigVersion < 3)
|
|
|
|
return(-1);
|
|
|
|
|
|
|
|
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
|
|
|
|
if (root == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_XEN_CALL,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("xenDaemonSetAutostart failed to find this domain"));
|
2008-05-09 08:17:18 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
2010-02-17 21:14:25 +00:00
|
|
|
autonode = sexpr_lookup(root, "domain/on_xend_start");
|
|
|
|
if (autonode) {
|
|
|
|
const char *val = (autonode->u.s.car->kind == SEXPR_VALUE
|
|
|
|
? autonode->u.s.car->u.value : NULL);
|
2010-02-19 16:45:41 +00:00
|
|
|
if (!val || (!STREQ(val, "ignore") && !STREQ(val, "start"))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("unexpected value from on_xend_start"));
|
2008-05-09 08:17:18 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Change the autostart value in place, then define the new sexpr
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(autonode->u.s.car->u.value);
|
2008-05-09 08:17:18 +00:00
|
|
|
autonode->u.s.car->u.value = (autostart ? strdup("start")
|
|
|
|
: strdup("ignore"));
|
|
|
|
if (!(autonode->u.s.car->u.value)) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-05-09 08:17:18 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sexpr2string(root, buf, sizeof(buf)) == 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("sexpr2string failed"));
|
2008-05-09 08:17:18 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (xend_op(domain->conn, "", "op", "new", "config", buf, NULL) != 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_XEN_CALL,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("Failed to redefine sexpr"));
|
2008-05-09 08:17:18 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
} else {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("on_xend_start not present in sexpr"));
|
2008-05-09 08:17:18 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
error:
|
|
|
|
sexpr_free(root);
|
|
|
|
return ret;
|
|
|
|
}
|
2006-12-14 01:56:14 +00:00
|
|
|
|
2007-08-21 09:31:12 +00:00
|
|
|
int
|
|
|
|
xenDaemonDomainMigratePrepare (virConnectPtr dconn,
|
|
|
|
char **cookie ATTRIBUTE_UNUSED,
|
|
|
|
int *cookielen ATTRIBUTE_UNUSED,
|
|
|
|
const char *uri_in,
|
|
|
|
char **uri_out,
|
|
|
|
unsigned long flags ATTRIBUTE_UNUSED,
|
|
|
|
const char *dname ATTRIBUTE_UNUSED,
|
|
|
|
unsigned long resource ATTRIBUTE_UNUSED)
|
|
|
|
{
|
|
|
|
/* If uri_in is NULL, get the current hostname as a best guess
|
|
|
|
* of how the source host should connect to us. Note that caller
|
|
|
|
* deallocates this string.
|
|
|
|
*/
|
|
|
|
if (uri_in == NULL) {
|
2009-10-23 17:01:22 +00:00
|
|
|
*uri_out = virGetHostname(dconn);
|
|
|
|
if (*uri_out == NULL)
|
2007-08-21 09:31:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
xenDaemonDomainMigratePerform (virDomainPtr domain,
|
|
|
|
const char *cookie ATTRIBUTE_UNUSED,
|
|
|
|
int cookielen ATTRIBUTE_UNUSED,
|
|
|
|
const char *uri,
|
|
|
|
unsigned long flags,
|
|
|
|
const char *dname,
|
|
|
|
unsigned long bandwidth)
|
|
|
|
{
|
|
|
|
/* Upper layers have already checked domain. */
|
|
|
|
/* NB: Passing port=0 to xend means it ignores
|
|
|
|
* the port. However this is somewhat specific to
|
|
|
|
* the internals of the xend Python code. (XXX).
|
|
|
|
*/
|
|
|
|
char port[16] = "0";
|
|
|
|
char live[2] = "0";
|
|
|
|
int ret;
|
|
|
|
char *p, *hostname = NULL;
|
|
|
|
|
2009-11-12 15:04:43 +00:00
|
|
|
int undefined_source = 0;
|
|
|
|
|
2007-08-21 09:31:12 +00:00
|
|
|
/* Xen doesn't support renaming domains during migration. */
|
|
|
|
if (dname) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("xenDaemonDomainMigrate: Xen does not support"
|
2008-02-04 19:31:30 +00:00
|
|
|
" renaming domains during migration"));
|
2007-08-21 09:31:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Xen (at least up to 3.1.0) takes a resource parameter but
|
|
|
|
* ignores it.
|
|
|
|
*/
|
|
|
|
if (bandwidth) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("xenDaemonDomainMigrate: Xen does not support"
|
2008-02-04 19:31:30 +00:00
|
|
|
" bandwidth limits during migration"));
|
2007-08-21 09:31:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2009-11-12 15:04:43 +00:00
|
|
|
/*
|
|
|
|
* Check the flags.
|
|
|
|
*/
|
2007-08-21 09:31:12 +00:00
|
|
|
if ((flags & VIR_MIGRATE_LIVE)) {
|
|
|
|
strcpy (live, "1");
|
|
|
|
flags &= ~VIR_MIGRATE_LIVE;
|
|
|
|
}
|
2009-11-12 15:04:43 +00:00
|
|
|
|
|
|
|
/* Undefine the VM on the source host after migration? */
|
|
|
|
if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) {
|
|
|
|
undefined_source = 1;
|
|
|
|
flags &= ~VIR_MIGRATE_UNDEFINE_SOURCE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Ignore the persist_dest flag here */
|
|
|
|
if (flags & VIR_MIGRATE_PERSIST_DEST)
|
|
|
|
flags &= ~VIR_MIGRATE_PERSIST_DEST;
|
|
|
|
|
2009-12-11 09:06:05 +00:00
|
|
|
/* This is buggy in Xend, but could be supported in principle. Give
|
|
|
|
* a nice error message.
|
|
|
|
*/
|
|
|
|
if (flags & VIR_MIGRATE_PAUSED) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT,
|
2009-12-11 09:06:05 +00:00
|
|
|
"%s", _("xenDaemonDomainMigrate: xend cannot migrate paused domains"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2009-09-17 17:10:04 +00:00
|
|
|
/* XXX we could easily do tunnelled & peer2peer migration too
|
|
|
|
if we want to. support these... */
|
2007-08-21 09:31:12 +00:00
|
|
|
if (flags != 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("xenDaemonDomainMigrate: unsupported flag"));
|
2007-08-21 09:31:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set hostname and port.
|
|
|
|
*
|
|
|
|
* URI is non-NULL (guaranteed by caller). We expect either
|
|
|
|
* "hostname", "hostname:port" or "xenmigr://hostname[:port]/".
|
|
|
|
*/
|
|
|
|
if (strstr (uri, "//")) { /* Full URI. */
|
|
|
|
xmlURIPtr uriptr = xmlParseURI (uri);
|
|
|
|
if (!uriptr) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("xenDaemonDomainMigrate: invalid URI"));
|
2007-08-21 09:31:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (uriptr->scheme && STRCASENEQ (uriptr->scheme, "xenmigr")) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("xenDaemonDomainMigrate: only xenmigr://"
|
2008-02-04 19:31:30 +00:00
|
|
|
" migrations are supported by Xen"));
|
2007-08-21 09:31:12 +00:00
|
|
|
xmlFreeURI (uriptr);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (!uriptr->server) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("xenDaemonDomainMigrate: a hostname must be"
|
2008-02-04 19:31:30 +00:00
|
|
|
" specified in the URI"));
|
2007-08-21 09:31:12 +00:00
|
|
|
xmlFreeURI (uriptr);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
hostname = strdup (uriptr->server);
|
|
|
|
if (!hostname) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2007-08-21 09:31:12 +00:00
|
|
|
xmlFreeURI (uriptr);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (uriptr->port)
|
|
|
|
snprintf (port, sizeof port, "%d", uriptr->port);
|
|
|
|
xmlFreeURI (uriptr);
|
|
|
|
}
|
|
|
|
else if ((p = strrchr (uri, ':')) != NULL) { /* "hostname:port" */
|
|
|
|
int port_nr, n;
|
|
|
|
|
2010-03-30 14:52:42 +00:00
|
|
|
if (virStrToLong_i(p+1, NULL, 10, &port_nr) < 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("xenDaemonDomainMigrate: invalid port number"));
|
2007-08-21 09:31:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
snprintf (port, sizeof port, "%d", port_nr);
|
|
|
|
|
|
|
|
/* Get the hostname. */
|
|
|
|
n = p - uri; /* n = Length of hostname in bytes. */
|
|
|
|
hostname = strdup (uri);
|
|
|
|
if (!hostname) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2007-08-21 09:31:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
hostname[n] = '\0';
|
|
|
|
}
|
|
|
|
else { /* "hostname" (or IP address) */
|
|
|
|
hostname = strdup (uri);
|
|
|
|
if (!hostname) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2007-08-21 09:31:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-01-19 18:36:01 +00:00
|
|
|
DEBUG("hostname = %s, port = %s", hostname, port);
|
2007-08-21 09:31:12 +00:00
|
|
|
|
2010-01-12 18:18:34 +00:00
|
|
|
/* Make the call.
|
|
|
|
* NB: xend will fail the operation if any parameters are
|
|
|
|
* missing but happily accept unknown parameters. This works
|
|
|
|
* to our advantage since all parameters supported and required
|
|
|
|
* by current xend can be included without breaking older xend.
|
|
|
|
*/
|
2007-08-21 09:31:12 +00:00
|
|
|
ret = xend_op (domain->conn, domain->name,
|
|
|
|
"op", "migrate",
|
|
|
|
"destination", hostname,
|
|
|
|
"live", live,
|
|
|
|
"port", port,
|
2010-01-12 18:18:34 +00:00
|
|
|
"node", "-1", /* xen-unstable c/s 17753 */
|
|
|
|
"ssl", "0", /* xen-unstable c/s 17709 */
|
|
|
|
"change_home_server", "0", /* xen-unstable c/s 20326 */
|
|
|
|
"resource", "0", /* removed by xen-unstable c/s 17553 */
|
2007-08-21 09:31:12 +00:00
|
|
|
NULL);
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE (hostname);
|
2007-08-21 09:31:12 +00:00
|
|
|
|
2009-11-12 15:04:43 +00:00
|
|
|
if (ret == 0 && undefined_source)
|
|
|
|
xenDaemonDomainUndefine (domain);
|
|
|
|
|
2008-01-19 18:36:01 +00:00
|
|
|
DEBUG0("migration done");
|
2007-08-21 09:31:12 +00:00
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
virDomainPtr xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc) {
|
|
|
|
int ret;
|
|
|
|
char *sexpr;
|
|
|
|
virDomainPtr dom;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv;
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainDefPtr def;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) conn->privateData;
|
|
|
|
|
|
|
|
if (priv->xendConfigVersion < 3)
|
2007-01-18 18:38:09 +00:00
|
|
|
return(NULL);
|
2006-12-14 01:56:14 +00:00
|
|
|
|
2010-02-09 18:58:01 +00:00
|
|
|
if (!(def = virDomainDefParseString(priv->caps, xmlDesc,
|
2009-01-08 13:54:20 +00:00
|
|
|
VIR_DOMAIN_XML_INACTIVE))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_XML_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("failed to parse domain description"));
|
2006-12-14 01:56:14 +00:00
|
|
|
return (NULL);
|
|
|
|
}
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
if (!(sexpr = xenDaemonFormatSxpr(conn, def, priv->xendConfigVersion))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_XML_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("failed to build sexpr"));
|
2008-07-25 13:17:27 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
2008-08-28 11:59:07 +00:00
|
|
|
DEBUG("Defining w/ sexpr: \n%s", sexpr);
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
ret = xend_op(conn, "", "op", "new", "config", sexpr, NULL);
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(sexpr);
|
2006-12-14 01:56:14 +00:00
|
|
|
if (ret != 0) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_XEN_CALL,
|
2010-05-20 09:12:17 +00:00
|
|
|
_("Failed to create inactive domain %s"), def->name);
|
2006-12-14 01:56:14 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
2008-08-28 11:59:07 +00:00
|
|
|
dom = virDomainLookupByName(conn, def->name);
|
2006-12-14 01:56:14 +00:00
|
|
|
if (dom == NULL) {
|
|
|
|
goto error;
|
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainDefFree(def);
|
2006-12-14 01:56:14 +00:00
|
|
|
return (dom);
|
2008-07-25 13:17:27 +00:00
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
error:
|
2008-07-25 13:17:27 +00:00
|
|
|
virDomainDefFree(def);
|
2006-12-14 01:56:14 +00:00
|
|
|
return (NULL);
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
int xenDaemonDomainCreate(virDomainPtr domain)
|
|
|
|
{
|
|
|
|
xenUnifiedPrivatePtr priv;
|
2009-09-04 12:10:44 +00:00
|
|
|
int ret;
|
|
|
|
virDomainPtr tmp;
|
2007-04-04 14:19:49 +00:00
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-12-14 01:56:14 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
|
|
|
if (priv->xendConfigVersion < 3)
|
2006-12-14 01:56:14 +00:00
|
|
|
return(-1);
|
|
|
|
|
2009-09-04 12:10:44 +00:00
|
|
|
ret = xend_op(domain->conn, domain->name, "op", "start", NULL);
|
|
|
|
|
|
|
|
if (ret != -1) {
|
|
|
|
/* Need to force a refresh of this object's ID */
|
|
|
|
tmp = virDomainLookupByName(domain->conn, domain->name);
|
|
|
|
if (tmp) {
|
|
|
|
domain->id = tmp->id;
|
|
|
|
virDomainFree(tmp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
2006-12-14 01:56:14 +00:00
|
|
|
}
|
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
int xenDaemonDomainUndefine(virDomainPtr domain)
|
|
|
|
{
|
|
|
|
xenUnifiedPrivatePtr priv;
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2006-12-14 01:56:14 +00:00
|
|
|
return(-1);
|
|
|
|
}
|
2007-04-04 14:19:49 +00:00
|
|
|
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
|
|
|
|
if (priv->xendConfigVersion < 3)
|
2006-12-14 01:56:14 +00:00
|
|
|
return(-1);
|
|
|
|
|
|
|
|
return xend_op(domain->conn, domain->name, "op", "delete", NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonNumOfDomains:
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
*
|
|
|
|
* Provides the number of active domains.
|
|
|
|
*
|
|
|
|
* Returns the number of domain found or -1 in case of error
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
xenDaemonNumOfDefinedDomains(virConnectPtr conn)
|
|
|
|
{
|
|
|
|
struct sexpr *root = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
struct sexpr *_for_i, *node;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
|
2006-12-14 01:56:14 +00:00
|
|
|
|
2007-09-20 12:02:18 +00:00
|
|
|
/* xm_internal.c (the support for defined domains from /etc/xen
|
|
|
|
* config files used by old Xen) will handle this.
|
|
|
|
*/
|
2007-04-04 14:19:49 +00:00
|
|
|
if (priv->xendConfigVersion < 3)
|
2007-01-18 18:38:09 +00:00
|
|
|
return(-1);
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
root = sexpr_get(conn, "/xend/domain?state=halted");
|
|
|
|
if (root == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
2007-09-29 18:16:26 +00:00
|
|
|
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
|
|
|
|
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
|
2006-12-14 01:56:14 +00:00
|
|
|
if (node->kind != SEXPR_VALUE)
|
|
|
|
continue;
|
|
|
|
ret++;
|
|
|
|
}
|
|
|
|
|
|
|
|
error:
|
2008-01-29 17:41:07 +00:00
|
|
|
sexpr_free(root);
|
2006-12-14 01:56:14 +00:00
|
|
|
return(ret);
|
|
|
|
}
|
|
|
|
|
2008-07-25 09:51:23 +00:00
|
|
|
static int
|
|
|
|
xenDaemonListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) {
|
2006-12-14 01:56:14 +00:00
|
|
|
struct sexpr *root = NULL;
|
2009-11-08 21:08:54 +00:00
|
|
|
int i, ret = -1;
|
2006-12-14 01:56:14 +00:00
|
|
|
struct sexpr *_for_i, *node;
|
2007-04-04 14:19:49 +00:00
|
|
|
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
|
2006-12-14 01:56:14 +00:00
|
|
|
|
2007-04-04 14:19:49 +00:00
|
|
|
if (priv->xendConfigVersion < 3)
|
2007-01-18 18:38:09 +00:00
|
|
|
return(-1);
|
|
|
|
|
2008-06-19 14:39:49 +00:00
|
|
|
if ((names == NULL) || (maxnames < 0))
|
2006-12-14 01:56:14 +00:00
|
|
|
goto error;
|
2008-06-19 14:39:49 +00:00
|
|
|
if (maxnames == 0)
|
|
|
|
return(0);
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
root = sexpr_get(conn, "/xend/domain?state=halted");
|
|
|
|
if (root == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
2007-09-29 18:16:26 +00:00
|
|
|
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
|
|
|
|
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
|
2006-12-14 01:56:14 +00:00
|
|
|
if (node->kind != SEXPR_VALUE)
|
|
|
|
continue;
|
|
|
|
|
2009-11-08 21:08:54 +00:00
|
|
|
if ((names[ret++] = strdup(node->u.value)) == NULL) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-11-08 21:08:54 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
if (ret >= maxnames)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2009-11-25 23:09:40 +00:00
|
|
|
cleanup:
|
|
|
|
sexpr_free(root);
|
|
|
|
return(ret);
|
|
|
|
|
2006-12-14 01:56:14 +00:00
|
|
|
error:
|
2009-11-08 21:08:54 +00:00
|
|
|
for (i = 0; i < ret; ++i)
|
|
|
|
VIR_FREE(names[i]);
|
|
|
|
|
2009-11-25 23:09:40 +00:00
|
|
|
ret = -1;
|
|
|
|
|
|
|
|
goto cleanup;
|
2006-12-14 01:56:14 +00:00
|
|
|
}
|
|
|
|
|
2008-03-24 09:23:32 +00:00
|
|
|
/**
|
|
|
|
* xenDaemonGetSchedulerType:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
* @nparams: give a number of scheduler parameters
|
|
|
|
*
|
|
|
|
* Get the scheduler type of Xen
|
|
|
|
*
|
|
|
|
* Returns a scheduler name (credit or sedf) which must be freed by the
|
|
|
|
* caller or NULL in case of failure
|
|
|
|
*/
|
|
|
|
static char *
|
|
|
|
xenDaemonGetSchedulerType(virDomainPtr domain, int *nparams)
|
|
|
|
{
|
|
|
|
xenUnifiedPrivatePtr priv;
|
|
|
|
struct sexpr *root;
|
|
|
|
const char *ret = NULL;
|
|
|
|
char *schedulertype = NULL;
|
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
|
|
|
|
|| (nparams == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2008-03-24 09:23:32 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Support only xendConfigVersion >=4 */
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
if (priv->xendConfigVersion < 4) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("unsupported in xendConfigVersion < 4"));
|
2008-03-24 09:23:32 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
root = sexpr_get(domain->conn, "/xend/node/");
|
|
|
|
if (root == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* get xen_scheduler from xend/node */
|
|
|
|
ret = sexpr_node(root, "node/xen_scheduler");
|
|
|
|
if (ret == NULL){
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("node information incomplete, missing scheduler name"));
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (STREQ (ret, "credit")) {
|
|
|
|
schedulertype = strdup("credit");
|
|
|
|
if (schedulertype == NULL){
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
*nparams = XEN_SCHED_CRED_NPARAM;
|
|
|
|
} else if (STREQ (ret, "sedf")) {
|
|
|
|
schedulertype = strdup("sedf");
|
|
|
|
if (schedulertype == NULL){
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
*nparams = XEN_SCHED_SEDF_NPARAM;
|
|
|
|
} else {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unknown scheduler"));
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
error:
|
|
|
|
sexpr_free(root);
|
|
|
|
return schedulertype;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *str_weight = "weight";
|
|
|
|
static const char *str_cap = "cap";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonGetSchedulerParameters:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
* @params: pointer to scheduler parameters
|
|
|
|
* This memory area must be allocated by the caller
|
|
|
|
* @nparams: a number of scheduler parameters which should be same as a
|
|
|
|
* given number from xenDaemonGetSchedulerType()
|
|
|
|
*
|
|
|
|
* Get the scheduler parameters
|
|
|
|
*
|
|
|
|
* Returns 0 or -1 in case of failure
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
xenDaemonGetSchedulerParameters(virDomainPtr domain,
|
2009-08-03 11:57:23 +00:00
|
|
|
virSchedParameterPtr params, int *nparams)
|
2008-03-24 09:23:32 +00:00
|
|
|
{
|
|
|
|
xenUnifiedPrivatePtr priv;
|
|
|
|
struct sexpr *root;
|
|
|
|
char *sched_type = NULL;
|
|
|
|
int sched_nparam = 0;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
|
|
|
|
|| (params == NULL) || (nparams == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2008-03-24 09:23:32 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Support only xendConfigVersion >=4 */
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
if (priv->xendConfigVersion < 4) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("unsupported in xendConfigVersion < 4"));
|
2008-03-24 09:23:32 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* look up the information by domain name */
|
|
|
|
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
|
|
|
|
if (root == NULL)
|
|
|
|
return (-1);
|
|
|
|
|
|
|
|
/* get the scheduler type */
|
|
|
|
sched_type = xenDaemonGetSchedulerType(domain, &sched_nparam);
|
|
|
|
if (sched_type == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("Failed to get a scheduler name"));
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (sched_nparam){
|
|
|
|
case XEN_SCHED_SEDF_NPARAM:
|
|
|
|
/* TODO: Implement for Xen/SEDF */
|
|
|
|
TODO
|
|
|
|
goto error;
|
|
|
|
case XEN_SCHED_CRED_NPARAM:
|
|
|
|
/* get cpu_weight/cpu_cap from xend/domain */
|
|
|
|
if (sexpr_node(root, "domain/cpu_weight") == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing cpu_weight"));
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (sexpr_node(root, "domain/cpu_cap") == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing cpu_cap"));
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
2009-08-03 12:37:44 +00:00
|
|
|
if (virStrcpyStatic(params[0].field, str_weight) == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-08-03 12:37:44 +00:00
|
|
|
_("Weight %s too big for destination"),
|
|
|
|
str_weight);
|
|
|
|
goto error;
|
|
|
|
}
|
2008-03-24 09:23:32 +00:00
|
|
|
params[0].type = VIR_DOMAIN_SCHED_FIELD_UINT;
|
|
|
|
params[0].value.ui = sexpr_int(root, "domain/cpu_weight");
|
|
|
|
|
2009-08-03 12:37:44 +00:00
|
|
|
if (virStrcpyStatic(params[1].field, str_cap) == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-08-03 12:37:44 +00:00
|
|
|
_("Cap %s too big for destination"), str_cap);
|
|
|
|
goto error;
|
|
|
|
}
|
2008-03-24 09:23:32 +00:00
|
|
|
params[1].type = VIR_DOMAIN_SCHED_FIELD_UINT;
|
|
|
|
params[1].value.ui = sexpr_int(root, "domain/cpu_cap");
|
|
|
|
*nparams = XEN_SCHED_CRED_NPARAM;
|
|
|
|
ret = 0;
|
|
|
|
break;
|
|
|
|
default:
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unknown scheduler"));
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
error:
|
|
|
|
sexpr_free(root);
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(sched_type);
|
2008-03-24 09:23:32 +00:00
|
|
|
return (ret);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonSetSchedulerParameters:
|
|
|
|
* @domain: pointer to the Domain block
|
|
|
|
* @params: pointer to scheduler parameters
|
|
|
|
* @nparams: a number of scheduler setting parameters
|
|
|
|
*
|
|
|
|
* Set the scheduler parameters
|
|
|
|
*
|
|
|
|
* Returns 0 or -1 in case of failure
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
xenDaemonSetSchedulerParameters(virDomainPtr domain,
|
|
|
|
virSchedParameterPtr params, int nparams)
|
|
|
|
{
|
|
|
|
xenUnifiedPrivatePtr priv;
|
|
|
|
struct sexpr *root;
|
|
|
|
char *sched_type = NULL;
|
|
|
|
int i;
|
|
|
|
int sched_nparam = 0;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
|
|
|
|
|| (params == NULL)) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2008-03-24 09:23:32 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Support only xendConfigVersion >=4 and active domains */
|
|
|
|
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
|
|
if (priv->xendConfigVersion < 4) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("unsupported in xendConfigVersion < 4"));
|
2008-03-24 09:23:32 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* look up the information by domain name */
|
|
|
|
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
|
|
|
|
if (root == NULL)
|
|
|
|
return (-1);
|
|
|
|
|
|
|
|
/* get the scheduler type */
|
|
|
|
sched_type = xenDaemonGetSchedulerType(domain, &sched_nparam);
|
|
|
|
if (sched_type == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("Failed to get a scheduler name"));
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (sched_nparam){
|
|
|
|
case XEN_SCHED_SEDF_NPARAM:
|
|
|
|
/* TODO: Implement for Xen/SEDF */
|
|
|
|
TODO
|
|
|
|
goto error;
|
|
|
|
case XEN_SCHED_CRED_NPARAM: {
|
|
|
|
char buf_weight[VIR_UUID_BUFLEN];
|
|
|
|
char buf_cap[VIR_UUID_BUFLEN];
|
|
|
|
const char *weight = NULL;
|
|
|
|
const char *cap = NULL;
|
|
|
|
|
|
|
|
/* get the scheduler parameters */
|
|
|
|
memset(&buf_weight, 0, VIR_UUID_BUFLEN);
|
|
|
|
memset(&buf_cap, 0, VIR_UUID_BUFLEN);
|
|
|
|
for (i = 0; i < nparams; i++) {
|
|
|
|
if (STREQ (params[i].field, str_weight) &&
|
|
|
|
params[i].type == VIR_DOMAIN_SCHED_FIELD_UINT) {
|
|
|
|
snprintf(buf_weight, sizeof(buf_weight), "%u", params[i].value.ui);
|
|
|
|
} else if (STREQ (params[i].field, str_cap) &&
|
|
|
|
params[i].type == VIR_DOMAIN_SCHED_FIELD_UINT) {
|
|
|
|
snprintf(buf_cap, sizeof(buf_cap), "%u", params[i].value.ui);
|
|
|
|
} else {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if not get the scheduler parameter, set the current setting */
|
|
|
|
if (strlen(buf_weight) == 0) {
|
|
|
|
weight = sexpr_node(root, "domain/cpu_weight");
|
|
|
|
if (weight == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing cpu_weight"));
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
snprintf(buf_weight, sizeof(buf_weight), "%s", weight);
|
|
|
|
}
|
|
|
|
if (strlen(buf_cap) == 0) {
|
|
|
|
cap = sexpr_node(root, "domain/cpu_cap");
|
|
|
|
if (cap == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domain information incomplete, missing cpu_cap"));
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
snprintf(buf_cap, sizeof(buf_cap), "%s", cap);
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = xend_op(domain->conn, domain->name, "op",
|
|
|
|
"domain_sched_credit_set", "weight", buf_weight,
|
|
|
|
"cap", buf_cap, NULL);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unknown scheduler"));
|
2008-03-24 09:23:32 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
error:
|
|
|
|
sexpr_free(root);
|
2008-05-29 19:20:22 +00:00
|
|
|
VIR_FREE(sched_type);
|
2008-03-24 09:23:32 +00:00
|
|
|
return (ret);
|
|
|
|
}
|
|
|
|
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
/**
|
|
|
|
* 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;
|
2008-07-25 10:49:33 +00:00
|
|
|
struct sexpr *root = NULL;
|
|
|
|
int fd = -1, ret = -1;
|
2008-10-10 16:08:01 +00:00
|
|
|
int found = 0, i;
|
2008-07-25 10:49:33 +00:00
|
|
|
virDomainDefPtr def;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
|
|
|
|
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. */
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("domainBlockPeek is not supported for dom0"));
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!root) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_XEN_CALL, __FUNCTION__);
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2008-07-25 10:49:33 +00:00
|
|
|
if (!(def = xenDaemonParseSxpr(domain->conn, root, priv->xendConfigVersion, NULL)))
|
|
|
|
goto cleanup;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
for (i = 0 ; i < def->ndisks ; i++) {
|
|
|
|
if (def->disks[i]->src &&
|
|
|
|
STREQ(def->disks[i]->src, path)) {
|
2008-07-25 10:49:33 +00:00
|
|
|
found = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!found) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG,
|
2008-06-09 12:16:03 +00:00
|
|
|
_("%s: invalid path"), path);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto cleanup;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* The path is correct, now try to open it and get its size. */
|
|
|
|
fd = open (path, O_RDONLY);
|
2008-06-05 21:12:26 +00:00
|
|
|
if (fd == -1) {
|
2010-02-04 20:02:58 +00:00
|
|
|
virReportSystemError(errno,
|
2009-01-20 17:13:33 +00:00
|
|
|
_("failed to open for reading: %s"),
|
|
|
|
path);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto cleanup;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* 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) {
|
2010-02-04 20:02:58 +00:00
|
|
|
virReportSystemError(errno,
|
2009-01-20 17:13:33 +00:00
|
|
|
_("failed to lseek or read from file: %s"),
|
|
|
|
path);
|
2008-07-25 10:49:33 +00:00
|
|
|
goto cleanup;
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
2008-07-25 10:49:33 +00:00
|
|
|
cleanup:
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
if (fd >= 0) close (fd);
|
2008-07-25 10:49:33 +00:00
|
|
|
sexpr_free(root);
|
|
|
|
virDomainDefFree(def);
|
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.
2008-06-05 13:17:45 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2008-07-25 09:51:23 +00:00
|
|
|
struct xenUnifiedDriver xenDaemonDriver = {
|
|
|
|
xenDaemonOpen, /* open */
|
|
|
|
xenDaemonClose, /* close */
|
|
|
|
xenDaemonGetVersion, /* version */
|
|
|
|
NULL, /* hostname */
|
|
|
|
xenDaemonNodeGetInfo, /* nodeGetInfo */
|
|
|
|
NULL, /* getCapabilities */
|
|
|
|
xenDaemonListDomains, /* listDomains */
|
|
|
|
xenDaemonNumOfDomains, /* numOfDomains */
|
2008-10-10 09:32:27 +00:00
|
|
|
xenDaemonCreateXML, /* domainCreateXML */
|
2008-07-25 09:51:23 +00:00
|
|
|
xenDaemonDomainSuspend, /* domainSuspend */
|
|
|
|
xenDaemonDomainResume, /* domainResume */
|
|
|
|
xenDaemonDomainShutdown, /* domainShutdown */
|
|
|
|
xenDaemonDomainReboot, /* domainReboot */
|
|
|
|
xenDaemonDomainDestroy, /* domainDestroy */
|
|
|
|
xenDaemonDomainGetOSType, /* domainGetOSType */
|
|
|
|
xenDaemonDomainGetMaxMemory, /* domainGetMaxMemory */
|
|
|
|
xenDaemonDomainSetMaxMemory, /* domainSetMaxMemory */
|
|
|
|
xenDaemonDomainSetMemory, /* domainMaxMemory */
|
|
|
|
xenDaemonDomainGetInfo, /* domainGetInfo */
|
|
|
|
xenDaemonDomainSave, /* domainSave */
|
|
|
|
xenDaemonDomainRestore, /* domainRestore */
|
|
|
|
xenDaemonDomainCoreDump, /* domainCoreDump */
|
|
|
|
xenDaemonDomainSetVcpus, /* domainSetVcpus */
|
|
|
|
xenDaemonDomainPinVcpu, /* domainPinVcpu */
|
|
|
|
xenDaemonDomainGetVcpus, /* domainGetVcpus */
|
|
|
|
NULL, /* domainGetMaxVcpus */
|
|
|
|
xenDaemonListDefinedDomains, /* listDefinedDomains */
|
|
|
|
xenDaemonNumOfDefinedDomains,/* numOfDefinedDomains */
|
|
|
|
xenDaemonDomainCreate, /* domainCreate */
|
|
|
|
xenDaemonDomainDefineXML, /* domainDefineXML */
|
|
|
|
xenDaemonDomainUndefine, /* domainUndefine */
|
2010-01-14 01:44:26 +00:00
|
|
|
xenDaemonAttachDeviceFlags, /* domainAttachDeviceFlags */
|
|
|
|
xenDaemonDetachDeviceFlags, /* domainDetachDeviceFlags */
|
2010-03-22 13:13:53 +00:00
|
|
|
xenDaemonUpdateDeviceFlags, /* domainUpdateDeviceFlags */
|
2008-07-25 09:51:23 +00:00
|
|
|
xenDaemonDomainGetAutostart, /* domainGetAutostart */
|
|
|
|
xenDaemonDomainSetAutostart, /* domainSetAutostart */
|
|
|
|
xenDaemonGetSchedulerType, /* domainGetSchedulerType */
|
|
|
|
xenDaemonGetSchedulerParameters, /* domainGetSchedulerParameters */
|
|
|
|
xenDaemonSetSchedulerParameters, /* domainSetSchedulerParameters */
|
|
|
|
};
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
/************************************************************************
|
|
|
|
* *
|
|
|
|
* Converter functions to go from the XML tree to an S-Expr for Xen *
|
|
|
|
* *
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* virtDomainParseXMLGraphicsDescVFB:
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
* @node: node containing graphics description
|
|
|
|
* @buf: a buffer for the result S-Expr
|
|
|
|
*
|
|
|
|
* Parse the graphics part of the XML description and add it to the S-Expr
|
|
|
|
* in buf. This is a temporary interface as the S-Expr interface will be
|
|
|
|
* replaced by XML-RPC in the future. However the XML format should stay
|
|
|
|
* valid over time.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of error
|
|
|
|
*/
|
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonFormatSxprGraphicsNew(virDomainGraphicsDefPtr def,
|
2008-07-25 13:17:27 +00:00
|
|
|
virBufferPtr buf)
|
|
|
|
{
|
|
|
|
if (def->type != VIR_DOMAIN_GRAPHICS_TYPE_SDL &&
|
|
|
|
def->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 13:17:27 +00:00
|
|
|
_("unexpected graphics type %d"),
|
|
|
|
def->type);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
virBufferAddLit(buf, "(device (vkbd))");
|
|
|
|
virBufferAddLit(buf, "(device (vfb ");
|
|
|
|
|
|
|
|
if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
|
|
|
virBufferAddLit(buf, "(type sdl)");
|
|
|
|
if (def->data.sdl.display)
|
|
|
|
virBufferVSprintf(buf, "(display '%s')", def->data.sdl.display);
|
|
|
|
if (def->data.sdl.xauth)
|
|
|
|
virBufferVSprintf(buf, "(xauthority '%s')", def->data.sdl.xauth);
|
|
|
|
} else if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
|
|
|
|
virBufferAddLit(buf, "(type vnc)");
|
|
|
|
if (def->data.vnc.autoport) {
|
|
|
|
virBufferAddLit(buf, "(vncunused 1)");
|
|
|
|
} else {
|
|
|
|
virBufferAddLit(buf, "(vncunused 0)");
|
|
|
|
virBufferVSprintf(buf, "(vncdisplay %d)", def->data.vnc.port-5900);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (def->data.vnc.listenAddr)
|
|
|
|
virBufferVSprintf(buf, "(vnclisten '%s')", def->data.vnc.listenAddr);
|
|
|
|
if (def->data.vnc.passwd)
|
|
|
|
virBufferVSprintf(buf, "(vncpasswd '%s')", def->data.vnc.passwd);
|
|
|
|
if (def->data.vnc.keymap)
|
|
|
|
virBufferVSprintf(buf, "(keymap '%s')", def->data.vnc.keymap);
|
|
|
|
}
|
|
|
|
|
|
|
|
virBufferAddLit(buf, "))");
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonFormatSxprGraphicsOld(virDomainGraphicsDefPtr def,
|
2008-07-25 13:17:27 +00:00
|
|
|
virBufferPtr buf,
|
|
|
|
int xendConfigVersion)
|
|
|
|
{
|
|
|
|
if (def->type != VIR_DOMAIN_GRAPHICS_TYPE_SDL &&
|
|
|
|
def->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 13:17:27 +00:00
|
|
|
_("unexpected graphics type %d"),
|
|
|
|
def->type);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
|
|
|
virBufferAddLit(buf, "(sdl 1)");
|
|
|
|
if (def->data.sdl.display)
|
|
|
|
virBufferVSprintf(buf, "(display '%s')", def->data.sdl.display);
|
|
|
|
if (def->data.sdl.xauth)
|
|
|
|
virBufferVSprintf(buf, "(xauthority '%s')", def->data.sdl.xauth);
|
|
|
|
} else if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
|
|
|
|
virBufferAddLit(buf, "(vnc 1)");
|
|
|
|
if (xendConfigVersion >= 2) {
|
|
|
|
if (def->data.vnc.autoport) {
|
|
|
|
virBufferAddLit(buf, "(vncunused 1)");
|
|
|
|
} else {
|
|
|
|
virBufferAddLit(buf, "(vncunused 0)");
|
|
|
|
virBufferVSprintf(buf, "(vncdisplay %d)", def->data.vnc.port-5900);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (def->data.vnc.listenAddr)
|
|
|
|
virBufferVSprintf(buf, "(vnclisten '%s')", def->data.vnc.listenAddr);
|
|
|
|
if (def->data.vnc.passwd)
|
|
|
|
virBufferVSprintf(buf, "(vncpasswd '%s')", def->data.vnc.passwd);
|
|
|
|
if (def->data.vnc.keymap)
|
|
|
|
virBufferVSprintf(buf, "(keymap '%s')", def->data.vnc.keymap);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-07-25 14:10:49 +00:00
|
|
|
int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonFormatSxprChr(virDomainChrDefPtr def,
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferPtr buf)
|
2008-07-25 13:17:27 +00:00
|
|
|
{
|
|
|
|
const char *type = virDomainChrTypeToString(def->type);
|
|
|
|
|
|
|
|
if (!type) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("unexpected chr device type"));
|
2008-07-25 13:17:27 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (def->type) {
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_NULL:
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_STDIO:
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_VC:
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_PTY:
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferVSprintf(buf, "%s", type);
|
2008-07-25 13:17:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_FILE:
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_PIPE:
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferVSprintf(buf, "%s:%s", type, def->data.file.path);
|
2008-07-25 13:17:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_DEV:
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferVSprintf(buf, "%s", def->data.file.path);
|
2008-07-25 13:17:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_TCP:
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferVSprintf(buf, "%s:%s:%s%s",
|
2008-07-25 13:17:27 +00:00
|
|
|
(def->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_RAW ?
|
|
|
|
"tcp" : "telnet"),
|
|
|
|
(def->data.tcp.host ? def->data.tcp.host : ""),
|
|
|
|
(def->data.tcp.service ? def->data.tcp.service : ""),
|
2010-05-26 02:31:27 +00:00
|
|
|
(def->data.tcp.listen ? ",server,nowait" : ""));
|
2008-07-25 13:17:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_UDP:
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferVSprintf(buf, "%s:%s:%s@%s:%s", type,
|
2008-07-25 13:17:27 +00:00
|
|
|
(def->data.udp.connectHost ? def->data.udp.connectHost : ""),
|
|
|
|
(def->data.udp.connectService ? def->data.udp.connectService : ""),
|
|
|
|
(def->data.udp.bindHost ? def->data.udp.bindHost : ""),
|
|
|
|
(def->data.udp.bindService ? def->data.udp.bindService : ""));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_TYPE_UNIX:
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferVSprintf(buf, "%s:%s%s", type,
|
2008-07-25 13:17:27 +00:00
|
|
|
def->data.nix.path,
|
2010-05-26 02:31:27 +00:00
|
|
|
def->data.nix.listen ? ",server,nowait" : "");
|
2008-07-25 13:17:27 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2009-12-09 23:00:50 +00:00
|
|
|
if (virBufferError(buf)) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-09-03 16:37:45 +00:00
|
|
|
return -1;
|
2009-12-09 23:00:50 +00:00
|
|
|
}
|
2009-09-03 16:37:45 +00:00
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* virDomainParseXMLDiskDesc:
|
|
|
|
* @node: node containing disk description
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
* @buf: a buffer for the result S-Expr
|
|
|
|
* @xendConfigVersion: xend configuration file format
|
|
|
|
*
|
|
|
|
* Parse the one disk in the XML description and add it to the S-Expr in buf
|
|
|
|
* This is a temporary interface as the S-Expr interface
|
|
|
|
* will be replaced by XML-RPC in the future. However the XML format should
|
|
|
|
* stay valid over time.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of error.
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
xenDaemonFormatSxprDisk(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainDiskDefPtr def,
|
|
|
|
virBufferPtr buf,
|
|
|
|
int hvm,
|
2008-08-06 11:26:47 +00:00
|
|
|
int xendConfigVersion,
|
|
|
|
int isAttach)
|
2008-07-25 13:17:27 +00:00
|
|
|
{
|
|
|
|
/* Xend (all versions) put the floppy device config
|
|
|
|
* under the hvm (image (os)) block
|
|
|
|
*/
|
|
|
|
if (hvm &&
|
2009-01-29 17:05:49 +00:00
|
|
|
def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
|
|
|
|
if (isAttach) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG,
|
2009-01-29 17:05:49 +00:00
|
|
|
_("Cannot directly attach floppy %s"), def->src);
|
|
|
|
return -1;
|
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
return 0;
|
2009-01-29 17:05:49 +00:00
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
/* Xend <= 3.0.2 doesn't include cdrom config here */
|
|
|
|
if (hvm &&
|
|
|
|
def->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
|
2009-01-29 17:05:49 +00:00
|
|
|
xendConfigVersion == 1) {
|
|
|
|
if (isAttach) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INVALID_ARG,
|
2009-01-29 17:05:49 +00:00
|
|
|
_("Cannot directly attach CDROM %s"), def->src);
|
|
|
|
return -1;
|
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
return 0;
|
2009-01-29 17:05:49 +00:00
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
|
2008-08-06 11:26:47 +00:00
|
|
|
if (!isAttach)
|
|
|
|
virBufferAddLit(buf, "(device ");
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
/* Normally disks are in a (device (vbd ...)) block
|
|
|
|
* but blktap disks ended up in a differently named
|
|
|
|
* (device (tap ....)) block.... */
|
2010-08-24 17:31:14 +00:00
|
|
|
if (def->driverName && STREQ(def->driverName, "tap")) {
|
2008-07-25 13:17:27 +00:00
|
|
|
virBufferAddLit(buf, "(tap ");
|
2010-08-24 17:31:14 +00:00
|
|
|
} else if (def->driverName && STREQ(def->driverName, "tap2")) {
|
|
|
|
virBufferAddLit(buf, "(tap2 ");
|
2008-07-25 13:17:27 +00:00
|
|
|
} else {
|
|
|
|
virBufferAddLit(buf, "(vbd ");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hvm) {
|
|
|
|
/* Xend <= 3.0.2 wants a ioemu: prefix on devices for HVM */
|
|
|
|
if (xendConfigVersion == 1)
|
|
|
|
virBufferVSprintf(buf, "(dev 'ioemu:%s')", def->dst);
|
|
|
|
else /* But newer does not */
|
|
|
|
virBufferVSprintf(buf, "(dev '%s:%s')", def->dst,
|
|
|
|
def->device == VIR_DOMAIN_DISK_DEVICE_CDROM ?
|
|
|
|
"cdrom" : "disk");
|
2009-01-14 16:21:12 +00:00
|
|
|
} else if (def->device == VIR_DOMAIN_DISK_DEVICE_CDROM) {
|
|
|
|
virBufferVSprintf(buf, "(dev '%s:cdrom')", def->dst);
|
2008-07-25 13:17:27 +00:00
|
|
|
} else {
|
|
|
|
virBufferVSprintf(buf, "(dev '%s')", def->dst);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (def->src) {
|
|
|
|
if (def->driverName) {
|
2010-08-24 17:31:14 +00:00
|
|
|
if (STREQ(def->driverName, "tap") ||
|
|
|
|
STREQ(def->driverName, "tap2")) {
|
2008-07-25 13:17:27 +00:00
|
|
|
virBufferVSprintf(buf, "(uname '%s:%s:%s')",
|
|
|
|
def->driverName,
|
|
|
|
def->driverType ? def->driverType : "aio",
|
|
|
|
def->src);
|
|
|
|
} else {
|
|
|
|
virBufferVSprintf(buf, "(uname '%s:%s')",
|
|
|
|
def->driverName,
|
|
|
|
def->src);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (def->type == VIR_DOMAIN_DISK_TYPE_FILE) {
|
|
|
|
virBufferVSprintf(buf, "(uname 'file:%s')", def->src);
|
2009-11-16 18:08:29 +00:00
|
|
|
} else if (def->type == VIR_DOMAIN_DISK_TYPE_BLOCK) {
|
2008-07-25 13:17:27 +00:00
|
|
|
if (def->src[0] == '/')
|
|
|
|
virBufferVSprintf(buf, "(uname 'phy:%s')", def->src);
|
|
|
|
else
|
|
|
|
virBufferVSprintf(buf, "(uname 'phy:/dev/%s')", def->src);
|
2009-11-16 18:08:29 +00:00
|
|
|
} else {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_CONFIG_UNSUPPORTED,
|
2009-11-16 18:08:29 +00:00
|
|
|
_("unsupported disk type %s"),
|
|
|
|
virDomainDiskTypeToString(def->type));
|
|
|
|
return -1;
|
2008-07-25 13:17:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (def->readonly)
|
|
|
|
virBufferAddLit(buf, "(mode 'r')");
|
|
|
|
else if (def->shared)
|
|
|
|
virBufferAddLit(buf, "(mode 'w!')");
|
|
|
|
else
|
|
|
|
virBufferAddLit(buf, "(mode 'w')");
|
|
|
|
|
2008-08-06 11:26:47 +00:00
|
|
|
if (!isAttach)
|
|
|
|
virBufferAddLit(buf, ")");
|
|
|
|
|
With the recent refactoring of the domain code, plus the changes with the Xend
code, a couple of bugs were introduced into the attach-disk and attach-interface
functionality. This patch fixes 3 bugs:
1) In xenDaemonAttachDevice(), there is a switch statement to determine which
of the xenDaemonFormatSxpr{Disk,Net} functions to call. Unfortunately, the case
statements are all missing the corresponding "break", so we always fall-through
to the default error case. This patch just adds the appropriate break statements.
2) (minor) In xenDaemonDomainDefineXML (that's a mouthful!), there is a stray
"fprintf". This is now converted to a proper virXendError().
3) xenDaemonFormatSxpr{Disk,Net} were adding an extra (device to the front of
the sexpr expressions that xend did not expect (this is Xend on RHEL 5.2).
Because of this, the attaches would fail. The patch fixes this by removing the
(device from the front, which makes attach-disk and attach-interface work again.
Signed-off-by: Chris Lalancette <clalance@redhat.com>
2008-08-05 16:45:07 +00:00
|
|
|
virBufferAddLit(buf, ")");
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonFormatSxprNet
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
* @node: node containing the interface description
|
|
|
|
* @buf: a buffer for the result S-Expr
|
|
|
|
* @xendConfigVersion: xend configuration file format
|
|
|
|
*
|
|
|
|
* Parse the one interface the XML description and add it to the S-Expr in buf
|
|
|
|
* This is a temporary interface as the S-Expr interface
|
|
|
|
* will be replaced by XML-RPC in the future. However the XML format should
|
|
|
|
* stay valid over time.
|
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of error.
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
xenDaemonFormatSxprNet(virConnectPtr conn,
|
|
|
|
virDomainNetDefPtr def,
|
|
|
|
virBufferPtr buf,
|
|
|
|
int hvm,
|
2008-08-06 11:26:47 +00:00
|
|
|
int xendConfigVersion,
|
|
|
|
int isAttach)
|
2008-07-25 13:17:27 +00:00
|
|
|
{
|
2009-01-22 18:29:13 +00:00
|
|
|
const char *script = DEFAULT_VIF_SCRIPT;
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
if (def->type != VIR_DOMAIN_NET_TYPE_BRIDGE &&
|
|
|
|
def->type != VIR_DOMAIN_NET_TYPE_NETWORK &&
|
|
|
|
def->type != VIR_DOMAIN_NET_TYPE_ETHERNET) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 13:17:27 +00:00
|
|
|
_("unsupported network type %d"), def->type);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2008-08-06 11:26:47 +00:00
|
|
|
if (!isAttach)
|
|
|
|
virBufferAddLit(buf, "(device ");
|
|
|
|
|
With the recent refactoring of the domain code, plus the changes with the Xend
code, a couple of bugs were introduced into the attach-disk and attach-interface
functionality. This patch fixes 3 bugs:
1) In xenDaemonAttachDevice(), there is a switch statement to determine which
of the xenDaemonFormatSxpr{Disk,Net} functions to call. Unfortunately, the case
statements are all missing the corresponding "break", so we always fall-through
to the default error case. This patch just adds the appropriate break statements.
2) (minor) In xenDaemonDomainDefineXML (that's a mouthful!), there is a stray
"fprintf". This is now converted to a proper virXendError().
3) xenDaemonFormatSxpr{Disk,Net} were adding an extra (device to the front of
the sexpr expressions that xend did not expect (this is Xend on RHEL 5.2).
Because of this, the attaches would fail. The patch fixes this by removing the
(device from the front, which makes attach-disk and attach-interface work again.
Signed-off-by: Chris Lalancette <clalance@redhat.com>
2008-08-05 16:45:07 +00:00
|
|
|
virBufferAddLit(buf, "(vif ");
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
virBufferVSprintf(buf,
|
|
|
|
"(mac '%02x:%02x:%02x:%02x:%02x:%02x')",
|
|
|
|
def->mac[0], def->mac[1], def->mac[2],
|
|
|
|
def->mac[3], def->mac[4], def->mac[5]);
|
|
|
|
|
|
|
|
switch (def->type) {
|
|
|
|
case VIR_DOMAIN_NET_TYPE_BRIDGE:
|
|
|
|
virBufferVSprintf(buf, "(bridge '%s')", def->data.bridge.brname);
|
2009-01-22 18:29:13 +00:00
|
|
|
if (def->data.bridge.script)
|
|
|
|
script = def->data.bridge.script;
|
|
|
|
|
|
|
|
virBufferVSprintf(buf, "(script '%s')", script);
|
2009-01-23 01:48:47 +00:00
|
|
|
if (def->data.bridge.ipaddr != NULL)
|
|
|
|
virBufferVSprintf(buf, "(ip '%s')", def->data.bridge.ipaddr);
|
2008-07-25 13:17:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_NET_TYPE_NETWORK:
|
|
|
|
{
|
|
|
|
virNetworkPtr network =
|
|
|
|
virNetworkLookupByName(conn, def->data.network.name);
|
|
|
|
char *bridge;
|
|
|
|
|
|
|
|
if (!network) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_NETWORK, "%s",
|
2008-07-25 13:17:27 +00:00
|
|
|
def->data.network.name);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
bridge = virNetworkGetBridgeName(network);
|
|
|
|
virNetworkFree(network);
|
|
|
|
if (!bridge) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2009-04-01 10:01:23 +00:00
|
|
|
_("network %s is not active"),
|
2008-07-25 13:17:27 +00:00
|
|
|
def->data.network.name);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
virBufferVSprintf(buf, "(bridge '%s')", bridge);
|
2009-01-22 18:29:13 +00:00
|
|
|
virBufferVSprintf(buf, "(script '%s')", script);
|
2008-07-25 13:17:27 +00:00
|
|
|
VIR_FREE(bridge);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_NET_TYPE_ETHERNET:
|
|
|
|
if (def->data.ethernet.script)
|
|
|
|
virBufferVSprintf(buf, "(script '%s')", def->data.ethernet.script);
|
|
|
|
if (def->data.ethernet.ipaddr != NULL)
|
|
|
|
virBufferVSprintf(buf, "(ip '%s')", def->data.ethernet.ipaddr);
|
|
|
|
break;
|
2010-03-26 17:05:19 +00:00
|
|
|
|
|
|
|
case VIR_DOMAIN_NET_TYPE_USER:
|
|
|
|
case VIR_DOMAIN_NET_TYPE_SERVER:
|
|
|
|
case VIR_DOMAIN_NET_TYPE_CLIENT:
|
|
|
|
case VIR_DOMAIN_NET_TYPE_MCAST:
|
|
|
|
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
|
|
|
case VIR_DOMAIN_NET_TYPE_DIRECT:
|
|
|
|
case VIR_DOMAIN_NET_TYPE_LAST:
|
|
|
|
break;
|
2008-07-25 13:17:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (def->ifname != NULL &&
|
|
|
|
!STRPREFIX(def->ifname, "vif"))
|
|
|
|
virBufferVSprintf(buf, "(vifname '%s')", def->ifname);
|
|
|
|
|
Support for interface model='netfront'
Xen HVM guests with PV drivers end up with two network interfaces for
each configured interface. One of them being emulated by qemu and the
other one paravirtual. As this might not be desirable, the attached
patch provides a way for users to specify that only paravirtual network
interface should be presented to the guest.
The configuration was inspired by qemu/kvm driver, for which users can
specify model='virtio' to use paravirtual network interface.
The patch adds support for model='netfront' which results in
type=netfront instead of type=ioemu (or nothing for newer xen versions)
in guests native configuration. Xen's qemu ignores interfaces with
type != ioemu and only paravirtual network device will be seen in the
guest.
Four possible configuration scenarios follow:
- no model specified in domain's XML
- libvirt will behave like before this change; it will set
type=ioemu for HVM guests on xen host which is not newer than
XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU
- covered by existing tests
- PV guest, any model
- no functional change, model is passed as is (and ignored by the
hypervisor)
- covered by existing tests (e.g., *-net-e1000.*)
- HVM guest, model=netfront
- type is set to "netfront", model is not specified
- covered by new *-net-netfront.* tests
- HVM guest, model != netfront
- type is set to "ioemu", model is passed as is
- covered by new *-net-ioemu.* tests
The fourth scenario feels like a regression for xen newer than
XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU as users who had a model specified
in their guest's configuration won't see a paravirtual interface in
their guests any more. On the other hand, the reason for specifying a
model is most likely the fact that they want to use such model which
implies emulated interface. Users of older xen won't be affected at all
as their xen provides paravirtual interface regardless of the type used.
- src/xen/xend_internal.c: add netfront support for the xend backend
- src/xen/xm_internal.c: add netfront support for the XM serialization too
2009-12-04 15:55:59 +00:00
|
|
|
if (!hvm) {
|
|
|
|
if (def->model != NULL)
|
|
|
|
virBufferVSprintf(buf, "(model '%s')", def->model);
|
|
|
|
}
|
|
|
|
else if (def->model == NULL) {
|
|
|
|
/*
|
|
|
|
* apparently (type ioemu) breaks paravirt drivers on HVM so skip
|
|
|
|
* this from XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU
|
|
|
|
*/
|
|
|
|
if (xendConfigVersion <= XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU)
|
|
|
|
virBufferAddLit(buf, "(type ioemu)");
|
|
|
|
}
|
|
|
|
else if (STREQ(def->model, "netfront")) {
|
|
|
|
virBufferAddLit(buf, "(type netfront)");
|
|
|
|
}
|
|
|
|
else {
|
2008-07-25 13:17:27 +00:00
|
|
|
virBufferVSprintf(buf, "(model '%s')", def->model);
|
|
|
|
virBufferAddLit(buf, "(type ioemu)");
|
Support for interface model='netfront'
Xen HVM guests with PV drivers end up with two network interfaces for
each configured interface. One of them being emulated by qemu and the
other one paravirtual. As this might not be desirable, the attached
patch provides a way for users to specify that only paravirtual network
interface should be presented to the guest.
The configuration was inspired by qemu/kvm driver, for which users can
specify model='virtio' to use paravirtual network interface.
The patch adds support for model='netfront' which results in
type=netfront instead of type=ioemu (or nothing for newer xen versions)
in guests native configuration. Xen's qemu ignores interfaces with
type != ioemu and only paravirtual network device will be seen in the
guest.
Four possible configuration scenarios follow:
- no model specified in domain's XML
- libvirt will behave like before this change; it will set
type=ioemu for HVM guests on xen host which is not newer than
XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU
- covered by existing tests
- PV guest, any model
- no functional change, model is passed as is (and ignored by the
hypervisor)
- covered by existing tests (e.g., *-net-e1000.*)
- HVM guest, model=netfront
- type is set to "netfront", model is not specified
- covered by new *-net-netfront.* tests
- HVM guest, model != netfront
- type is set to "ioemu", model is passed as is
- covered by new *-net-ioemu.* tests
The fourth scenario feels like a regression for xen newer than
XEND_CONFIG_MAX_VERS_NET_TYPE_IOEMU as users who had a model specified
in their guest's configuration won't see a paravirtual interface in
their guests any more. On the other hand, the reason for specifying a
model is most likely the fact that they want to use such model which
implies emulated interface. Users of older xen won't be affected at all
as their xen provides paravirtual interface regardless of the type used.
- src/xen/xend_internal.c: add netfront support for the xend backend
- src/xen/xm_internal.c: add netfront support for the XM serialization too
2009-12-04 15:55:59 +00:00
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
|
2008-08-06 11:26:47 +00:00
|
|
|
if (!isAttach)
|
|
|
|
virBufferAddLit(buf, ")");
|
|
|
|
|
With the recent refactoring of the domain code, plus the changes with the Xend
code, a couple of bugs were introduced into the attach-disk and attach-interface
functionality. This patch fixes 3 bugs:
1) In xenDaemonAttachDevice(), there is a switch statement to determine which
of the xenDaemonFormatSxpr{Disk,Net} functions to call. Unfortunately, the case
statements are all missing the corresponding "break", so we always fall-through
to the default error case. This patch just adds the appropriate break statements.
2) (minor) In xenDaemonDomainDefineXML (that's a mouthful!), there is a stray
"fprintf". This is now converted to a proper virXendError().
3) xenDaemonFormatSxpr{Disk,Net} were adding an extra (device to the front of
the sexpr expressions that xend did not expect (this is Xend on RHEL 5.2).
Because of this, the attaches would fail. The patch fixes this by removing the
(device from the front, which makes attach-disk and attach-interface work again.
Signed-off-by: Chris Lalancette <clalance@redhat.com>
2008-08-05 16:45:07 +00:00
|
|
|
virBufferAddLit(buf, ")");
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-04-03 12:38:52 +00:00
|
|
|
|
|
|
|
static void
|
|
|
|
xenDaemonFormatSxprPCI(virDomainHostdevDefPtr def,
|
|
|
|
virBufferPtr buf)
|
|
|
|
{
|
|
|
|
virBufferVSprintf(buf, "(dev (domain 0x%04x)(bus 0x%02x)(slot 0x%02x)(func 0x%x))",
|
|
|
|
def->source.subsys.u.pci.domain,
|
|
|
|
def->source.subsys.u.pci.bus,
|
|
|
|
def->source.subsys.u.pci.slot,
|
|
|
|
def->source.subsys.u.pci.function);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonFormatSxprOnePCI(virDomainHostdevDefPtr def,
|
2009-12-22 09:53:51 +00:00
|
|
|
virBufferPtr buf,
|
|
|
|
int detach)
|
2009-04-03 12:38:52 +00:00
|
|
|
{
|
|
|
|
if (def->managed) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT, "%s",
|
2009-04-03 12:38:52 +00:00
|
|
|
_("managed PCI devices not supported with XenD"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
virBufferAddLit(buf, "(pci ");
|
|
|
|
xenDaemonFormatSxprPCI(def, buf);
|
2009-12-22 09:53:51 +00:00
|
|
|
if (detach)
|
|
|
|
virBufferAddLit(buf, "(state 'Closing')");
|
|
|
|
else
|
|
|
|
virBufferAddLit(buf, "(state 'Initialising')");
|
2009-04-03 12:38:52 +00:00
|
|
|
virBufferAddLit(buf, ")");
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonFormatSxprAllPCI(virDomainDefPtr def,
|
2009-04-03 12:38:52 +00:00
|
|
|
virBufferPtr buf)
|
|
|
|
{
|
|
|
|
int hasPCI = 0;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0 ; i < def->nhostdevs ; i++)
|
|
|
|
if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
|
|
|
|
def->hostdevs[i]->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
|
|
|
hasPCI = 1;
|
|
|
|
|
|
|
|
if (!hasPCI)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* With the (domain ...) block we have the following odd setup
|
|
|
|
*
|
|
|
|
* (device
|
|
|
|
* (pci
|
|
|
|
* (dev (domain 0x0000) (bus 0x00) (slot 0x1b) (func 0x0))
|
|
|
|
* (dev (domain 0x0000) (bus 0x00) (slot 0x13) (func 0x0))
|
|
|
|
* )
|
|
|
|
* )
|
|
|
|
*
|
2009-12-22 09:53:51 +00:00
|
|
|
* Normally there is one (device ...) block per device, but in the
|
|
|
|
* weird world of Xen PCI, one (device ...) covers multiple devices.
|
2009-04-03 12:38:52 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
virBufferAddLit(buf, "(device (pci ");
|
|
|
|
for (i = 0 ; i < def->nhostdevs ; i++) {
|
|
|
|
if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
|
|
|
|
def->hostdevs[i]->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
|
|
|
|
if (def->hostdevs[i]->managed) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT, "%s",
|
2009-04-03 12:38:52 +00:00
|
|
|
_("managed PCI devices not supported with XenD"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
xenDaemonFormatSxprPCI(def->hostdevs[i], buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
virBufferAddLit(buf, "))");
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-07-25 14:10:49 +00:00
|
|
|
int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonFormatSxprSound(virDomainDefPtr def,
|
2008-07-25 13:17:27 +00:00
|
|
|
virBufferPtr buf)
|
|
|
|
{
|
|
|
|
const char *str;
|
2008-10-10 16:08:01 +00:00
|
|
|
int i;
|
2008-07-25 13:17:27 +00:00
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
for (i = 0 ; i < def->nsounds ; i++) {
|
|
|
|
if (!(str = virDomainSoundModelTypeToString(def->sounds[i]->model))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-10-10 16:08:01 +00:00
|
|
|
_("unexpected sound model %d"),
|
|
|
|
def->sounds[i]->model);
|
2008-07-25 13:17:27 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2008-10-10 16:08:01 +00:00
|
|
|
virBufferVSprintf(buf, "%s%s", i ? "," : "", str);
|
2008-07-25 13:17:27 +00:00
|
|
|
}
|
|
|
|
|
2009-12-09 23:00:50 +00:00
|
|
|
if (virBufferError(buf)) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-09-03 16:37:45 +00:00
|
|
|
return -1;
|
2009-12-09 23:00:50 +00:00
|
|
|
}
|
2009-09-03 16:37:45 +00:00
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonFormatSxprInput(virDomainInputDefPtr input,
|
2008-07-25 13:17:27 +00:00
|
|
|
virBufferPtr buf)
|
|
|
|
{
|
|
|
|
if (input->bus != VIR_DOMAIN_INPUT_BUS_USB)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (input->type != VIR_DOMAIN_INPUT_TYPE_MOUSE &&
|
|
|
|
input->type != VIR_DOMAIN_INPUT_TYPE_TABLET) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 13:17:27 +00:00
|
|
|
_("unexpected input type %d"), input->type);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
virBufferVSprintf(buf, "(usbdevice %s)",
|
|
|
|
input->type == VIR_DOMAIN_INPUT_TYPE_MOUSE ?
|
|
|
|
"mouse" : "tablet");
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* xenDaemonFormatSxpr:
|
|
|
|
* @conn: pointer to the hypervisor connection
|
|
|
|
* @def: domain config definition
|
|
|
|
* @xendConfigVersion: xend configuration file format
|
|
|
|
*
|
|
|
|
* Generate an SEXPR representing the domain configuration.
|
|
|
|
*
|
|
|
|
* Returns the 0 terminatedi S-Expr string or NULL in case of error.
|
|
|
|
* the caller must free() the returned value.
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
xenDaemonFormatSxpr(virConnectPtr conn,
|
|
|
|
virDomainDefPtr def,
|
|
|
|
int xendConfigVersion)
|
|
|
|
{
|
|
|
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
|
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
|
|
const char *tmp;
|
|
|
|
int hvm = 0, i;
|
|
|
|
|
|
|
|
virBufferAddLit(&buf, "(vm ");
|
|
|
|
virBufferVSprintf(&buf, "(name '%s')", def->name);
|
|
|
|
virBufferVSprintf(&buf, "(memory %lu)(maxmem %lu)",
|
|
|
|
def->memory/1024, def->maxmem/1024);
|
|
|
|
virBufferVSprintf(&buf, "(vcpus %lu)", def->vcpus);
|
|
|
|
|
|
|
|
if (def->cpumask) {
|
2010-02-09 18:58:01 +00:00
|
|
|
char *ranges = virDomainCpuSetFormat(def->cpumask, def->cpumasklen);
|
2008-07-25 13:17:27 +00:00
|
|
|
if (ranges == NULL)
|
|
|
|
goto error;
|
|
|
|
virBufferVSprintf(&buf, "(cpus '%s')", ranges);
|
|
|
|
VIR_FREE(ranges);
|
|
|
|
}
|
|
|
|
|
|
|
|
virUUIDFormat(def->uuid, uuidstr);
|
|
|
|
virBufferVSprintf(&buf, "(uuid '%s')", uuidstr);
|
|
|
|
|
2009-12-09 14:25:31 +00:00
|
|
|
if (def->description)
|
|
|
|
virBufferVSprintf(&buf, "(description '%s')", def->description);
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
if (def->os.bootloader) {
|
|
|
|
if (def->os.bootloader[0])
|
|
|
|
virBufferVSprintf(&buf, "(bootloader '%s')", def->os.bootloader);
|
|
|
|
else
|
|
|
|
virBufferAddLit(&buf, "(bootloader)");
|
|
|
|
|
|
|
|
if (def->os.bootloaderArgs)
|
|
|
|
virBufferVSprintf(&buf, "(bootloader_args '%s')", def->os.bootloaderArgs);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(tmp = virDomainLifecycleTypeToString(def->onPoweroff))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 13:17:27 +00:00
|
|
|
_("unexpected lifecycle value %d"), def->onPoweroff);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
virBufferVSprintf(&buf, "(on_poweroff '%s')", tmp);
|
|
|
|
|
|
|
|
if (!(tmp = virDomainLifecycleTypeToString(def->onReboot))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 13:17:27 +00:00
|
|
|
_("unexpected lifecycle value %d"), def->onReboot);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
virBufferVSprintf(&buf, "(on_reboot '%s')", tmp);
|
|
|
|
|
2010-08-12 17:15:44 +00:00
|
|
|
if (!(tmp = virDomainLifecycleCrashTypeToString(def->onCrash))) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 13:17:27 +00:00
|
|
|
_("unexpected lifecycle value %d"), def->onCrash);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
virBufferVSprintf(&buf, "(on_crash '%s')", tmp);
|
|
|
|
|
2009-04-01 10:36:52 +00:00
|
|
|
/* Set localtime here for current XenD (both PV & HVM) */
|
2010-02-02 18:28:44 +00:00
|
|
|
if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME) {
|
|
|
|
if (def->clock.data.timezone) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_CONFIG_UNSUPPORTED,
|
2010-03-09 13:32:06 +00:00
|
|
|
"%s", _("configurable timezones are not supported"));
|
2010-02-02 18:28:44 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
2009-04-01 10:36:52 +00:00
|
|
|
virBufferAddLit(&buf, "(localtime 1)");
|
2010-02-02 18:28:44 +00:00
|
|
|
} else if (def->clock.offset != VIR_DOMAIN_CLOCK_OFFSET_UTC) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_CONFIG_UNSUPPORTED,
|
2010-02-02 17:22:03 +00:00
|
|
|
_("unsupported clock offset '%s'"),
|
|
|
|
virDomainClockOffsetTypeToString(def->clock.offset));
|
|
|
|
goto error;
|
|
|
|
}
|
2009-04-01 10:36:52 +00:00
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
if (!def->os.bootloader) {
|
|
|
|
if (STREQ(def->os.type, "hvm"))
|
|
|
|
hvm = 1;
|
|
|
|
|
|
|
|
if (hvm)
|
|
|
|
virBufferAddLit(&buf, "(image (hvm ");
|
|
|
|
else
|
|
|
|
virBufferAddLit(&buf, "(image (linux ");
|
|
|
|
|
|
|
|
if (hvm &&
|
|
|
|
def->os.loader == NULL) {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_INTERNAL_ERROR,
|
2008-07-25 13:17:27 +00:00
|
|
|
"%s",_("no HVM domain loader"));
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (def->os.kernel)
|
|
|
|
virBufferVSprintf(&buf, "(kernel '%s')", def->os.kernel);
|
|
|
|
if (def->os.initrd)
|
|
|
|
virBufferVSprintf(&buf, "(ramdisk '%s')", def->os.initrd);
|
|
|
|
if (def->os.root)
|
|
|
|
virBufferVSprintf(&buf, "(root '%s')", def->os.root);
|
|
|
|
if (def->os.cmdline)
|
|
|
|
virBufferVSprintf(&buf, "(args '%s')", def->os.cmdline);
|
|
|
|
|
|
|
|
if (hvm) {
|
|
|
|
char bootorder[VIR_DOMAIN_BOOT_LAST+1];
|
|
|
|
if (def->os.kernel)
|
|
|
|
virBufferVSprintf(&buf, "(loader '%s')", def->os.loader);
|
|
|
|
else
|
|
|
|
virBufferVSprintf(&buf, "(kernel '%s')", def->os.loader);
|
|
|
|
|
|
|
|
virBufferVSprintf(&buf, "(vcpus %lu)", def->vcpus);
|
|
|
|
|
|
|
|
for (i = 0 ; i < def->os.nBootDevs ; i++) {
|
|
|
|
switch (def->os.bootDevs[i]) {
|
|
|
|
case VIR_DOMAIN_BOOT_FLOPPY:
|
|
|
|
bootorder[i] = 'a';
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
case VIR_DOMAIN_BOOT_DISK:
|
|
|
|
bootorder[i] = 'c';
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_BOOT_CDROM:
|
|
|
|
bootorder[i] = 'd';
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_BOOT_NET:
|
|
|
|
bootorder[i] = 'n';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (def->os.nBootDevs == 0) {
|
|
|
|
bootorder[0] = 'c';
|
|
|
|
bootorder[1] = '\0';
|
|
|
|
} else {
|
|
|
|
bootorder[def->os.nBootDevs] = '\0';
|
|
|
|
}
|
|
|
|
virBufferVSprintf(&buf, "(boot %s)", bootorder);
|
|
|
|
|
2009-01-29 17:05:49 +00:00
|
|
|
/* some disk devices are defined here */
|
|
|
|
for (i = 0 ; i < def->ndisks ; i++) {
|
|
|
|
switch (def->disks[i]->device) {
|
|
|
|
case VIR_DOMAIN_DISK_DEVICE_CDROM:
|
|
|
|
/* Only xend <= 3.0.2 wants cdrom config here */
|
|
|
|
if (xendConfigVersion != 1)
|
2008-07-25 13:17:27 +00:00
|
|
|
break;
|
2009-01-29 17:05:49 +00:00
|
|
|
if (!STREQ(def->disks[i]->dst, "hdc") ||
|
|
|
|
def->disks[i]->src == NULL)
|
|
|
|
break;
|
|
|
|
|
|
|
|
virBufferVSprintf(&buf, "(cdrom '%s')",
|
|
|
|
def->disks[i]->src);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
|
|
|
|
/* all xend versions define floppies here */
|
|
|
|
virBufferVSprintf(&buf, "(%s '%s')", def->disks[i]->dst,
|
|
|
|
def->disks[i]->src);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
2008-07-25 13:17:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (def->features & (1 << VIR_DOMAIN_FEATURE_ACPI))
|
|
|
|
virBufferAddLit(&buf, "(acpi 1)");
|
|
|
|
if (def->features & (1 << VIR_DOMAIN_FEATURE_APIC))
|
|
|
|
virBufferAddLit(&buf, "(apic 1)");
|
|
|
|
if (def->features & (1 << VIR_DOMAIN_FEATURE_PAE))
|
|
|
|
virBufferAddLit(&buf, "(pae 1)");
|
|
|
|
|
|
|
|
virBufferAddLit(&buf, "(usb 1)");
|
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
for (i = 0 ; i < def->ninputs ; i++)
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonFormatSxprInput(def->inputs[i], &buf) < 0)
|
2008-07-25 13:17:27 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
if (def->parallels) {
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferAddLit(&buf, "(parallel ");
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonFormatSxprChr(def->parallels[0], &buf) < 0)
|
2008-07-25 13:17:27 +00:00
|
|
|
goto error;
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferAddLit(&buf, ")");
|
2008-07-25 13:17:27 +00:00
|
|
|
} else {
|
|
|
|
virBufferAddLit(&buf, "(parallel none)");
|
|
|
|
}
|
|
|
|
if (def->serials) {
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferAddLit(&buf, "(serial ");
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonFormatSxprChr(def->serials[0], &buf) < 0)
|
2008-07-25 13:17:27 +00:00
|
|
|
goto error;
|
2008-07-25 14:10:49 +00:00
|
|
|
virBufferAddLit(&buf, ")");
|
2008-07-25 13:17:27 +00:00
|
|
|
} else {
|
|
|
|
virBufferAddLit(&buf, "(serial none)");
|
|
|
|
}
|
|
|
|
|
2009-04-01 10:36:52 +00:00
|
|
|
/* Set localtime here to keep old XenD happy for HVM */
|
2010-02-02 17:22:03 +00:00
|
|
|
if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME)
|
2008-07-25 13:17:27 +00:00
|
|
|
virBufferAddLit(&buf, "(localtime 1)");
|
|
|
|
|
2008-07-25 14:10:49 +00:00
|
|
|
if (def->sounds) {
|
|
|
|
virBufferAddLit(&buf, "(soundhw '");
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonFormatSxprSound(def, &buf) < 0)
|
2008-07-25 14:10:49 +00:00
|
|
|
goto error;
|
|
|
|
virBufferAddLit(&buf, "')");
|
|
|
|
}
|
2008-07-25 13:17:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* get the device emulation model */
|
|
|
|
if (def->emulator && (hvm || xendConfigVersion >= 3))
|
|
|
|
virBufferVSprintf(&buf, "(device_model '%s')", def->emulator);
|
|
|
|
|
|
|
|
|
|
|
|
/* PV graphics for xen <= 3.0.4, or HVM graphics for xen <= 3.1.0 */
|
2009-01-19 19:49:30 +00:00
|
|
|
if ((!hvm && xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF) ||
|
2008-07-25 13:17:27 +00:00
|
|
|
(hvm && xendConfigVersion < 4)) {
|
2009-05-07 07:27:49 +00:00
|
|
|
if ((def->ngraphics == 1) &&
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonFormatSxprGraphicsOld(def->graphics[0],
|
2009-05-07 07:27:49 +00:00
|
|
|
&buf, xendConfigVersion) < 0)
|
2008-07-25 13:17:27 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
virBufferAddLit(&buf, "))");
|
|
|
|
}
|
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
for (i = 0 ; i < def->ndisks ; i++)
|
|
|
|
if (xenDaemonFormatSxprDisk(conn, def->disks[i],
|
|
|
|
&buf, hvm, xendConfigVersion, 0) < 0)
|
2008-07-25 13:17:27 +00:00
|
|
|
goto error;
|
|
|
|
|
2008-10-10 16:08:01 +00:00
|
|
|
for (i = 0 ; i < def->nnets ; i++)
|
|
|
|
if (xenDaemonFormatSxprNet(conn, def->nets[i],
|
|
|
|
&buf, hvm, xendConfigVersion, 0) < 0)
|
2008-07-25 13:17:27 +00:00
|
|
|
goto error;
|
|
|
|
|
2010-04-02 23:10:49 +00:00
|
|
|
if (xenDaemonFormatSxprAllPCI(def, &buf) < 0)
|
2009-04-03 12:38:52 +00:00
|
|
|
goto error;
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
/* New style PV graphics config xen >= 3.0.4,
|
|
|
|
* or HVM graphics config xen >= 3.0.5 */
|
2009-01-19 19:49:30 +00:00
|
|
|
if ((xendConfigVersion >= XEND_CONFIG_MIN_VERS_PVFB_NEWCONF && !hvm) ||
|
2008-07-25 13:17:27 +00:00
|
|
|
(xendConfigVersion >= 4 && hvm)) {
|
2009-05-07 07:27:49 +00:00
|
|
|
if ((def->ngraphics == 1) &&
|
2010-04-02 23:10:49 +00:00
|
|
|
xenDaemonFormatSxprGraphicsNew(def->graphics[0], &buf) < 0)
|
2008-07-25 13:17:27 +00:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
virBufferAddLit(&buf, ")"); /* closes (vm */
|
|
|
|
|
2009-04-01 10:31:01 +00:00
|
|
|
if (virBufferError(&buf)) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-12-09 23:00:50 +00:00
|
|
|
goto error;
|
2009-04-01 10:31:01 +00:00
|
|
|
}
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
return virBufferContentAndReset(&buf);
|
|
|
|
|
|
|
|
error:
|
2009-12-09 23:00:50 +00:00
|
|
|
virBufferFreeAndReset(&buf);
|
2008-07-25 13:17:27 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* virDomainXMLDevID:
|
|
|
|
* @domain: pointer to domain object
|
|
|
|
* @dev: pointer to device config object
|
|
|
|
* @class: Xen device class "vbd" or "vif" (OUT)
|
|
|
|
* @ref: Xen device reference (OUT)
|
|
|
|
*
|
|
|
|
* Set class according to XML root, and:
|
|
|
|
* - if disk, copy in ref the target name from description
|
|
|
|
* - if network, get MAC address from description, scan XenStore and
|
|
|
|
* copy in ref the corresponding vif number.
|
2009-12-22 09:53:51 +00:00
|
|
|
* - if pci, get BDF from description, scan XenStore and
|
|
|
|
* copy in ref the corresponding dev number.
|
2008-07-25 13:17:27 +00:00
|
|
|
*
|
|
|
|
* Returns 0 in case of success, -1 in case of failure.
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
virDomainXMLDevID(virDomainPtr domain,
|
|
|
|
virDomainDeviceDefPtr dev,
|
|
|
|
char *class,
|
|
|
|
char *ref,
|
|
|
|
int ref_len)
|
|
|
|
{
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedPrivatePtr priv = domain->conn->privateData;
|
2008-07-25 13:17:27 +00:00
|
|
|
char *xref;
|
2009-08-03 12:37:44 +00:00
|
|
|
char *tmp;
|
2008-07-25 13:17:27 +00:00
|
|
|
|
|
|
|
if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
|
2009-03-10 10:32:24 +00:00
|
|
|
if (dev->data.disk->driverName &&
|
|
|
|
STREQ(dev->data.disk->driverName, "tap"))
|
|
|
|
strcpy(class, "tap");
|
2010-08-24 17:31:14 +00:00
|
|
|
else if (dev->data.disk->driverName &&
|
|
|
|
STREQ(dev->data.disk->driverName, "tap2"))
|
|
|
|
strcpy(class, "tap2");
|
2009-03-10 10:32:24 +00:00
|
|
|
else
|
|
|
|
strcpy(class, "vbd");
|
|
|
|
|
2008-07-25 13:17:27 +00:00
|
|
|
if (dev->data.disk->dst == NULL)
|
|
|
|
return -1;
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedLock(priv);
|
2008-07-25 13:17:27 +00:00
|
|
|
xref = xenStoreDomainGetDiskID(domain->conn, domain->id,
|
|
|
|
dev->data.disk->dst);
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedUnlock(priv);
|
2008-07-25 13:17:27 +00:00
|
|
|
if (xref == NULL)
|
|
|
|
return -1;
|
|
|
|
|
2009-08-03 12:37:44 +00:00
|
|
|
tmp = virStrcpy(ref, xref, ref_len);
|
2009-12-09 23:00:50 +00:00
|
|
|
VIR_FREE(xref);
|
2009-08-03 12:37:44 +00:00
|
|
|
if (tmp == NULL)
|
|
|
|
return -1;
|
2008-07-25 13:17:27 +00:00
|
|
|
} else if (dev->type == VIR_DOMAIN_DEVICE_NET) {
|
|
|
|
char mac[30];
|
|
|
|
virDomainNetDefPtr def = dev->data.net;
|
|
|
|
snprintf(mac, sizeof(mac), "%02x:%02x:%02x:%02x:%02x:%02x",
|
|
|
|
def->mac[0], def->mac[1], def->mac[2],
|
|
|
|
def->mac[3], def->mac[4], def->mac[5]);
|
|
|
|
|
|
|
|
strcpy(class, "vif");
|
|
|
|
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedLock(priv);
|
2008-07-25 13:17:27 +00:00
|
|
|
xref = xenStoreDomainGetNetworkID(domain->conn, domain->id,
|
|
|
|
mac);
|
2009-01-21 18:11:14 +00:00
|
|
|
xenUnifiedUnlock(priv);
|
2008-07-25 13:17:27 +00:00
|
|
|
if (xref == NULL)
|
|
|
|
return -1;
|
|
|
|
|
2009-08-03 12:37:44 +00:00
|
|
|
tmp = virStrcpy(ref, xref, ref_len);
|
2009-12-09 23:00:50 +00:00
|
|
|
VIR_FREE(xref);
|
2009-08-03 12:37:44 +00:00
|
|
|
if (tmp == NULL)
|
|
|
|
return -1;
|
2009-04-03 12:38:52 +00:00
|
|
|
} else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
|
|
|
|
dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
|
|
|
|
dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
|
2009-12-22 09:53:51 +00:00
|
|
|
char *bdf;
|
|
|
|
virDomainHostdevDefPtr def = dev->data.hostdev;
|
|
|
|
|
|
|
|
if (virAsprintf(&bdf, "%04x:%02x:%02x.%0x",
|
|
|
|
def->source.subsys.u.pci.domain,
|
|
|
|
def->source.subsys.u.pci.bus,
|
|
|
|
def->source.subsys.u.pci.slot,
|
|
|
|
def->source.subsys.u.pci.function) < 0) {
|
2010-02-04 18:19:08 +00:00
|
|
|
virReportOOMError();
|
2009-12-22 09:53:51 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
strcpy(class, "pci");
|
|
|
|
|
|
|
|
xenUnifiedLock(priv);
|
|
|
|
xref = xenStoreDomainGetPCIID(domain->conn, domain->id, bdf);
|
|
|
|
xenUnifiedUnlock(priv);
|
|
|
|
VIR_FREE(bdf);
|
|
|
|
if (xref == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
tmp = virStrcpy(ref, xref, ref_len);
|
|
|
|
VIR_FREE(xref);
|
|
|
|
if (tmp == NULL)
|
|
|
|
return -1;
|
2008-07-25 13:17:27 +00:00
|
|
|
} else {
|
2010-04-02 23:10:49 +00:00
|
|
|
virXendError(VIR_ERR_NO_SUPPORT,
|
avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
2008-10-13 16:46:28 +00:00
|
|
|
"%s", _("hotplug of device type not supported"));
|
2008-07-25 13:17:27 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-08-09 15:21:16 +00:00
|
|
|
#endif /* ! PROXY */
|