]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Fix -chardev udp if parameters are omitted
authorCole Robinson <crobinso@redhat.com>
Thu, 11 Aug 2011 07:19:51 +0000 (15:19 +0800)
committerDaniel Veillard <veillard@redhat.com>
Thu, 11 Aug 2011 07:19:51 +0000 (15:19 +0800)
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

src/qemu/qemu_command.c
tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.args
tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.xml
tests/qemuxml2argvdata/qemuxml2argv-serial-udp.args
tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml

index 76df0aa993ce186fa2c3c2edad4e23cb683d2062..2a4882691cd65440f27f99ffd8ec224ef3724519 100644 (file)
@@ -2274,17 +2274,27 @@ qemuBuildChrChardevStr(virDomainChrSourceDefPtr dev, const char *alias,
         virBufferAsprintf(&buf, "stdio,id=char%s", alias);
         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,id=char%s,host=%s,port=%s,localaddr=%s,"
                           "localport=%s",
                           alias,
-                          dev->data.udp.connectHost,
+                          connectHost,
                           dev->data.udp.connectService,
-                          dev->data.udp.bindHost,
-                          dev->data.udp.bindService);
+                          bindHost, bindService);
         break;
-
+    }
     case VIR_DOMAIN_CHR_TYPE_TCP:
         telnet = dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET;
         virBufferAsprintf(&buf,
@@ -2371,14 +2381,25 @@ qemuBuildChrArgStr(virDomainChrSourceDefPtr dev, const char *prefix)
         virBufferAddLit(&buf, "stdio");
         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",
-                          dev->data.udp.connectHost,
+                          connectHost,
                           dev->data.udp.connectService,
-                          dev->data.udp.bindHost,
-                          dev->data.udp.bindService);
+                          bindHost,
+                          bindService);
         break;
-
+    }
     case VIR_DOMAIN_CHR_TYPE_TCP:
         if (dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET) {
             virBufferAsprintf(&buf, "telnet:%s:%s%s",
@@ -5649,13 +5670,12 @@ qemuParseCommandLineChr(virDomainChrSourceDefPtr source,
         host2 = svc1 ? strchr(svc1, '@') : NULL;
         svc2 = host2 ? strchr(host2, ':') : NULL;
 
-        if (svc1)
+        if (svc1 && (svc1 != val)) {
             source->data.udp.connectHost = strndup(val, svc1-val);
-        else
-            source->data.udp.connectHost = strdup(val);
 
-        if (!source->data.udp.connectHost)
-            goto no_memory;
+            if (!source->data.udp.connectHost)
+                goto no_memory;
+        }
 
         if (svc1) {
             svc1++;
@@ -5670,19 +5690,21 @@ qemuParseCommandLineChr(virDomainChrSourceDefPtr source,
 
         if (host2) {
             host2++;
-            if (svc2)
+            if (svc2 && (svc2 != host2)) {
                 source->data.udp.bindHost = strndup(host2, svc2-host2);
-            else
-                source->data.udp.bindHost = strdup(host2);
 
-            if (!source->data.udp.bindHost)
-                goto no_memory;
+                if (!source->data.udp.bindHost)
+                    goto no_memory;
+            }
         }
+
         if (svc2) {
             svc2++;
-            source->data.udp.bindService = strdup(svc2);
-            if (!source->data.udp.bindService)
-                goto no_memory;
+            if (STRNEQ(svc2, "0")) {
+                source->data.udp.bindService = strdup(svc2);
+                if (!source->data.udp.bindService)
+                    goto no_memory;
+            }
         }
     } else if (STRPREFIX(val, "tcp:") ||
                STRPREFIX(val, "telnet:")) {
index 362d860e3583b63391b097f46e548e61a45dc438..7d1cb67731c7f4e4fd7c343725f522f93bde53c2 100644 (file)
@@ -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=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 \
+-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
index 12622d4f755687d3a6a62c88b84da20d7c2c8068..9627c675773a5ffa38a6905adb85b8faabf5fa8e 100644 (file)
       <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'/>
index 53c69bc5220bac90adb26535bb1bff027a01a81b..b612e4b5e1965abedfe05b0edbcbcd9e3ac47931 100644 (file)
@@ -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@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
index 8697f5a07564c8b5c9d62382499b005de84fa391..f606ea4479c5dba93f6dae7ca5afabf43ac60ad6 100644 (file)
       <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'/>