The following XML: <serial type='udp'> <source mode='connect' service='9999'/> </serial> is accepted by domain_conf.c but maps to the qemu command line: -chardev udp,host=127.0.0.1,port=2222,localaddr=(null),localport=(null) qemu can cope with everything omitting except the connection port, which seems to also be the intent of domain_conf validation, so let's not generate bogus command lines for that case. Additionally, tweak the qemu cli parsing to handle omitted host parameters for -serial udp --- src/qemu/qemu_command.c | 48 +++++++++++--------- .../qemuxml2argv-serial-udp-chardev.args | 6 ++- .../qemuxml2argv-serial-udp-chardev.xml | 4 ++ .../qemuxml2argvdata/qemuxml2argv-serial-udp.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml | 4 ++ 5 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c9b9850..231d7c3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2119,14 +2119,17 @@ qemuBuildChrChardevStr(virDomainChrSourceDefPtr dev, const char *alias, break; case VIR_DOMAIN_CHR_TYPE_UDP: - virBufferVSprintf(&buf, - "udp,id=char%s,host=%s,port=%s,localaddr=%s," - "localport=%s", + virBufferVSprintf(&buf, "udp,id=char%s,port=%s", alias, - dev->data.udp.connectHost, - dev->data.udp.connectService, - dev->data.udp.bindHost, - dev->data.udp.bindService); + dev->data.udp.connectService); + + if (dev->data.udp.connectHost) + virBufferVSprintf(&buf, ",host=%s", dev->data.udp.connectHost); + if (dev->data.udp.bindHost) + virBufferVSprintf(&buf, ",localaddr=%s", dev->data.udp.bindHost); + if (dev->data.udp.bindService) + virBufferVSprintf(&buf, ",localport=%s", + dev->data.udp.bindService); break; case VIR_DOMAIN_CHR_TYPE_TCP: @@ -2216,11 +2219,13 @@ qemuBuildChrArgStr(virDomainChrSourceDefPtr dev, const char *prefix) break; case VIR_DOMAIN_CHR_TYPE_UDP: - virBufferVSprintf(&buf, "udp:%s:%s@%s:%s", - dev->data.udp.connectHost, - dev->data.udp.connectService, - dev->data.udp.bindHost, - dev->data.udp.bindService); + virBufferVSprintf(&buf, "udp:%s:%s", + dev->data.udp.connectHost ?: "", + dev->data.udp.connectService); + if (dev->data.udp.bindService) + virBufferVSprintf(&buf, "@%s:%s", + dev->data.udp.bindHost ?: "", + dev->data.udp.bindService); break; case VIR_DOMAIN_CHR_TYPE_TCP: @@ -5302,13 +5307,12 @@ qemuParseCommandLineChr(const char *val) host2 = svc1 ? strchr(svc1, '@') : NULL; svc2 = host2 ? strchr(host2, ':') : NULL; - if (svc1) + if (svc1 && (svc1 != val)) { def->source.data.udp.connectHost = strndup(val, svc1-val); - else - def->source.data.udp.connectHost = strdup(val); - if (!def->source.data.udp.connectHost) - goto no_memory; + if (!def->source.data.udp.connectHost) + goto no_memory; + } if (svc1) { svc1++; @@ -5323,14 +5327,14 @@ qemuParseCommandLineChr(const char *val) if (host2) { host2++; - if (svc2) + if (svc2 && (svc2 != host2)) { def->source.data.udp.bindHost = strndup(host2, svc2-host2); - else - def->source.data.udp.bindHost = strdup(host2); - if (!def->source.data.udp.bindHost) - goto no_memory; + if (!def->source.data.udp.bindHost) + goto no_memory; + } } + if (svc2) { svc2++; def->source.data.udp.bindService = strdup(svc2); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.args b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.args index 7525110..8c6a6d5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.args @@ -2,6 +2,8 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \ pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,\ id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,\ id=monitor,mode=readline -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -chardev \ -udp,id=charserial0,host=127.0.0.1,port=9998,localaddr=127.0.0.1,localport=9999 \ --device isa-serial,chardev=charserial0,id=serial0 -usb -device \ +udp,id=charserial0,port=9998,host=127.0.0.1,localaddr=127.0.0.1,localport=9999 \ +-device isa-serial,chardev=charserial0,id=serial0 \ +-chardev udp,id=charserial1,port=9999 \ +-device isa-serial,chardev=charserial1,id=serial1 -usb -device \ virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.xml index 12622d4..9627c67 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.xml @@ -25,6 +25,10 @@ <source mode='connect' host='127.0.0.1' service='9998'/> <target port='0'/> </serial> + <serial type='udp'> + <source mode='connect' service='9999'/> + <target port='1'/> + </serial> <console type='udp'> <source mode='bind' host='127.0.0.1' service='9999'/> <source mode='connect' host='127.0.0.1' service='9998'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.args b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.args index 53c69bc..cf25fe0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.args @@ -1,4 +1,4 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \ pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \ -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial \ -udp:127.0.0.1:9998@xxxxxxxxx:9999 -parallel none -usb +udp:127.0.0.1:9998@xxxxxxxxx:9999 -serial udp::9999 -parallel none -usb diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml index 8697f5a..f606ea4 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml @@ -25,6 +25,10 @@ <source mode='connect' host='127.0.0.1' service='9998'/> <target port='0'/> </serial> + <serial type='udp'> + <source mode='connect' service='9999'/> + <target port='1'/> + </serial> <console type='udp'> <source mode='bind' host='127.0.0.1' service='9999'/> <source mode='connect' host='127.0.0.1' service='9998'/> -- 1.7.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list