Refactor QEMU command line building code for readability

This commit is contained in:
Daniel P. Berrange 2008-05-22 23:45:09 +00:00
parent e193b5ddea
commit 7646d59568
2 changed files with 107 additions and 167 deletions

View File

@ -1,3 +1,8 @@
Thu May 22 19:44:29 EST 2008 Daniel P. Berrange <berrange@redhat.com>
* src/qemu_conf.c: Refactor qemudBuildCommandLine to use a
macro for readability
Thu May 22 12:22:29 EST 2008 Daniel P. Berrange <berrange@redhat.com> Thu May 22 12:22:29 EST 2008 Daniel P. Berrange <berrange@redhat.com>
Apply CPU pinning at startup if requested for QEMU Apply CPU pinning at startup if requested for QEMU

View File

@ -2411,8 +2411,8 @@ static int qemudBuildCommandLineChrDevStr(struct qemud_vm_chr_def *dev,
int qemudBuildCommandLine(virConnectPtr conn, int qemudBuildCommandLine(virConnectPtr conn,
struct qemud_driver *driver, struct qemud_driver *driver,
struct qemud_vm *vm, struct qemud_vm *vm,
char ***argv) { char ***retargv) {
int len, n = -1, i; int i;
char memory[50]; char memory[50];
char vcpus[50]; char vcpus[50];
char boot[QEMUD_MAX_BOOT_DEVS+1]; char boot[QEMUD_MAX_BOOT_DEVS+1];
@ -2424,6 +2424,8 @@ int qemudBuildCommandLine(virConnectPtr conn,
struct qemud_vm_chr_def *parallel = vm->def->parallels; struct qemud_vm_chr_def *parallel = vm->def->parallels;
struct utsname ut; struct utsname ut;
int disableKQEMU = 0; int disableKQEMU = 0;
int qargc = 0, qarga = 0;
char **qargv = NULL;
if (vm->qemuVersion == 0) { if (vm->qemuVersion == 0) {
if (qemudExtractVersionInfo(vm->def->os.binary, if (qemudExtractVersionInfo(vm->def->os.binary,
@ -2451,65 +2453,46 @@ int qemudBuildCommandLine(virConnectPtr conn,
vm->def->virtType == QEMUD_VIRT_QEMU) vm->def->virtType == QEMUD_VIRT_QEMU)
disableKQEMU = 1; disableKQEMU = 1;
len = 1 + /* qemu */ #define ADD_ARG_SPACE \
1 + /* Stopped */ do { \
2 + /* machine type */ if (qargc == qarga) { \
disableKQEMU + /* Disable kqemu */ qarga += 10; \
(vm->qemuCmdFlags & QEMUD_CMD_FLAG_NAME ? 2 : 0) + /* -name XXX */ if (VIR_REALLOC_N(qargv, qarga) < 0) \
2 * vm->def->ndisks + /* disks*/ goto no_memory; \
(vm->def->nnets > 0 ? (4 * vm->def->nnets) : 2) + /* networks */ } \
1 + /* usb */ } while (0)
2 * vm->def->ninputs + /* input devices */
((vm->def->nsounds > 0) ? 2 : 0) + /* sound */ #define ADD_ARG(thisarg) \
(vm->def->nserials > 0 ? (2 * vm->def->nserials) : 2) + /* character devices */ do { \
(vm->def->nparallels > 0 ? (2 * vm->def->nparallels) : 2) + /* character devices */ ADD_ARG_SPACE; \
2 + /* memory*/ qargv[qargc++] = thisarg; \
2 + /* cpus */ } while (0)
2 + /* boot device */
2 + /* monitor */ #define ADD_ARG_LIT(thisarg) \
(vm->def->localtime ? 1 : 0) + /* localtime */ do { \
(vm->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT && ADD_ARG_SPACE; \
vm->def->noReboot ? 1 : 0) + /* no-reboot */ if ((qargv[qargc++] = strdup(thisarg)) == NULL) \
(vm->def->features & QEMUD_FEATURE_ACPI ? 0 : 1) + /* acpi */ goto no_memory; \
(vm->def->os.kernel[0] ? 2 : 0) + /* kernel */ } while (0)
(vm->def->os.initrd[0] ? 2 : 0) + /* initrd */
(vm->def->os.cmdline[0] ? 2 : 0) + /* cmdline */
(vm->def->os.bootloader[0] ? 2 : 0) + /* bootloader */
(vm->def->graphicsType == QEMUD_GRAPHICS_VNC ? 2 :
(vm->def->graphicsType == QEMUD_GRAPHICS_SDL ? 0 : 1)) + /* graphics */
(vm->migrateFrom[0] ? 2 : 0); /* migrateFrom */
snprintf(memory, sizeof(memory), "%lu", vm->def->memory/1024); snprintf(memory, sizeof(memory), "%lu", vm->def->memory/1024);
snprintf(vcpus, sizeof(vcpus), "%d", vm->def->vcpus); snprintf(vcpus, sizeof(vcpus), "%d", vm->def->vcpus);
if (!(*argv = calloc(len+1, sizeof(**argv))))
goto no_memory; ADD_ARG_LIT(vm->def->os.binary);
if (!((*argv)[++n] = strdup(vm->def->os.binary))) ADD_ARG_LIT("-S");
goto no_memory; ADD_ARG_LIT("-M");
if (!((*argv)[++n] = strdup("-S"))) ADD_ARG_LIT(vm->def->os.machine);
goto no_memory; if (disableKQEMU)
if (!((*argv)[++n] = strdup("-M"))) ADD_ARG_LIT("-no-kqemu");
goto no_memory; ADD_ARG_LIT("-m");
if (!((*argv)[++n] = strdup(vm->def->os.machine))) ADD_ARG_LIT(memory);
goto no_memory; ADD_ARG_LIT("-smp");
if (disableKQEMU) { ADD_ARG_LIT(vcpus);
if (!((*argv)[++n] = strdup("-no-kqemu")))
goto no_memory;
}
if (!((*argv)[++n] = strdup("-m")))
goto no_memory;
if (!((*argv)[++n] = strdup(memory)))
goto no_memory;
if (!((*argv)[++n] = strdup("-smp")))
goto no_memory;
if (!((*argv)[++n] = strdup(vcpus)))
goto no_memory;
if (vm->qemuCmdFlags & QEMUD_CMD_FLAG_NAME) { if (vm->qemuCmdFlags & QEMUD_CMD_FLAG_NAME) {
if (!((*argv)[++n] = strdup("-name"))) ADD_ARG_LIT("-name");
goto no_memory; ADD_ARG_LIT(vm->def->name);
if (!((*argv)[++n] = strdup(vm->def->name)))
goto no_memory;
} }
/* /*
* NB, -nographic *MUST* come before any serial, or monitor * NB, -nographic *MUST* come before any serial, or monitor
@ -2518,31 +2501,21 @@ int qemudBuildCommandLine(virConnectPtr conn,
* if you ask for nographic. So we have to make sure we override * if you ask for nographic. So we have to make sure we override
* these defaults ourselves... * these defaults ourselves...
*/ */
if (vm->def->graphicsType == QEMUD_GRAPHICS_NONE) { if (vm->def->graphicsType == QEMUD_GRAPHICS_NONE)
if (!((*argv)[++n] = strdup("-nographic"))) ADD_ARG_LIT("-nographic");
goto no_memory;
}
if (!((*argv)[++n] = strdup("-monitor"))) ADD_ARG_LIT("-monitor");
goto no_memory; ADD_ARG_LIT("pty");
if (!((*argv)[++n] = strdup("pty")))
goto no_memory;
if (vm->def->localtime) { if (vm->def->localtime)
if (!((*argv)[++n] = strdup("-localtime"))) ADD_ARG_LIT("-localtime");
goto no_memory;
}
if (vm->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT && if ((vm->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT) &&
vm->def->noReboot) { vm->def->noReboot)
if (!((*argv)[++n] = strdup("-no-reboot"))) ADD_ARG_LIT("-no-reboot");
goto no_memory;
}
if (!(vm->def->features & QEMUD_FEATURE_ACPI)) { if (!(vm->def->features & QEMUD_FEATURE_ACPI))
if (!((*argv)[++n] = strdup("-no-acpi"))) ADD_ARG_LIT("-no-acpi");
goto no_memory;
}
if (!vm->def->os.bootloader[0]) { if (!vm->def->os.bootloader[0]) {
for (i = 0 ; i < vm->def->os.nBootDevs ; i++) { for (i = 0 ; i < vm->def->os.nBootDevs ; i++) {
@ -2565,34 +2538,24 @@ int qemudBuildCommandLine(virConnectPtr conn,
} }
} }
boot[vm->def->os.nBootDevs] = '\0'; boot[vm->def->os.nBootDevs] = '\0';
if (!((*argv)[++n] = strdup("-boot"))) ADD_ARG_LIT("-boot");
goto no_memory; ADD_ARG_LIT(boot);
if (!((*argv)[++n] = strdup(boot)))
goto no_memory;
if (vm->def->os.kernel[0]) { if (vm->def->os.kernel[0]) {
if (!((*argv)[++n] = strdup("-kernel"))) ADD_ARG_LIT("-kernel");
goto no_memory; ADD_ARG_LIT(vm->def->os.kernel);
if (!((*argv)[++n] = strdup(vm->def->os.kernel)))
goto no_memory;
} }
if (vm->def->os.initrd[0]) { if (vm->def->os.initrd[0]) {
if (!((*argv)[++n] = strdup("-initrd"))) ADD_ARG_LIT("-initrd");
goto no_memory; ADD_ARG_LIT(vm->def->os.initrd);
if (!((*argv)[++n] = strdup(vm->def->os.initrd)))
goto no_memory;
} }
if (vm->def->os.cmdline[0]) { if (vm->def->os.cmdline[0]) {
if (!((*argv)[++n] = strdup("-append"))) ADD_ARG_LIT("-append");
goto no_memory; ADD_ARG_LIT(vm->def->os.cmdline);
if (!((*argv)[++n] = strdup(vm->def->os.cmdline)))
goto no_memory;
} }
} else { } else {
if (!((*argv)[++n] = strdup("-bootloader"))) ADD_ARG_LIT("-bootloader");
goto no_memory; ADD_ARG_LIT(vm->def->os.bootloader);
if (!((*argv)[++n] = strdup(vm->def->os.bootloader)))
goto no_memory;
} }
/* If QEMU supports -drive param instead of old -hda, -hdb, -cdrom .. */ /* If QEMU supports -drive param instead of old -hda, -hdb, -cdrom .. */
@ -2621,8 +2584,6 @@ int qemudBuildCommandLine(virConnectPtr conn,
const char *media = NULL; const char *media = NULL;
int bootable = 0; int bootable = 0;
int idx = virDiskNameToIndex(disk->dst); int idx = virDiskNameToIndex(disk->dst);
if (!((*argv)[++n] = strdup("-drive")))
goto no_memory;
if (idx < 0) { if (idx < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
@ -2654,8 +2615,8 @@ int qemudBuildCommandLine(virConnectPtr conn,
idx, idx,
bootable ? ",boot=on" : ""); bootable ? ",boot=on" : "");
if (!((*argv)[++n] = strdup(opt))) ADD_ARG_LIT("-drive");
goto no_memory; ADD_ARG_LIT(opt);
disk = disk->next; disk = disk->next;
} }
} else { } else {
@ -2684,20 +2645,16 @@ int qemudBuildCommandLine(virConnectPtr conn,
snprintf(file, PATH_MAX, "%s", disk->src); snprintf(file, PATH_MAX, "%s", disk->src);
if (!((*argv)[++n] = strdup(dev))) ADD_ARG_LIT(dev);
goto no_memory; ADD_ARG_LIT(file);
if (!((*argv)[++n] = strdup(file)))
goto no_memory;
disk = disk->next; disk = disk->next;
} }
} }
if (!net) { if (!net) {
if (!((*argv)[++n] = strdup("-net"))) ADD_ARG_LIT("-net");
goto no_memory; ADD_ARG_LIT("none");
if (!((*argv)[++n] = strdup("none")))
goto no_memory;
} else { } else {
int vlan = 0; int vlan = 0;
while (net) { while (net) {
@ -2712,19 +2669,14 @@ int qemudBuildCommandLine(virConnectPtr conn,
(net->model[0] ? ",model=" : ""), net->model) >= sizeof(nic)) (net->model[0] ? ",model=" : ""), net->model) >= sizeof(nic))
goto error; goto error;
if (!((*argv)[++n] = strdup("-net"))) ADD_ARG_LIT("-net");
goto no_memory; ADD_ARG_LIT(nic);
if (!((*argv)[++n] = strdup(nic))) ADD_ARG_LIT("-net");
goto no_memory;
if (!((*argv)[++n] = strdup("-net")))
goto no_memory;
switch (net->type) { switch (net->type) {
case QEMUD_NET_NETWORK: case QEMUD_NET_NETWORK:
case QEMUD_NET_BRIDGE: case QEMUD_NET_BRIDGE:
if (!((*argv)[++n] = qemudNetworkIfaceConnect(conn, driver, vm, net, vlan))) ADD_ARG(qemudNetworkIfaceConnect(conn, driver, vm, net, vlan));
goto error;
break; break;
case QEMUD_NET_ETHERNET: case QEMUD_NET_ETHERNET:
@ -2736,8 +2688,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
vlan) >= (PATH_MAX-1)) vlan) >= (PATH_MAX-1))
goto error; goto error;
if (!((*argv)[++n] = strdup(arg))) ADD_ARG_LIT(arg);
goto no_memory;
} }
break; break;
@ -2765,8 +2716,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
vlan) >= (PATH_MAX-1)) vlan) >= (PATH_MAX-1))
goto error; goto error;
if (!((*argv)[++n] = strdup(arg))) ADD_ARG_LIT(arg);
goto no_memory;
} }
break; break;
@ -2777,8 +2727,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
if (snprintf(arg, PATH_MAX-1, "user,vlan=%d", vlan) >= (PATH_MAX-1)) if (snprintf(arg, PATH_MAX-1, "user,vlan=%d", vlan) >= (PATH_MAX-1))
goto error; goto error;
if (!((*argv)[++n] = strdup(arg))) ADD_ARG_LIT(arg);
goto no_memory;
} }
} }
@ -2788,10 +2737,8 @@ int qemudBuildCommandLine(virConnectPtr conn,
} }
if (!serial) { if (!serial) {
if (!((*argv)[++n] = strdup("-serial"))) ADD_ARG_LIT("-serial");
goto no_memory; ADD_ARG_LIT("none");
if (!((*argv)[++n] = strdup("none")))
goto no_memory;
} else { } else {
while (serial) { while (serial) {
char buf[4096]; char buf[4096];
@ -2799,20 +2746,16 @@ int qemudBuildCommandLine(virConnectPtr conn,
if (qemudBuildCommandLineChrDevStr(serial, buf, sizeof(buf)) < 0) if (qemudBuildCommandLineChrDevStr(serial, buf, sizeof(buf)) < 0)
goto error; goto error;
if (!((*argv)[++n] = strdup("-serial"))) ADD_ARG_LIT("-serial");
goto no_memory; ADD_ARG_LIT(buf);
if (!((*argv)[++n] = strdup(buf)))
goto no_memory;
serial = serial->next; serial = serial->next;
} }
} }
if (!parallel) { if (!parallel) {
if (!((*argv)[++n] = strdup("-parallel"))) ADD_ARG_LIT("-parallel");
goto no_memory; ADD_ARG_LIT("none");
if (!((*argv)[++n] = strdup("none")))
goto no_memory;
} else { } else {
while (parallel) { while (parallel) {
char buf[4096]; char buf[4096];
@ -2820,23 +2763,18 @@ int qemudBuildCommandLine(virConnectPtr conn,
if (qemudBuildCommandLineChrDevStr(parallel, buf, sizeof(buf)) < 0) if (qemudBuildCommandLineChrDevStr(parallel, buf, sizeof(buf)) < 0)
goto error; goto error;
if (!((*argv)[++n] = strdup("-parallel"))) ADD_ARG_LIT("-parallel");
goto no_memory; ADD_ARG_LIT(buf);
if (!((*argv)[++n] = strdup(buf)))
goto no_memory;
parallel = parallel->next; parallel = parallel->next;
} }
} }
if (!((*argv)[++n] = strdup("-usb"))) ADD_ARG_LIT("-usb");
goto no_memory;
while (input) { while (input) {
if (input->bus == QEMU_INPUT_BUS_USB) { if (input->bus == QEMU_INPUT_BUS_USB) {
if (!((*argv)[++n] = strdup("-usbdevice"))) ADD_ARG_LIT("-usbdevice");
goto no_memory; ADD_ARG_LIT(input->type == QEMU_INPUT_TYPE_MOUSE ? "mouse" : "tablet");
if (!((*argv)[++n] = strdup(input->type == QEMU_INPUT_TYPE_MOUSE ? "mouse" : "tablet")))
goto no_memory;
} }
input = input->next; input = input->next;
@ -2870,15 +2808,11 @@ int qemudBuildCommandLine(virConnectPtr conn,
if (ret < 0 || ret >= (int)sizeof(vncdisplay)) if (ret < 0 || ret >= (int)sizeof(vncdisplay))
goto error; goto error;
if (!((*argv)[++n] = strdup("-vnc"))) ADD_ARG_LIT("-vnc");
goto no_memory; ADD_ARG_LIT(vncdisplay);
if (!((*argv)[++n] = strdup(vncdisplay)))
goto no_memory;
if (vm->def->keymap) { if (vm->def->keymap) {
if (!((*argv)[++n] = strdup("-k"))) ADD_ARG_LIT("-k");
goto no_memory; ADD_ARG_LIT(vm->def->keymap);
if (!((*argv)[++n] = strdup(vm->def->keymap)))
goto no_memory;
} }
} else if (vm->def->graphicsType == QEMUD_GRAPHICS_NONE) { } else if (vm->def->graphicsType == QEMUD_GRAPHICS_NONE) {
/* Nada - we added -nographic earlier in this function */ /* Nada - we added -nographic earlier in this function */
@ -2892,12 +2826,11 @@ int qemudBuildCommandLine(virConnectPtr conn,
char *modstr = calloc(1, size+1); char *modstr = calloc(1, size+1);
if (!modstr) if (!modstr)
goto no_memory; goto no_memory;
if (!((*argv)[++n] = strdup("-soundhw")))
goto no_memory;
while(sound && size > 0) { while(sound && size > 0) {
const char *model = qemudSoundModelToString(sound->model); const char *model = qemudSoundModelToString(sound->model);
if (!model) { if (!model) {
free(modstr);
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
"%s", _("invalid sound model")); "%s", _("invalid sound model"));
goto error; goto error;
@ -2908,19 +2841,18 @@ int qemudBuildCommandLine(virConnectPtr conn,
if (sound) if (sound)
strncat(modstr, ",", size--); strncat(modstr, ",", size--);
} }
if (!((*argv)[++n] = modstr)) ADD_ARG_LIT("-soundhw");
goto no_memory; ADD_ARG(modstr);
} }
if (vm->migrateFrom[0]) { if (vm->migrateFrom[0]) {
if (!((*argv)[++n] = strdup("-incoming"))) ADD_ARG_LIT("-incoming");
goto no_memory; ADD_ARG_LIT(vm->migrateFrom);
if (!((*argv)[++n] = strdup(vm->migrateFrom)))
goto no_memory;
} }
(*argv)[++n] = NULL; ADD_ARG(NULL);
*retargv = qargv;
return 0; return 0;
no_memory: no_memory:
@ -2934,13 +2866,16 @@ int qemudBuildCommandLine(virConnectPtr conn,
vm->tapfds = NULL; vm->tapfds = NULL;
vm->ntapfds = 0; vm->ntapfds = 0;
} }
if (argv) { if (qargv) {
for (i = 0 ; i < n ; i++) for (i = 0 ; i < qargc ; i++)
free((*argv)[i]); free((qargv)[i]);
free(*argv); free(qargv);
*argv = NULL;
} }
return -1; return -1;
#undef ADD_ARG
#undef ADD_ARG_LIT
#undef ADD_ARG_SPACE
} }