[libvirt] [PATCH 1/5] character device: Allow character devices to have different target types

Daniel P. Berrange berrange at redhat.com
Wed Nov 4 19:04:01 UTC 2009


On Wed, Nov 04, 2009 at 04:21:58PM +0000, Matthew Booth wrote:
> Currently a character device's target (it's interface in the guest) has only a
> single property: port. This patch is in preparation for adding targets which
> require other properties.
> 
> Target properties are moved into a union in virDomainChrDef, and a targetType
> field is added to identify which union member should be used. All current code
> which touches a virDomainChrDef is updated both to use the new union field,
> and to populate targetType if necessary.
> ---
>  src/conf/domain_conf.c  |   66 +++++++++++++++++++++++++++++++++++++---------
>  src/conf/domain_conf.h  |   18 +++++++++++-
>  src/esx/esx_vmx.c       |   56 +++++++++++++++++++++------------------
>  src/qemu/qemu_conf.c    |    6 +++-
>  src/qemu/qemu_driver.c  |    2 +
>  src/uml/uml_conf.c      |   12 ++++----
>  src/uml/uml_driver.c    |    2 +-
>  src/vbox/vbox_tmpl.c    |   22 ++++++++--------
>  src/xen/xend_internal.c |    3 ++
>  src/xen/xm_internal.c   |    3 ++
>  10 files changed, 129 insertions(+), 61 deletions(-)

ACK, looks good.

> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 7dd3ce7..fc70cfd 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -127,6 +127,13 @@ VIR_ENUM_IMPL(virDomainNet, VIR_DOMAIN_NET_TYPE_LAST,
>                "bridge",
>                "internal")
>  
> +VIR_ENUM_IMPL(virDomainChrTarget, VIR_DOMAIN_CHR_TARGET_TYPE_LAST,
> +              "null",
> +              "monitor",
> +              "parallel",
> +              "serial",
> +              "console")
> +
>  VIR_ENUM_IMPL(virDomainChr, VIR_DOMAIN_CHR_TYPE_LAST,
>                "null",
>                "vc",
> @@ -1325,6 +1332,7 @@ virDomainChrDefParseXML(virConnectPtr conn,
>      char *path = NULL;
>      char *mode = NULL;
>      char *protocol = NULL;
> +    const char *targetType = NULL;
>      virDomainChrDefPtr def;
>  
>      if (VIR_ALLOC(def) < 0) {
> @@ -1338,6 +1346,21 @@ virDomainChrDefParseXML(virConnectPtr conn,
>      else if ((def->type = virDomainChrTypeFromString(type)) < 0)
>          def->type = VIR_DOMAIN_CHR_TYPE_NULL;
>  
> +    targetType = (const char *) node->name;
> +    if (targetType == NULL) {
> +        /* Shouldn't be possible */
> +        virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                             "node->name is NULL at %s:%i",
> +                             __FILE__, __LINE__);
> +        return NULL;
> +    }
> +    if ((def->targetType = virDomainChrTargetTypeFromString(targetType)) < 0) {
> +        virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                             _("unknown target type for character device: %s"),
> +                             targetType);
> +        def->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_NULL;
> +    }
> +
>      cur = node->children;
>      while (cur != NULL) {
>          if (cur->type == XML_ELEMENT_NODE) {
> @@ -2931,7 +2954,7 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn,
>          if (!chr)
>              goto error;
>  
> -        chr->dstPort = i;
> +        chr->target.port = i;
>          def->parallels[def->nparallels++] = chr;
>      }
>      VIR_FREE(nodes);
> @@ -2951,7 +2974,7 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn,
>          if (!chr)
>              goto error;
>  
> -        chr->dstPort = i;
> +        chr->target.port = i;
>          def->serials[def->nserials++] = chr;
>      }
>      VIR_FREE(nodes);
> @@ -2963,7 +2986,7 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn,
>          if (!chr)
>              goto error;
>  
> -        chr->dstPort = 0;
> +        chr->target.port = 0;
>          /*
>           * For HVM console actually created a serial device
>           * while for non-HVM it was a parvirt console
> @@ -3965,10 +3988,12 @@ static int
>  virDomainChrDefFormat(virConnectPtr conn,
>                        virBufferPtr buf,
>                        virDomainChrDefPtr def,
> -                      const char *name,
>                        int flags)
>  {
>      const char *type = virDomainChrTypeToString(def->type);
> +    const char *targetName = virDomainChrTargetTypeToString(def->targetType);
> +
> +    const char *elementName = targetName; /* Currently always the same */
>  
>      if (!type) {
>          virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
> @@ -3978,8 +4003,8 @@ virDomainChrDefFormat(virConnectPtr conn,
>  
>      /* Compat with legacy  <console tty='/dev/pts/5'/> syntax */
>      virBufferVSprintf(buf, "    <%s type='%s'",
> -                      name, type);
> -    if (STREQ(name, "console") &&
> +                      elementName, type);
> +    if (def->targetType == VIR_DOMAIN_CHR_TARGET_TYPE_CONSOLE &&
>          def->type == VIR_DOMAIN_CHR_TYPE_PTY &&
>          !(flags & VIR_DOMAIN_XML_INACTIVE) &&
>          def->data.file.path) {
> @@ -4054,11 +4079,23 @@ virDomainChrDefFormat(virConnectPtr conn,
>          break;
>      }
>  
> -    virBufferVSprintf(buf, "      <target port='%d'/>\n",
> -                      def->dstPort);
> +    switch (def->targetType) {
> +    case VIR_DOMAIN_CHR_TARGET_TYPE_PARALLEL:
> +    case VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL:
> +    case VIR_DOMAIN_CHR_TARGET_TYPE_CONSOLE:
> +        virBufferVSprintf(buf, "      <target port='%d'/>\n",
> +                          def->target.port);
> +        break;
> +
> +    default:
> +        virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                             _("unexpected character destination type %d"),
> +                             def->targetType);
> +        return -1;
> +    }
>  
>      virBufferVSprintf(buf, "    </%s>\n",
> -                      name);
> +                      elementName);
>  
>      return 0;
>  }
> @@ -4505,21 +4542,24 @@ char *virDomainDefFormat(virConnectPtr conn,
>              goto cleanup;
>  
>      for (n = 0 ; n < def->nserials ; n++)
> -        if (virDomainChrDefFormat(conn, &buf, def->serials[n], "serial", flags) < 0)
> +        if (virDomainChrDefFormat(conn, &buf, def->serials[n], flags) < 0)
>              goto cleanup;
>  
>      for (n = 0 ; n < def->nparallels ; n++)
> -        if (virDomainChrDefFormat(conn, &buf, def->parallels[n], "parallel", flags) < 0)
> +        if (virDomainChrDefFormat(conn, &buf, def->parallels[n], flags) < 0)
>              goto cleanup;
>  
>      /* If there's a PV console that's preferred.. */
>      if (def->console) {
> -        if (virDomainChrDefFormat(conn, &buf, def->console, "console", flags) < 0)
> +        if (virDomainChrDefFormat(conn, &buf, def->console, flags) < 0)
>              goto cleanup;
>      } else if (def->nserials != 0) {
>          /* ..else for legacy compat duplicate the first serial device as a
>           * console */
> -        if (virDomainChrDefFormat(conn, &buf, def->serials[0], "console", flags) < 0)
> +        virDomainChrDef console;
> +        memcpy(&console, def->serials[0], sizeof(console));
> +        console.targetType = VIR_DOMAIN_CHR_TARGET_TYPE_CONSOLE;
> +        if (virDomainChrDefFormat(conn, &buf, &console, flags) < 0)
>              goto cleanup;
>      }
>  
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 8599ee7..7bd8c63 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -211,7 +211,17 @@ virNetHasValidPciAddr(virDomainNetDefPtr def)
>      return def->pci_addr.domain || def->pci_addr.bus || def->pci_addr.slot;
>  }
>  
> -enum virDomainChrSrcType {
> +enum virDomainChrTargetType {
> +    VIR_DOMAIN_CHR_TARGET_TYPE_NULL = 0,
> +    VIR_DOMAIN_CHR_TARGET_TYPE_MONITOR,
> +    VIR_DOMAIN_CHR_TARGET_TYPE_PARALLEL,
> +    VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL,
> +    VIR_DOMAIN_CHR_TARGET_TYPE_CONSOLE,
> +
> +    VIR_DOMAIN_CHR_TARGET_TYPE_LAST
> +};
> +
> +enum virDomainChrType {
>      VIR_DOMAIN_CHR_TYPE_NULL,
>      VIR_DOMAIN_CHR_TYPE_VC,
>      VIR_DOMAIN_CHR_TYPE_PTY,
> @@ -236,7 +246,10 @@ enum virDomainChrTcpProtocol {
>  typedef struct _virDomainChrDef virDomainChrDef;
>  typedef virDomainChrDef *virDomainChrDefPtr;
>  struct _virDomainChrDef {
> -    int dstPort;
> +    int targetType;
> +    union {
> +        int port; /* parallel, serial, console */
> +    } target;
>  
>      int type;
>      union {
> @@ -812,6 +825,7 @@ VIR_ENUM_DECL(virDomainDiskBus)
>  VIR_ENUM_DECL(virDomainDiskCache)
>  VIR_ENUM_DECL(virDomainFS)
>  VIR_ENUM_DECL(virDomainNet)
> +VIR_ENUM_DECL(virDomainChrTarget)
>  VIR_ENUM_DECL(virDomainChr)
>  VIR_ENUM_DECL(virDomainSoundModel)
>  VIR_ENUM_DECL(virDomainWatchdogModel)
> diff --git a/src/esx/esx_vmx.c b/src/esx/esx_vmx.c
> index a9ff1b4..536bf2d 100644
> --- a/src/esx/esx_vmx.c
> +++ b/src/esx/esx_vmx.c
> @@ -319,7 +319,7 @@ def->nets[0]...
>                                          serial0.startConnected = "true"         # defaults to "true"
>  
>  def->serials[0]...
> -->dstPort = <port>
> +->target.port = <port>
>  
>  
>  ## serials: device #############################################################
> @@ -378,7 +378,7 @@ def->serials[0]...
>                                          parallel0.startConnected = "true"       # defaults to "true"
>  
>  def->parallels[0]...
> -->dstPort = <port>
> +->target.port = <port>
>  
>  
>  ## parallels: device #############################################################
> @@ -1871,6 +1871,8 @@ esxVMX_ParseSerial(virConnectPtr conn, esxVI_Context *ctx, virConfPtr conf,
>          goto failure;
>      }
>  
> +    (*def)->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
> +
>      snprintf(prefix, sizeof(prefix), "serial%d", port);
>  
>      ESX_BUILD_VMX_NAME(present);
> @@ -1907,13 +1909,13 @@ esxVMX_ParseSerial(virConnectPtr conn, esxVI_Context *ctx, virConfPtr conf,
>  
>      /* Setup virDomainChrDef */
>      if (STRCASEEQ(fileType, "device")) {
> -        (*def)->dstPort = port;
> +        (*def)->target.port = port;
>          (*def)->type = VIR_DOMAIN_CHR_TYPE_DEV;
>          (*def)->data.file.path = fileName;
>  
>          fileName = NULL;
>      } else if (STRCASEEQ(fileType, "file")) {
> -        (*def)->dstPort = port;
> +        (*def)->target.port = port;
>          (*def)->type = VIR_DOMAIN_CHR_TYPE_FILE;
>          (*def)->data.file.path = esxVMX_ParseFileName(conn, ctx, fileName,
>                                                        datastoreName,
> @@ -1927,7 +1929,7 @@ esxVMX_ParseSerial(virConnectPtr conn, esxVI_Context *ctx, virConfPtr conf,
>           * FIXME: Differences between client/server and VM/application pipes
>           *        not representable in domain XML form
>           */
> -        (*def)->dstPort = port;
> +        (*def)->target.port = port;
>          (*def)->type = VIR_DOMAIN_CHR_TYPE_PIPE;
>          (*def)->data.file.path = fileName;
>  
> @@ -1993,6 +1995,8 @@ esxVMX_ParseParallel(virConnectPtr conn, esxVI_Context *ctx, virConfPtr conf,
>          goto failure;
>      }
>  
> +    (*def)->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_PARALLEL;
> +
>      snprintf(prefix, sizeof(prefix), "parallel%d", port);
>  
>      ESX_BUILD_VMX_NAME(present);
> @@ -2029,13 +2033,13 @@ esxVMX_ParseParallel(virConnectPtr conn, esxVI_Context *ctx, virConfPtr conf,
>  
>      /* Setup virDomainChrDef */
>      if (STRCASEEQ(fileType, "device")) {
> -        (*def)->dstPort = port;
> +        (*def)->target.port = port;
>          (*def)->type = VIR_DOMAIN_CHR_TYPE_DEV;
>          (*def)->data.file.path = fileName;
>  
>          fileName = NULL;
>      } else if (STRCASEEQ(fileType, "file")) {
> -        (*def)->dstPort = port;
> +        (*def)->target.port = port;
>          (*def)->type = VIR_DOMAIN_CHR_TYPE_FILE;
>          (*def)->data.file.path = esxVMX_ParseFileName(conn, ctx, fileName,
>                                                        datastoreName,
> @@ -2706,9 +2710,9 @@ esxVMX_FormatSerial(virConnectPtr conn, esxVI_Context *ctx,
>  {
>      char *fileName = NULL;
>  
> -    if (def->dstPort < 0 || def->dstPort > 3) {
> +    if (def->target.port < 0 || def->target.port > 3) {
>          ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
> -                  "Serial port index %d out of [0..3] range", def->dstPort);
> +                  "Serial port index %d out of [0..3] range", def->target.port);
>          return -1;
>      }
>  
> @@ -2719,20 +2723,20 @@ esxVMX_FormatSerial(virConnectPtr conn, esxVI_Context *ctx,
>          return -1;
>      }
>  
> -    virBufferVSprintf(buffer, "serial%d.present = \"true\"\n", def->dstPort);
> +    virBufferVSprintf(buffer, "serial%d.present = \"true\"\n", def->target.port);
>  
>      /* def:type -> vmx:fileType and def:data.file.path -> vmx:fileName */
>      switch (def->type) {
>        case VIR_DOMAIN_CHR_TYPE_DEV:
>          virBufferVSprintf(buffer, "serial%d.fileType = \"device\"\n",
> -                          def->dstPort);
> +                          def->target.port);
>          virBufferVSprintf(buffer, "serial%d.fileName = \"%s\"\n",
> -                          def->dstPort, def->data.file.path);
> +                          def->target.port, def->data.file.path);
>          break;
>  
>        case VIR_DOMAIN_CHR_TYPE_FILE:
>          virBufferVSprintf(buffer, "serial%d.fileType = \"file\"\n",
> -                          def->dstPort);
> +                          def->target.port);
>  
>          fileName = esxVMX_FormatFileName(conn, ctx, def->data.file.path);
>  
> @@ -2741,22 +2745,22 @@ esxVMX_FormatSerial(virConnectPtr conn, esxVI_Context *ctx,
>          }
>  
>          virBufferVSprintf(buffer, "serial%d.fileName = \"%s\"\n",
> -                          def->dstPort, fileName);
> +                          def->target.port, fileName);
>  
>          VIR_FREE(fileName);
>          break;
>  
>        case VIR_DOMAIN_CHR_TYPE_PIPE:
>          virBufferVSprintf(buffer, "serial%d.fileType = \"pipe\"\n",
> -                          def->dstPort);
> +                          def->target.port);
>          /* FIXME: Based on VI Client GUI default */
>          virBufferVSprintf(buffer, "serial%d.pipe.endPoint = \"client\"\n",
> -                          def->dstPort);
> +                          def->target.port);
>          /* FIXME: Based on VI Client GUI default */
>          virBufferVSprintf(buffer, "serial%d.tryNoRxLoss = \"false\"\n",
> -                          def->dstPort);
> +                          def->target.port);
>          virBufferVSprintf(buffer, "serial%d.fileName = \"%s\"\n",
> -                          def->dstPort, def->data.file.path);
> +                          def->target.port, def->data.file.path);
>          break;
>  
>        default:
> @@ -2769,7 +2773,7 @@ esxVMX_FormatSerial(virConnectPtr conn, esxVI_Context *ctx,
>      /* vmx:yieldOnMsrRead */
>      /* FIXME: Based on VI Client GUI default */
>      virBufferVSprintf(buffer, "serial%d.yieldOnMsrRead = \"true\"\n",
> -                      def->dstPort);
> +                      def->target.port);
>  
>      return 0;
>  }
> @@ -2782,9 +2786,9 @@ esxVMX_FormatParallel(virConnectPtr conn, esxVI_Context *ctx,
>  {
>      char *fileName = NULL;
>  
> -    if (def->dstPort < 0 || def->dstPort > 2) {
> +    if (def->target.port < 0 || def->target.port > 2) {
>          ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
> -                  "Parallel port index %d out of [0..2] range", def->dstPort);
> +                  "Parallel port index %d out of [0..2] range", def->target.port);
>          return -1;
>      }
>  
> @@ -2795,20 +2799,20 @@ esxVMX_FormatParallel(virConnectPtr conn, esxVI_Context *ctx,
>          return -1;
>      }
>  
> -    virBufferVSprintf(buffer, "parallel%d.present = \"true\"\n", def->dstPort);
> +    virBufferVSprintf(buffer, "parallel%d.present = \"true\"\n", def->target.port);
>  
>      /* def:type -> vmx:fileType and def:data.file.path -> vmx:fileName */
>      switch (def->type) {
>        case VIR_DOMAIN_CHR_TYPE_DEV:
>          virBufferVSprintf(buffer, "parallel%d.fileType = \"device\"\n",
> -                          def->dstPort);
> +                          def->target.port);
>          virBufferVSprintf(buffer, "parallel%d.fileName = \"%s\"\n",
> -                          def->dstPort, def->data.file.path);
> +                          def->target.port, def->data.file.path);
>          break;
>  
>        case VIR_DOMAIN_CHR_TYPE_FILE:
>          virBufferVSprintf(buffer, "parallel%d.fileType = \"file\"\n",
> -                          def->dstPort);
> +                          def->target.port);
>  
>          fileName = esxVMX_FormatFileName(conn, ctx, def->data.file.path);
>  
> @@ -2817,7 +2821,7 @@ esxVMX_FormatParallel(virConnectPtr conn, esxVI_Context *ctx,
>          }
>  
>          virBufferVSprintf(buffer, "parallel%d.fileName = \"%s\"\n",
> -                          def->dstPort, fileName);
> +                          def->target.port, fileName);
>  
>          VIR_FREE(fileName);
>          break;
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index 810e7bf..19b2d36 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -3406,7 +3406,8 @@ virDomainDefPtr qemuParseCommandLine(virConnectPtr conn,
>                      virDomainChrDefFree(chr);
>                      goto no_memory;
>                  }
> -                chr->dstPort = def->nserials;
> +                chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
> +                chr->target.port = def->nserials;
>                  def->serials[def->nserials++] = chr;
>              }
>          } else if (STREQ(arg, "-parallel")) {
> @@ -3419,7 +3420,8 @@ virDomainDefPtr qemuParseCommandLine(virConnectPtr conn,
>                      virDomainChrDefFree(chr);
>                      goto no_memory;
>                  }
> -                chr->dstPort = def->nparallels;
> +                chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_PARALLEL;
> +                chr->target.port = def->nparallels;
>                  def->parallels[def->nparallels++] = chr;
>              }
>          } else if (STREQ(arg, "-usbdevice")) {
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 0ed2136..a6b6e93 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1920,6 +1920,8 @@ qemuPrepareMonitorChr(virConnectPtr conn,
>                        virDomainChrDefPtr monitor_chr,
>                        const char *vm)
>  {
> +    monitor_chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_MONITOR;
> +
>      monitor_chr->type = VIR_DOMAIN_CHR_TYPE_UNIX;
>      monitor_chr->data.nix.listen = 1;
>  
> diff --git a/src/uml/uml_conf.c b/src/uml/uml_conf.c
> index 1c1db61..0ace58f 100644
> --- a/src/uml/uml_conf.c
> +++ b/src/uml/uml_conf.c
> @@ -279,21 +279,21 @@ umlBuildCommandLineChr(virConnectPtr conn,
>  
>      switch (def->type) {
>      case VIR_DOMAIN_CHR_TYPE_NULL:
> -        if (virAsprintf(&ret, "%s%d=null", dev, def->dstPort) < 0) {
> +        if (virAsprintf(&ret, "%s%d=null", dev, def->target.port) < 0) {
>              virReportOOMError(conn);
>              return NULL;
>          }
>          break;
>  
>      case VIR_DOMAIN_CHR_TYPE_PTY:
> -        if (virAsprintf(&ret, "%s%d=pts", dev, def->dstPort) < 0) {
> +        if (virAsprintf(&ret, "%s%d=pts", dev, def->target.port) < 0) {
>              virReportOOMError(conn);
>              return NULL;
>          }
>          break;
>  
>      case VIR_DOMAIN_CHR_TYPE_DEV:
> -        if (virAsprintf(&ret, "%s%d=tty:%s", dev, def->dstPort,
> +        if (virAsprintf(&ret, "%s%d=tty:%s", dev, def->target.port,
>                          def->data.file.path) < 0) {
>              virReportOOMError(conn);
>              return NULL;
> @@ -301,7 +301,7 @@ umlBuildCommandLineChr(virConnectPtr conn,
>          break;
>  
>      case VIR_DOMAIN_CHR_TYPE_STDIO:
> -        if (virAsprintf(&ret, "%s%d=fd:0,fd:1", dev, def->dstPort) < 0) {
> +        if (virAsprintf(&ret, "%s%d=fd:0,fd:1", dev, def->target.port) < 0) {
>              virReportOOMError(conn);
>              return NULL;
>          }
> @@ -314,7 +314,7 @@ umlBuildCommandLineChr(virConnectPtr conn,
>              return NULL;
>          }
>  
> -        if (virAsprintf(&ret, "%s%d=port:%s", dev, def->dstPort,
> +        if (virAsprintf(&ret, "%s%d=port:%s", dev, def->target.port,
>                          def->data.tcp.service) < 0) {
>              virReportOOMError(conn);
>              return NULL;
> @@ -502,7 +502,7 @@ int umlBuildCommandLine(virConnectPtr conn,
>          virDomainChrDefPtr chr = NULL;
>          char *ret;
>          for (j = 0 ; j < vm->def->nserials ; j++)
> -            if (vm->def->serials[j]->dstPort == i)
> +            if (vm->def->serials[j]->target.port == i)
>                  chr = vm->def->serials[j];
>          if (chr)
>              ret = umlBuildCommandLineChr(conn, chr, "ssl");
> diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
> index 212cd8f..e2525c4 100644
> --- a/src/uml/uml_driver.c
> +++ b/src/uml/uml_driver.c
> @@ -169,7 +169,7 @@ umlIdentifyOneChrPTY(virConnectPtr conn,
>      char *cmd;
>      char *res = NULL;
>      int retries = 0;
> -    if (virAsprintf(&cmd, "config %s%d", dev, def->dstPort) < 0) {
> +    if (virAsprintf(&cmd, "config %s%d", dev, def->target.port) < 0) {
>          virReportOOMError(conn);
>          return -1;
>      }
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index c6305ac..d29e424 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -2403,9 +2403,9 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
>                              serialPort->vtbl->GetIRQ(serialPort, &IRQ);
>                              serialPort->vtbl->GetIOBase(serialPort, &IOBase);
>                              if ((IRQ == 4) && (IOBase == 1016)) {
> -                                def->serials[serialPortIncCount]->dstPort = 0;
> +                                def->serials[serialPortIncCount]->target.port = 0;
>                              } else if ((IRQ == 3) && (IOBase == 760)) {
> -                                def->serials[serialPortIncCount]->dstPort = 1;
> +                                def->serials[serialPortIncCount]->target.port = 1;
>                              }
>  
>                              serialPort->vtbl->GetPath(serialPort, &pathUtf16);
> @@ -2469,9 +2469,9 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
>                              parallelPort->vtbl->GetIRQ(parallelPort, &IRQ);
>                              parallelPort->vtbl->GetIOBase(parallelPort, &IOBase);
>                              if ((IRQ == 7) && (IOBase == 888)) {
> -                                def->parallels[parallelPortIncCount]->dstPort = 0;
> +                                def->parallels[parallelPortIncCount]->target.port = 0;
>                              } else if ((IRQ == 5) && (IOBase == 632)) {
> -                                def->parallels[parallelPortIncCount]->dstPort = 1;
> +                                def->parallels[parallelPortIncCount]->target.port = 1;
>                              }
>  
>                              def->parallels[parallelPortIncCount]->type = VIR_DOMAIN_CHR_TYPE_FILE;
> @@ -3493,7 +3493,7 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) {
>                  ISerialPort *serialPort = NULL;
>  
>                  DEBUG("SerialPort(%d): Type: %d", i, def->serials[i]->type);
> -                DEBUG("SerialPort(%d): dstPort: %d", i, def->serials[i]->dstPort);
> +                DEBUG("SerialPort(%d): target.port: %d", i, def->serials[i]->target.port);
>  
>                  machine->vtbl->GetSerialPort(machine, i, &serialPort);
>                  if (serialPort) {
> @@ -3508,17 +3508,17 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) {
>                       * TODO: make this more flexible
>                       */
>                      /* TODO: to improve the libvirt XMl handling so
> -                     * that def->serials[i]->dstPort shows real port
> +                     * that def->serials[i]->target.port shows real port
>                       * and not always start at 0
>                       */
>                      if (def->serials[i]->type == VIR_DOMAIN_CHR_TYPE_DEV) {
>                          serialPort->vtbl->SetPath(serialPort, pathUtf16);
> -                        if (def->serials[i]->dstPort == 0) {
> +                        if (def->serials[i]->target.port == 0) {
>                              serialPort->vtbl->SetIRQ(serialPort, 4);
>                              serialPort->vtbl->SetIOBase(serialPort, 1016);
>                              DEBUG(" serialPort-%d irq: %d, iobase 0x%x, path: %s",
>                                    i, 4, 1016, def->serials[i]->data.file.path);
> -                        } else if (def->serials[i]->dstPort == 1) {
> +                        } else if (def->serials[i]->target.port == 1) {
>                              serialPort->vtbl->SetIRQ(serialPort, 3);
>                              serialPort->vtbl->SetIOBase(serialPort, 760);
>                              DEBUG(" serialPort-%d irq: %d, iobase 0x%x, path: %s",
> @@ -3527,12 +3527,12 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) {
>                          serialPort->vtbl->SetHostMode(serialPort, PortMode_HostDevice);
>                      } else if (def->serials[i]->type == VIR_DOMAIN_CHR_TYPE_PIPE) {
>                          serialPort->vtbl->SetPath(serialPort, pathUtf16);
> -                        if (def->serials[i]->dstPort == 0) {
> +                        if (def->serials[i]->target.port == 0) {
>                              serialPort->vtbl->SetIRQ(serialPort, 4);
>                              serialPort->vtbl->SetIOBase(serialPort, 1016);
>                              DEBUG(" serialPort-%d irq: %d, iobase 0x%x, path: %s",
>                                    i, 4, 1016, def->serials[i]->data.file.path);
> -                        } else if (def->serials[i]->dstPort == 1) {
> +                        } else if (def->serials[i]->target.port == 1) {
>                              serialPort->vtbl->SetIRQ(serialPort, 3);
>                              serialPort->vtbl->SetIOBase(serialPort, 760);
>                              DEBUG(" serialPort-%d irq: %d, iobase 0x%x, path: %s",
> @@ -3573,7 +3573,7 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) {
>                  IParallelPort *parallelPort = NULL;
>  
>                  DEBUG("ParallelPort(%d): Type: %d", i, def->parallels[i]->type);
> -                DEBUG("ParallelPort(%d): dstPort: %d", i, def->parallels[i]->dstPort);
> +                DEBUG("ParallelPort(%d): target.port: %d", i, def->parallels[i]->target.port);
>  
>                  machine->vtbl->GetParallelPort(machine, i, &parallelPort);
>                  if (parallelPort) {
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index 9080754..f86e022 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -2569,6 +2569,7 @@ xenDaemonParseSxpr(virConnectPtr conn,
>                  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");
> @@ -2581,12 +2582,14 @@ xenDaemonParseSxpr(virConnectPtr conn,
>                  virDomainChrDefFree(chr);
>                  goto no_memory;
>              }
> +            chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_PARALLEL;
>              def->parallels[def->nparallels++] = chr;
>          }
>      } else {
>          /* Fake a paravirt console, since that's not in the sexpr */
>          if (!(def->console = xenDaemonParseSxprChar(conn, "pty", tty)))
>              goto error;
> +        def->console->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_CONSOLE;
>      }
>      VIR_FREE(tty);
>  
> diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
> index b52f66e..5e8931e 100644
> --- a/src/xen/xm_internal.c
> +++ b/src/xen/xm_internal.c
> @@ -1415,6 +1415,7 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
>                  virDomainChrDefFree(chr);
>                  goto no_memory;
>              }
> +            chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_PARALLEL;
>              def->parallels[0] = chr;
>              def->nparallels++;
>              chr = NULL;
> @@ -1431,12 +1432,14 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
>                  virDomainChrDefFree(chr);
>                  goto no_memory;
>              }
> +            chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
>              def->serials[0] = chr;
>              def->nserials++;
>          }
>      } else {
>          if (!(def->console = xenDaemonParseSxprChar(conn, "pty", NULL)))
>              goto cleanup;
> +        def->console->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_CONSOLE;
>      }
>  
>      if (hvm) {
> -- 
> 1.6.2.5
> 
> --
> Libvir-list mailing list
> Libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list