The macro is huge and gives us nothing but headache when maintaining it. --- The reason for this patch is not that I'm going to modify anything in the code. It's that I was working in the area and noticed this huge macro. src/qemu/qemu_process.c | 102 ++++++++++++++++++++++++++++------------------- 1 files changed, 61 insertions(+), 41 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 90fcea0..53a42a5 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -895,51 +895,71 @@ qemuProcessExtractTTYPath(const char *haystack, } static int +qemuProcessLookupPTYs(virDomainChrDefPtr *devices, + int count, + const char *prefix, + virHashTablePtr paths) +{ + int i; + + for (i = 0 ; i < count ; i++) { + virDomainChrDefPtr chr = devices[i]; + if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { + char id[16]; + const char *path; + + if (snprintf(id, sizeof(id), "%s%d", prefix, i) >= sizeof(id)) + return -1; + + path = (const char *) virHashLookup(paths, id); + if (path == NULL) { + if (chr->source.data.file.path == NULL) { + /* neither the log output nor 'info chardev' had a + * pty path for this chardev, report an error + */ + qemuReportError(VIR_ERR_INTERNAL_ERROR, + _("no assigned pty for device %s"), id); + return -1; + } else { + /* 'info chardev' had no pty path for this chardev, + * but the log output had, so we're fine + */ + continue; + } + } + + VIR_FREE(chr->source.data.file.path); + chr->source.data.file.path = strdup(path); + + if (chr->source.data.file.path == NULL) { + virReportOOMError(); + return -1; + } + } + } + + return 0; +} + +static int qemuProcessFindCharDevicePTYsMonitor(virDomainObjPtr vm, virHashTablePtr paths) { - int i; + if (qemuProcessLookupPTYs(vm->def->serials, vm->def->nserials, + "serial", paths) < 0) + return -1; + + if (qemuProcessLookupPTYs(vm->def->parallels, vm->def->nparallels, + "parallel", paths) < 0) + return -1; -#define LOOKUP_PTYS(array, arraylen, idprefix) \ - for (i = 0 ; i < (arraylen) ; i++) { \ - virDomainChrDefPtr chr = (array)[i]; \ - if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { \ - char id[16]; \ - \ - if (snprintf(id, sizeof(id), idprefix "%i", i) >= sizeof(id)) \ - return -1; \ - \ - const char *path = (const char *) virHashLookup(paths, id); \ - if (path == NULL) { \ - if (chr->source.data.file.path == NULL) { \ - /* neither the log output nor 'info chardev' had a */ \ - /* pty path for this chardev, report an error */ \ - qemuReportError(VIR_ERR_INTERNAL_ERROR, \ - _("no assigned pty for device %s"), id); \ - return -1; \ - } else { \ - /* 'info chardev' had no pty path for this chardev, */\ - /* but the log output had, so we're fine */ \ - continue; \ - } \ - } \ - \ - VIR_FREE(chr->source.data.file.path); \ - chr->source.data.file.path = strdup(path); \ - \ - if (chr->source.data.file.path == NULL) { \ - virReportOOMError(); \ - return -1; \ - } \ - } \ - } - - LOOKUP_PTYS(vm->def->serials, vm->def->nserials, "serial"); - LOOKUP_PTYS(vm->def->parallels, vm->def->nparallels, "parallel"); - LOOKUP_PTYS(vm->def->channels, vm->def->nchannels, "channel"); - if (vm->def->console) - LOOKUP_PTYS(&vm->def->console, 1, "console"); -#undef LOOKUP_PTYS + if (qemuProcessLookupPTYs(vm->def->channels, vm->def->nchannels, + "channel", paths) < 0) + return -1; + + if (vm->def->console && + qemuProcessLookupPTYs(&vm->def->console, 1, "console", paths) < 0) + return -1; return 0; } -- 1.7.4.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list