mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
qemu: Fix -chardev udp if parameters are omitted
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. The defaults are empty strings for addresses and 0 for the localport Additionally, tweak the qemu cli parsing to handle omitted host parameters for -serial udp
This commit is contained in:
parent
e6d5d6105c
commit
d30d572650
@ -2274,17 +2274,27 @@ qemuBuildChrChardevStr(virDomainChrSourceDefPtr dev, const char *alias,
|
|||||||
virBufferAsprintf(&buf, "stdio,id=char%s", alias);
|
virBufferAsprintf(&buf, "stdio,id=char%s", alias);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_UDP:
|
case VIR_DOMAIN_CHR_TYPE_UDP: {
|
||||||
|
const char *connectHost = dev->data.udp.connectHost;
|
||||||
|
const char *bindHost = dev->data.udp.bindHost;
|
||||||
|
const char *bindService = dev->data.udp.bindService;
|
||||||
|
|
||||||
|
if (connectHost == NULL)
|
||||||
|
connectHost = "";
|
||||||
|
if (bindHost == NULL)
|
||||||
|
bindHost = "";
|
||||||
|
if (bindService == NULL)
|
||||||
|
bindService = "0";
|
||||||
|
|
||||||
virBufferAsprintf(&buf,
|
virBufferAsprintf(&buf,
|
||||||
"udp,id=char%s,host=%s,port=%s,localaddr=%s,"
|
"udp,id=char%s,host=%s,port=%s,localaddr=%s,"
|
||||||
"localport=%s",
|
"localport=%s",
|
||||||
alias,
|
alias,
|
||||||
dev->data.udp.connectHost,
|
connectHost,
|
||||||
dev->data.udp.connectService,
|
dev->data.udp.connectService,
|
||||||
dev->data.udp.bindHost,
|
bindHost, bindService);
|
||||||
dev->data.udp.bindService);
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case VIR_DOMAIN_CHR_TYPE_TCP:
|
case VIR_DOMAIN_CHR_TYPE_TCP:
|
||||||
telnet = dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET;
|
telnet = dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET;
|
||||||
virBufferAsprintf(&buf,
|
virBufferAsprintf(&buf,
|
||||||
@ -2371,14 +2381,25 @@ qemuBuildChrArgStr(virDomainChrSourceDefPtr dev, const char *prefix)
|
|||||||
virBufferAddLit(&buf, "stdio");
|
virBufferAddLit(&buf, "stdio");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_UDP:
|
case VIR_DOMAIN_CHR_TYPE_UDP: {
|
||||||
virBufferAsprintf(&buf, "udp:%s:%s@%s:%s",
|
const char *connectHost = dev->data.udp.connectHost;
|
||||||
dev->data.udp.connectHost,
|
const char *bindHost = dev->data.udp.bindHost;
|
||||||
dev->data.udp.connectService,
|
const char *bindService = dev->data.udp.bindService;
|
||||||
dev->data.udp.bindHost,
|
|
||||||
dev->data.udp.bindService);
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
if (connectHost == NULL)
|
||||||
|
connectHost = "";
|
||||||
|
if (bindHost == NULL)
|
||||||
|
bindHost = "";
|
||||||
|
if (bindService == NULL)
|
||||||
|
bindService = "0";
|
||||||
|
|
||||||
|
virBufferAsprintf(&buf, "udp:%s:%s@%s:%s",
|
||||||
|
connectHost,
|
||||||
|
dev->data.udp.connectService,
|
||||||
|
bindHost,
|
||||||
|
bindService);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case VIR_DOMAIN_CHR_TYPE_TCP:
|
case VIR_DOMAIN_CHR_TYPE_TCP:
|
||||||
if (dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET) {
|
if (dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET) {
|
||||||
virBufferAsprintf(&buf, "telnet:%s:%s%s",
|
virBufferAsprintf(&buf, "telnet:%s:%s%s",
|
||||||
@ -5649,13 +5670,12 @@ qemuParseCommandLineChr(virDomainChrSourceDefPtr source,
|
|||||||
host2 = svc1 ? strchr(svc1, '@') : NULL;
|
host2 = svc1 ? strchr(svc1, '@') : NULL;
|
||||||
svc2 = host2 ? strchr(host2, ':') : NULL;
|
svc2 = host2 ? strchr(host2, ':') : NULL;
|
||||||
|
|
||||||
if (svc1)
|
if (svc1 && (svc1 != val)) {
|
||||||
source->data.udp.connectHost = strndup(val, svc1-val);
|
source->data.udp.connectHost = strndup(val, svc1-val);
|
||||||
else
|
|
||||||
source->data.udp.connectHost = strdup(val);
|
|
||||||
|
|
||||||
if (!source->data.udp.connectHost)
|
if (!source->data.udp.connectHost)
|
||||||
goto no_memory;
|
goto no_memory;
|
||||||
|
}
|
||||||
|
|
||||||
if (svc1) {
|
if (svc1) {
|
||||||
svc1++;
|
svc1++;
|
||||||
@ -5670,19 +5690,21 @@ qemuParseCommandLineChr(virDomainChrSourceDefPtr source,
|
|||||||
|
|
||||||
if (host2) {
|
if (host2) {
|
||||||
host2++;
|
host2++;
|
||||||
if (svc2)
|
if (svc2 && (svc2 != host2)) {
|
||||||
source->data.udp.bindHost = strndup(host2, svc2-host2);
|
source->data.udp.bindHost = strndup(host2, svc2-host2);
|
||||||
else
|
|
||||||
source->data.udp.bindHost = strdup(host2);
|
|
||||||
|
|
||||||
if (!source->data.udp.bindHost)
|
if (!source->data.udp.bindHost)
|
||||||
goto no_memory;
|
goto no_memory;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (svc2) {
|
if (svc2) {
|
||||||
svc2++;
|
svc2++;
|
||||||
source->data.udp.bindService = strdup(svc2);
|
if (STRNEQ(svc2, "0")) {
|
||||||
if (!source->data.udp.bindService)
|
source->data.udp.bindService = strdup(svc2);
|
||||||
goto no_memory;
|
if (!source->data.udp.bindService)
|
||||||
|
goto no_memory;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (STRPREFIX(val, "tcp:") ||
|
} else if (STRPREFIX(val, "tcp:") ||
|
||||||
STRPREFIX(val, "telnet:")) {
|
STRPREFIX(val, "telnet:")) {
|
||||||
|
@ -3,5 +3,7 @@ pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,\
|
|||||||
id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,\
|
id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,\
|
||||||
id=monitor,mode=readline -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -chardev \
|
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 \
|
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 \
|
-device isa-serial,chardev=charserial0,id=serial0 \
|
||||||
|
-chardev udp,id=charserial1,host=,port=9999,localaddr=,localport=0 \
|
||||||
|
-device isa-serial,chardev=charserial1,id=serial1 -usb -device \
|
||||||
virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
|
virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
|
||||||
|
@ -25,6 +25,10 @@
|
|||||||
<source mode='connect' host='127.0.0.1' service='9998'/>
|
<source mode='connect' host='127.0.0.1' service='9998'/>
|
||||||
<target port='0'/>
|
<target port='0'/>
|
||||||
</serial>
|
</serial>
|
||||||
|
<serial type='udp'>
|
||||||
|
<source mode='connect' service='9999'/>
|
||||||
|
<target port='1'/>
|
||||||
|
</serial>
|
||||||
<console type='udp'>
|
<console type='udp'>
|
||||||
<source mode='bind' host='127.0.0.1' service='9999'/>
|
<source mode='bind' host='127.0.0.1' service='9999'/>
|
||||||
<source mode='connect' host='127.0.0.1' service='9998'/>
|
<source mode='connect' host='127.0.0.1' service='9998'/>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \
|
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 \
|
pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \
|
||||||
-no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial \
|
-no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial \
|
||||||
udp:127.0.0.1:9998@127.0.0.1:9999 -parallel none -usb
|
udp:127.0.0.1:9998@127.0.0.1:9999 -serial udp::9999@:0 -parallel none -usb
|
||||||
|
@ -25,6 +25,10 @@
|
|||||||
<source mode='connect' host='127.0.0.1' service='9998'/>
|
<source mode='connect' host='127.0.0.1' service='9998'/>
|
||||||
<target port='0'/>
|
<target port='0'/>
|
||||||
</serial>
|
</serial>
|
||||||
|
<serial type='udp'>
|
||||||
|
<source mode='connect' service='9999'/>
|
||||||
|
<target port='1'/>
|
||||||
|
</serial>
|
||||||
<console type='udp'>
|
<console type='udp'>
|
||||||
<source mode='bind' host='127.0.0.1' service='9999'/>
|
<source mode='bind' host='127.0.0.1' service='9999'/>
|
||||||
<source mode='connect' host='127.0.0.1' service='9998'/>
|
<source mode='connect' host='127.0.0.1' service='9998'/>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user