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@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list