[libvirt] [PATCH 01/10] Split code for building QEMU -drive arg in separate method
Daniel Veillard
veillard at redhat.com
Thu Dec 17 08:54:55 UTC 2009
On Tue, Dec 15, 2009 at 03:14:41PM +0000, Daniel P. Berrange wrote:
> To enable it to be called from multiple locations, split out
> the code for building the -drive arg string
>
> * src/qemu/qemu_conf.c, src/qemu/qemu_conf.h: Add qemuBuildDriveStr
> for building -drive arg string
> ---
> src/qemu/qemu_conf.c | 188 +++++++++++++++++++++++++++----------------------
> src/qemu/qemu_conf.h | 7 ++
> 2 files changed, 111 insertions(+), 84 deletions(-)
>
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index 86172c6..61e719d 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -1313,6 +1313,108 @@ qemuAssignNetNames(virDomainDefPtr def,
> return 0;
> }
>
> +#define QEMU_SERIAL_PARAM_ACCEPTED_CHARS \
> + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
> +
> +static int
> +qemuSafeSerialParamValue(virConnectPtr conn,
> + const char *value)
> +{
> + if (strspn(value, QEMU_SERIAL_PARAM_ACCEPTED_CHARS) != strlen (value)) {
> + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> + _("driver serial '%s' contains unsafe characters"),
> + value);
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +
> +int
> +qemuBuildDriveStr(virConnectPtr conn,
> + virDomainDiskDefPtr disk,
> + int bootable,
> + int qemuCmdFlags,
> + char **str)
> +{
> + virBuffer opt = VIR_BUFFER_INITIALIZER;
> + const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
> + int idx = virDiskNameToIndex(disk->dst);
> +
> + if (idx < 0) {
> + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> + _("unsupported disk type '%s'"), disk->dst);
> + goto error;
> + }
> +
> + if (disk->src) {
> + if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) {
> + /* QEMU only supports magic FAT format for now */
> + if (disk->driverType &&
> + STRNEQ(disk->driverType, "fat")) {
> + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> + _("unsupported disk driver type for '%s'"),
> + disk->driverType);
> + goto error;
> + }
> + if (!disk->readonly) {
> + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> + _("cannot create virtual FAT disks in read-write mode"));
> + goto error;
> + }
> + if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
> + virBufferVSprintf(&opt, "file=fat:floppy:%s,", disk->src);
> + else
> + virBufferVSprintf(&opt, "file=fat:%s,", disk->src);
> + } else {
> + virBufferVSprintf(&opt, "file=%s,", disk->src);
> + }
> + }
> + virBufferVSprintf(&opt, "if=%s", bus);
> + if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
> + virBufferAddLit(&opt, ",media=cdrom");
> + virBufferVSprintf(&opt, ",index=%d", idx);
> + if (bootable &&
> + disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
> + virBufferAddLit(&opt, ",boot=on");
> + if (disk->driverType &&
> + disk->type != VIR_DOMAIN_DISK_TYPE_DIR &&
> + qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE_FORMAT)
> + virBufferVSprintf(&opt, ",format=%s", disk->driverType);
> + if (disk->serial &&
> + (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE_SERIAL)) {
> + if (qemuSafeSerialParamValue(conn, disk->serial) < 0)
> + goto error;
> + virBufferVSprintf(&opt, ",serial=%s", disk->serial);
> + }
> +
> + if (disk->cachemode) {
> + const char *mode =
> + (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE_CACHE_V2) ?
> + qemuDiskCacheV2TypeToString(disk->cachemode) :
> + qemuDiskCacheV1TypeToString(disk->cachemode);
> +
> + virBufferVSprintf(&opt, ",cache=%s", mode);
> + } else if (disk->shared && !disk->readonly) {
> + virBufferAddLit(&opt, ",cache=off");
> + }
> +
> + if (virBufferError(&opt)) {
> + virReportOOMError(conn);
> + goto error;
> + }
> +
> + *str = virBufferContentAndReset(&opt);
> + return 0;
> +
> +error:
> + virBufferFreeAndReset(&opt);
> + *str = NULL;
> + return -1;
> +}
> +
> +
> int
> qemuBuildNicStr(virConnectPtr conn,
> virDomainNetDefPtr net,
> @@ -1563,23 +1665,6 @@ static void qemudBuildCommandLineChrDevStr(virDomainChrDefPtr dev,
> }
> }
>
> -#define QEMU_SERIAL_PARAM_ACCEPTED_CHARS \
> - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
> -
> -static int
> -qemuSafeSerialParamValue(virConnectPtr conn,
> - const char *value)
> -{
> - if (strspn(value, QEMU_SERIAL_PARAM_ACCEPTED_CHARS) != strlen (value)) {
> - qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> - _("driver serial '%s' contains unsafe characters"),
> - value);
> - return -1;
> - }
> -
> - return 0;
> -}
> -
> /*
> * Constructs a argv suitable for launching qemu with config defined
> * for a given virtual machine.
> @@ -1983,12 +2068,9 @@ int qemudBuildCommandLine(virConnectPtr conn,
> }
>
> for (i = 0 ; i < def->ndisks ; i++) {
> - virBuffer opt = VIR_BUFFER_INITIALIZER;
> char *optstr;
> int bootable = 0;
> virDomainDiskDefPtr disk = def->disks[i];
> - int idx = virDiskNameToIndex(disk->dst);
> - const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
>
> if (disk->bus == VIR_DOMAIN_DISK_BUS_USB) {
> if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
> @@ -2003,12 +2085,6 @@ int qemudBuildCommandLine(virConnectPtr conn,
>
> ADD_ARG_SPACE;
>
> - if (idx < 0) {
> - qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> - _("unsupported disk type '%s'"), disk->dst);
> - goto error;
> - }
> -
> switch (disk->device) {
> case VIR_DOMAIN_DISK_DEVICE_CDROM:
> bootable = bootCD;
> @@ -2024,64 +2100,8 @@ int qemudBuildCommandLine(virConnectPtr conn,
> break;
> }
>
> - if (disk->src) {
> - if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) {
> - /* QEMU only supports magic FAT format for now */
> - if (disk->driverType &&
> - STRNEQ(disk->driverType, "fat")) {
> - qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> - _("unsupported disk driver type for '%s'"),
> - disk->driverType);
> - goto error;
> - }
> - if (!disk->readonly) {
> - qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> - _("cannot create virtual FAT disks in read-write mode"));
> - goto error;
> - }
> - if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
> - virBufferVSprintf(&opt, "file=fat:floppy:%s,", disk->src);
> - else
> - virBufferVSprintf(&opt, "file=fat:%s,", disk->src);
> - } else {
> - virBufferVSprintf(&opt, "file=%s,", disk->src);
> - }
> - }
> - virBufferVSprintf(&opt, "if=%s", bus);
> - if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
> - virBufferAddLit(&opt, ",media=cdrom");
> - virBufferVSprintf(&opt, ",index=%d", idx);
> - if (bootable &&
> - disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
> - virBufferAddLit(&opt, ",boot=on");
> - if (disk->driverType &&
> - disk->type != VIR_DOMAIN_DISK_TYPE_DIR &&
> - qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE_FORMAT)
> - virBufferVSprintf(&opt, ",format=%s", disk->driverType);
> - if (disk->serial &&
> - (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE_SERIAL)) {
> - if (qemuSafeSerialParamValue(conn, disk->serial) < 0)
> - goto error;
> - virBufferVSprintf(&opt, ",serial=%s", disk->serial);
> - }
> -
> - if (disk->cachemode) {
> - const char *mode =
> - (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE_CACHE_V2) ?
> - qemuDiskCacheV2TypeToString(disk->cachemode) :
> - qemuDiskCacheV1TypeToString(disk->cachemode);
> -
> - virBufferVSprintf(&opt, ",cache=%s", mode);
> - } else if (disk->shared && !disk->readonly) {
> - virBufferAddLit(&opt, ",cache=off");
> - }
> -
> - if (virBufferError(&opt)) {
> - virBufferFreeAndReset(&opt);
> - goto no_memory;
> - }
> -
> - optstr = virBufferContentAndReset(&opt);
> + if (qemuBuildDriveStr(conn, disk, bootable, qemuCmdFlags, &optstr) < 0)
> + goto error;
>
> if ((qargv[qargc++] = strdup("-drive")) == NULL) {
> VIR_FREE(optstr);
> diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
> index 248677a..cd59d4c 100644
> --- a/src/qemu/qemu_conf.h
> +++ b/src/qemu/qemu_conf.h
> @@ -191,6 +191,13 @@ int qemuBuildNicStr (virConnectPtr conn,
> int vlan,
> char **str);
>
> +
> +int qemuBuildDriveStr (virConnectPtr conn,
> + virDomainDiskDefPtr disk,
> + int bootable,
> + int qemuCmdFlags,
> + char **str);
> +
> int qemudNetworkIfaceConnect (virConnectPtr conn,
> struct qemud_driver *driver,
> virDomainNetDefPtr net,
ACK
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list