[libvirt] [PATCH] Add support for multiple serial ports into the Xen driver

Michal Novotny minovotn at redhat.com
Sat Jan 22 16:46:17 UTC 2011


Hi,
this is the patch to add support for multiple serial ports to the
libvirt Xen driver. It support both old style (serial = "pty") and
new style (serial = [ "/dev/ttyS0", "/dev/ttyS1" ]) definition and
tests for xml2sexpr, sexpr2xml and xmconfig have been added as well.

Written and tested on RHEL-5 Xen dom0 and working as designed but
the Xen version have to have patch for RHBZ #614004.

Also, this patch is addressing issue described in RHBZ #670789.

Michal

Signed-off-by: Michal Novotny <minovotn at redhat.com>
---
 src/xen/xend_internal.c                            |   73 ++++++++++-
 src/xen/xm_internal.c                              |  141 +++++++++++++++++---
 .../sexpr2xml-fv-serial-dev-2-ports.sexpr          |    1 +
 .../sexpr2xml-fv-serial-dev-2-ports.xml            |   53 ++++++++
 tests/sexpr2xmltest.c                              |    1 +
 .../test-fullvirt-serial-dev-2-ports.cfg           |   25 ++++
 .../test-fullvirt-serial-dev-2-ports.xml           |   55 ++++++++
 tests/xmconfigtest.c                               |    1 +
 .../xml2sexpr-fv-serial-dev-2-ports.sexpr          |    1 +
 .../xml2sexpr-fv-serial-dev-2-ports.xml            |   44 ++++++
 tests/xml2sexprtest.c                              |    1 +
 11 files changed, 370 insertions(+), 26 deletions(-)
 create mode 100644 tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2-ports.sexpr
 create mode 100644 tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2-ports.xml
 create mode 100644 tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.cfg
 create mode 100644 tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.xml
 create mode 100644 tests/xml2sexprdata/xml2sexpr-fv-serial-dev-2-ports.sexpr
 create mode 100644 tests/xml2sexprdata/xml2sexpr-fv-serial-dev-2-ports.xml

diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
index 44d5a22..493736e 100644
--- a/src/xen/xend_internal.c
+++ b/src/xen/xend_internal.c
@@ -1218,6 +1218,9 @@ xenDaemonParseSxprChar(const char *value,
 
     if (value[0] == '/') {
         def->source.type = VIR_DOMAIN_CHR_TYPE_DEV;
+        def->data.file.path = strdup(value);
+        if (!def->data.file.path)
+            goto error;
     } else {
         if ((tmp = strchr(value, ':')) != NULL) {
             *tmp = '\0';
@@ -2334,6 +2337,8 @@ xenDaemonParseSxpr(virConnectPtr conn,
     tty = xenStoreDomainGetConsolePath(conn, def->id);
     xenUnifiedUnlock(priv);
     if (hvm) {
+
+
         tmp = sexpr_node(root, "domain/image/hvm/serial");
         if (tmp && STRNEQ(tmp, "none")) {
             virDomainChrDefPtr chr;
@@ -2346,6 +2351,54 @@ xenDaemonParseSxpr(virConnectPtr conn,
             chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
             def->serials[def->nserials++] = chr;
         }
+
+
+        const struct sexpr *serial_root;
+        bool have_multiple_serials = false;
+
+        serial_root = sexpr_lookup(root, "domain/image/hvm/serial");
+        if (serial_root) {
+            const struct sexpr *cur, *node, *cur2;
+
+            for (cur = serial_root; cur->kind == SEXPR_CONS; cur = cur->u.s.cdr) {
+                node = cur->u.s.car;
+
+                for (cur2 = node; cur2->kind == SEXPR_CONS; cur2 = cur2->u.s.cdr) {
+                    tmp = cur2->u.s.car->u.value;
+
+                    if (tmp && STRNEQ(tmp, "none")) {
+                        virDomainChrDefPtr chr;
+                        if ((chr = xenDaemonParseSxprChar(tmp, tty)) == NULL)
+                            goto error;
+                        if (VIR_REALLOC_N(def->serials, def->nserials+1) < 0) {
+                            virDomainChrDefFree(chr);
+                            goto no_memory;
+                        }
+                        chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
+                        chr->target.port = def->nserials;
+                        def->serials[def->nserials++] = chr;
+                    }
+                    have_multiple_serials = true;
+                }
+            }
+        }
+
+        /* If no serial port has been defined (using the new-style definition) use the old way */
+        if (!have_multiple_serials) {
+            tmp = sexpr_node(root, "domain/image/hvm/serial");
+            if (tmp && STRNEQ(tmp, "none")) {
+                virDomainChrDefPtr chr;
+                if ((chr = xenDaemonParseSxprChar(tmp, tty)) == NULL)
+                    goto error;
+                if (VIR_REALLOC_N(def->serials, def->nserials+1) < 0) {
+                    virDomainChrDefFree(chr);
+                    goto no_memory;
+                }
+                chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
+                def->serials[def->nserials++] = chr;
+            }
+        }
+
         tmp = sexpr_node(root, "domain/image/hvm/parallel");
         if (tmp && STRNEQ(tmp, "none")) {
             virDomainChrDefPtr chr;
@@ -5958,10 +6011,22 @@ xenDaemonFormatSxpr(virConnectPtr conn,
                 virBufferAddLit(&buf, "(parallel none)");
             }
             if (def->serials) {
-                virBufferAddLit(&buf, "(serial ");
-                if (xenDaemonFormatSxprChr(def->serials[0], &buf) < 0)
-                    goto error;
-                virBufferAddLit(&buf, ")");
+                if (def->nserials > 1) {
+                    virBufferAddLit(&buf, "(serial (");
+                    for (i = 0; i < def->nserials; i++) {
+                        if (xenDaemonFormatSxprChr(def->serials[i], &buf) < 0)
+                            goto error;
+                        if (i < def->nserials - 1)
+                            virBufferAddLit(&buf, " ");
+                    }
+                    virBufferAddLit(&buf, "))");
+                }
+                else {
+                    virBufferAddLit(&buf, "(serial ");
+                    if (xenDaemonFormatSxprChr(def->serials[0], &buf) < 0)
+                        goto error;
+                    virBufferAddLit(&buf, ")");
+                }
             } else {
                 virBufferAddLit(&buf, "(serial none)");
             }
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
index bfb6698..f457d80 100644
--- a/src/xen/xm_internal.c
+++ b/src/xen/xm_internal.c
@@ -1432,20 +1432,54 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
             chr = NULL;
         }
 
-        if (xenXMConfigGetString(conf, "serial", &str, NULL) < 0)
-            goto cleanup;
-        if (str && STRNEQ(str, "none") &&
-            !(chr = xenDaemonParseSxprChar(str, NULL)))
-            goto cleanup;
+        /* Try to get the list of values to support multiple serial ports */
+        list = virConfGetValue(conf, "serial");
+        if (list && list->type == VIR_CONF_LIST) {
+            list = list->list;
+            while (list) {
+                char *port;
+
+                if ((list->type != VIR_CONF_STRING) || (list->str == NULL)) {
+                    xenXMError(VIR_ERR_INTERNAL_ERROR,
+                        _("config value %s was malformed"), port);
+                    goto cleanup;
+                }
 
-        if (chr) {
-            if (VIR_ALLOC_N(def->serials, 1) < 0) {
-                virDomainChrDefFree(chr);
-                goto no_memory;
+                port = list->str;
+                if (VIR_ALLOC(chr) < 0)
+                    goto no_memory;
+                if (!(chr = xenDaemonParseSxprChar(port, NULL)))
+                    goto cleanup;
+
+                if (VIR_REALLOC_N(def->serials, def->nserials+1) < 0)
+                    goto no_memory;
+
+                chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
+                chr->target.port = def->nserials;
+
+                def->serials[def->nserials++] = chr;
+                chr = NULL;
+
+                list = list->next;
+            }
+        }
+        /* If domain is not using multiple serial ports we parse data old way */
+        else {
+            if (xenXMConfigGetString(conf, "serial", &str, NULL) < 0)
+                goto cleanup;
+            if (str && STRNEQ(str, "none") &&
+                !(chr = xenDaemonParseSxprChar(str, NULL)))
+                goto cleanup;
+
+            if (chr) {
+                if (VIR_ALLOC_N(def->serials, 1) < 0) {
+                    virDomainChrDefFree(chr);
+                    goto no_memory;
+                }
+                chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
+                def->serials[0] = chr;
+                def->nserials++;
             }
-            chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
-            def->serials[0] = chr;
-            def->nserials++;
         }
     } else {
         if (!(def->console = xenDaemonParseSxprChar("pty", NULL)))
@@ -2123,6 +2157,45 @@ cleanup:
     return -1;
 }
 
+static int xenXMDomainConfigFormatSerial(virConfValuePtr list,
+                                          virDomainChrDefPtr serial)
+{
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
+    virConfValuePtr val, tmp;
+    int ret;
+
+    ret = xenDaemonFormatSxprChr(serial, &buf);
+    if (ret < 0) {
+       virReportOOMError();
+       goto cleanup;
+    }
+    if (virBufferError(&buf)) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if (VIR_ALLOC(val) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    val->type = VIR_CONF_STRING;
+    val->str = virBufferContentAndReset(&buf);
+    tmp = list->list;
+    while (tmp && tmp->next)
+        tmp = tmp->next;
+    if (tmp)
+        tmp->next = val;
+    else
+        list->list = val;
+
+    return 0;
+
+cleanup:
+    virBufferFreeAndReset(&buf);
+    return -1;
+}
+
 static int xenXMDomainConfigFormatNet(virConnectPtr conn,
                                       virConfValuePtr list,
                                       virDomainNetDefPtr net,
@@ -2685,17 +2758,41 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
         }
 
         if (def->nserials) {
-            virBuffer buf = VIR_BUFFER_INITIALIZER;
-            char *str;
-            int ret;
+            /* If there's a single serial port definition use the old approach not to break old configs */
+            if (def->nserials == 1) {
+                virBuffer buf = VIR_BUFFER_INITIALIZER;
+                char *str;
+                int ret;
+
+                ret = xenDaemonFormatSxprChr(def->serials[0], &buf);
+                str = virBufferContentAndReset(&buf);
+                if (ret == 0)
+                    ret = xenXMConfigSetString(conf, "serial", str);
+                VIR_FREE(str);
+                if (ret < 0)
+                    goto no_memory;
+            }
+            else {
+                virConfValuePtr serialVal = NULL;
 
-            ret = xenDaemonFormatSxprChr(def->serials[0], &buf);
-            str = virBufferContentAndReset(&buf);
-            if (ret == 0)
-                ret = xenXMConfigSetString(conf, "serial", str);
-            VIR_FREE(str);
-            if (ret < 0)
-                goto no_memory;
+                if (VIR_ALLOC(serialVal) < 0)
+                    goto no_memory;
+                serialVal->type = VIR_CONF_LIST;
+                serialVal->list = NULL;
+
+                for (i = 0; i < def->nserials; i++) {
+                    if (xenXMDomainConfigFormatSerial(serialVal, def->serials[i]) < 0)
+                        goto cleanup;
+                }
+
+                if (serialVal->list != NULL) {
+                    int ret = virConfSetValue(conf, "serial", serialVal);
+                    serialVal = NULL;
+                    if (ret < 0)
+                        goto no_memory;
+                }
+                VIR_FREE(serialVal);
+            }
         } else {
             if (xenXMConfigSetString(conf, "serial", "none") < 0)
                 goto no_memory;
diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2-ports.sexpr b/tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2-ports.sexpr
new file mode 100644
index 0000000..e709eb0
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2-ports.sexpr
@@ -0,0 +1 @@
+(domain (domid 1)(name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)(uuid 'b5d70dd275cdaca517769660b059d8ff')(on_poweroff 'destroy')(on_reboot 'restart')(on_crash 'restart')(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)(cdrom '/root/boot.iso')(acpi 1)(usb 1)(parallel none)(serial (/dev/ttyS0 /dev/ttyS1))(device_model '/usr/lib64/xen/bin/qemu-dm')(vnc 1)))(device (vbd (dev 'ioemu:hda')(uname 'file:/root/foo.img')(mode 'w')))(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')(type ioemu))))
diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2-ports.xml b/tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2-ports.xml
new file mode 100644
index 0000000..783cd67
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-fv-serial-dev-2-ports.xml
@@ -0,0 +1,53 @@
+<domain type='xen' id='1'>
+  <name>fvtest</name>
+  <uuid>b5d70dd2-75cd-aca5-1776-9660b059d8ff</uuid>
+  <memory>409600</memory>
+  <currentMemory>409600</currentMemory>
+  <vcpu>1</vcpu>
+  <os>
+    <type>hvm</type>
+    <loader>/usr/lib/xen/boot/hvmloader</loader>
+    <boot dev='hd'/>
+  </os>
+  <features>
+    <acpi/>
+  </features>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>restart</on_crash>
+  <devices>
+    <emulator>/usr/lib64/xen/bin/qemu-dm</emulator>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/root/foo.img'/>
+      <target dev='hda' bus='ide'/>
+    </disk>
+    <disk type='file' device='cdrom'>
+      <driver name='file'/>
+      <source file='/root/boot.iso'/>
+      <target dev='hdc' bus='ide'/>
+      <readonly/>
+    </disk>
+    <interface type='bridge'>
+      <mac address='00:16:3e:1b:b1:47'/>
+      <source bridge='xenbr0'/>
+      <script path='vif-bridge'/>
+      <target dev='vif1.0'/>
+    </interface>
+    <serial type='dev'>
+      <source path='/dev/ttyS0'/>
+      <target port='0'/>
+    </serial>
+    <serial type='dev'>
+      <source path='/dev/ttyS1'/>
+      <target port='1'/>
+    </serial>
+    <console type='dev'>
+      <source path='/dev/ttyS0'/>
+      <target port='0'/>
+    </console>
+    <input type='mouse' bus='ps2'/>
+    <graphics type='vnc' port='5901' autoport='no'/>
+  </devices>
+</domain>
diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c
index f100dd8..4b5766d 100644
--- a/tests/sexpr2xmltest.c
+++ b/tests/sexpr2xmltest.c
@@ -158,6 +158,7 @@ mymain(int argc, char **argv)
 
     DO_TEST("fv-serial-null", "fv-serial-null", 1);
     DO_TEST("fv-serial-file", "fv-serial-file", 1);
+    DO_TEST("fv-serial-dev-2-ports", "fv-serial-dev-2-ports", 1);
     DO_TEST("fv-serial-stdio", "fv-serial-stdio", 1);
     DO_TEST("fv-serial-pty", "fv-serial-pty", 1);
     DO_TEST("fv-serial-pipe", "fv-serial-pipe", 1);
diff --git a/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.cfg b/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.cfg
new file mode 100644
index 0000000..86e7998
--- /dev/null
+++ b/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.cfg
@@ -0,0 +1,25 @@
+name = "XenGuest2"
+uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809"
+maxmem = 579
+memory = 394
+vcpus = 1
+builder = "hvm"
+kernel = "/usr/lib/xen/boot/hvmloader"
+boot = "d"
+pae = 1
+acpi = 1
+apic = 1
+localtime = 0
+on_poweroff = "destroy"
+on_reboot = "restart"
+on_crash = "restart"
+device_model = "/usr/lib/xen/bin/qemu-dm"
+sdl = 0
+vnc = 1
+vncunused = 1
+vnclisten = "127.0.0.1"
+vncpasswd = "123poi"
+disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ]
+vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000,type=ioemu" ]
+parallel = "none"
+serial = [ "/dev/ttyS0", "/dev/ttyS1" ]
diff --git a/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.xml b/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.xml
new file mode 100644
index 0000000..e4d3f16
--- /dev/null
+++ b/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.xml
@@ -0,0 +1,55 @@
+<domain type='xen'>
+  <name>XenGuest2</name>
+  <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid>
+  <memory>592896</memory>
+  <currentMemory>403456</currentMemory>
+  <vcpu>1</vcpu>
+  <os>
+    <type arch='i686' machine='xenfv'>hvm</type>
+    <loader>/usr/lib/xen/boot/hvmloader</loader>
+    <boot dev='cdrom'/>
+  </os>
+  <features>
+    <acpi/>
+    <apic/>
+    <pae/>
+  </features>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>restart</on_crash>
+  <devices>
+    <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
+    <disk type='block' device='disk'>
+      <driver name='phy'/>
+      <source dev='/dev/HostVG/XenGuest2'/>
+      <target dev='hda' bus='ide'/>
+    </disk>
+    <disk type='file' device='cdrom'>
+      <driver name='file'/>
+      <source file='/root/boot.iso'/>
+      <target dev='hdc' bus='ide'/>
+      <readonly/>
+    </disk>
+    <interface type='bridge'>
+      <mac address='00:16:3e:66:92:9c'/>
+      <source bridge='xenbr1'/>
+      <script path='vif-bridge'/>
+      <model type='e1000'/>
+    </interface>
+    <serial type='dev'>
+      <source path='/dev/ttyS0'/>
+      <target port='0'/>
+    </serial>
+    <serial type='dev'>
+      <source path='/dev/ttyS1'/>
+      <target port='1'/>
+    </serial>
+    <console type='dev'>
+      <source path='/dev/ttyS0'/>
+      <target port='0'/>
+    </console>
+    <input type='mouse' bus='ps2'/>
+    <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' passwd='123poi'/>
+  </devices>
+</domain>
diff --git a/tests/xmconfigtest.c b/tests/xmconfigtest.c
index ea00747..0de890c 100644
--- a/tests/xmconfigtest.c
+++ b/tests/xmconfigtest.c
@@ -218,6 +218,7 @@ mymain(int argc, char **argv)
     DO_TEST("fullvirt-usbtablet", 2);
     DO_TEST("fullvirt-usbmouse", 2);
     DO_TEST("fullvirt-serial-file", 2);
+    DO_TEST("fullvirt-serial-dev-2-ports", 2);
     DO_TEST("fullvirt-serial-null", 2);
     DO_TEST("fullvirt-serial-pipe", 2);
     DO_TEST("fullvirt-serial-pty", 2);
diff --git a/tests/xml2sexprdata/xml2sexpr-fv-serial-dev-2-ports.sexpr b/tests/xml2sexprdata/xml2sexpr-fv-serial-dev-2-ports.sexpr
new file mode 100644
index 0000000..2048159
--- /dev/null
+++ b/tests/xml2sexprdata/xml2sexpr-fv-serial-dev-2-ports.sexpr
@@ -0,0 +1 @@
+(vm (name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)(uuid 'b5d70dd2-75cd-aca5-1776-9660b059d8bc')(on_poweroff 'destroy')(on_reboot 'restart')(on_crash 'restart')(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)(cdrom '/root/boot.iso')(acpi 1)(usb 1)(parallel none)(serial (/dev/ttyS0 /dev/ttyS1))(device_model '/usr/lib64/xen/bin/qemu-dm')(vnc 1)))(device (vbd (dev 'ioemu:hda')(uname 'file:/root/foo.img')(mode 'w')))(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')(model 'e1000')(type ioemu))))
\ No newline at end of file
diff --git a/tests/xml2sexprdata/xml2sexpr-fv-serial-dev-2-ports.xml b/tests/xml2sexprdata/xml2sexpr-fv-serial-dev-2-ports.xml
new file mode 100644
index 0000000..e5d1817
--- /dev/null
+++ b/tests/xml2sexprdata/xml2sexpr-fv-serial-dev-2-ports.xml
@@ -0,0 +1,44 @@
+<domain type='xen'>
+  <name>fvtest</name>
+  <uuid>b5d70dd275cdaca517769660b059d8bc</uuid>
+  <os>
+    <type>hvm</type>
+    <loader>/usr/lib/xen/boot/hvmloader</loader>
+    <boot dev='hd'/>
+  </os>
+  <memory>409600</memory>
+  <vcpu>1</vcpu>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>restart</on_crash>
+  <features>
+    <acpi/>
+  </features>
+  <devices>
+    <emulator>/usr/lib64/xen/bin/qemu-dm</emulator>
+    <interface type='bridge'>
+      <source bridge='xenbr0'/>
+      <mac address='00:16:3e:1b:b1:47'/>
+      <script path='vif-bridge'/>
+      <model type='e1000'/>
+    </interface>
+    <disk type='file' device='cdrom'>
+      <source file='/root/boot.iso'/>
+      <target dev='hdc'/>
+      <readonly/>
+    </disk>
+    <disk type='file'>
+      <source file='/root/foo.img'/>
+      <target dev='ioemu:hda'/>
+    </disk>
+    <serial type='dev'>
+      <source path='/dev/ttyS0'/>
+      <target port='0'/>
+    </serial>
+    <serial type='dev'>
+      <source path='/dev/ttyS1'/>
+      <target port='1'/>
+    </serial>
+    <graphics type='vnc' port='5917' keymap='ja'/>
+  </devices>
+</domain>
diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c
index 8a5d115..ed10dec 100644
--- a/tests/xml2sexprtest.c
+++ b/tests/xml2sexprtest.c
@@ -148,6 +148,7 @@ mymain(int argc, char **argv)
 
     DO_TEST("fv-serial-null", "fv-serial-null", "fvtest", 1);
     DO_TEST("fv-serial-file", "fv-serial-file", "fvtest", 1);
+    DO_TEST("fv-serial-dev-2-ports", "fv-serial-dev-2-ports", "fvtest", 1);
     DO_TEST("fv-serial-stdio", "fv-serial-stdio", "fvtest", 1);
     DO_TEST("fv-serial-pty", "fv-serial-pty", "fvtest", 1);
     DO_TEST("fv-serial-pipe", "fv-serial-pipe", "fvtest", 1);
-- 
1.7.3.2




More information about the libvir-list mailing list