提交 d30d5726 编写于 作者: C Cole Robinson 提交者: Daniel Veillard

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
上级 e6d5d610
...@@ -2274,17 +2274,27 @@ qemuBuildChrChardevStr(virDomainChrSourceDefPtr dev, const char *alias, ...@@ -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) ...@@ -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: {
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, "udp:%s:%s@%s:%s", virBufferAsprintf(&buf, "udp:%s:%s@%s:%s",
dev->data.udp.connectHost, connectHost,
dev->data.udp.connectService, dev->data.udp.connectService,
dev->data.udp.bindHost, bindHost,
dev->data.udp.bindService); bindService);
break; 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, ...@@ -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, ...@@ -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,\ ...@@ -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 @@ ...@@ -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'/>
......
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 @@ ...@@ -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'/>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册