[PATCH 8/8] ch_driver: Add handler for console API

William Douglas posted 8 patches 4 years, 5 months ago
There is a newer version of this series
[PATCH 8/8] ch_driver: Add handler for console API
Posted by William Douglas 4 years, 5 months ago
Enable the handler function to find and open the console character
device that will be used by the console API.

Signed-off-by: William Douglas <william.douglas@intel.com>
---
 src/ch/ch_driver.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c
index ac958d73a8..a11357f83a 100644
--- a/src/ch/ch_driver.c
+++ b/src/ch/ch_driver.c
@@ -30,6 +30,7 @@
 #include "viraccessapicheck.h"
 #include "viralloc.h"
 #include "virbuffer.h"
+#include "virchrdev.h"
 #include "vircommand.h"
 #include "virerror.h"
 #include "virfile.h"
@@ -816,6 +817,82 @@ static int chDomainGetInfo(virDomainPtr dom,
     return ret;
 }
 
+static int
+chDomainOpenConsole(virDomainPtr dom,
+                    const char *dev_name,
+                    virStreamPtr st,
+                    unsigned int flags)
+{
+     virDomainObj *vm = NULL;
+     int ret = -1;
+     size_t i;
+     virDomainChrDef *chr = NULL;
+     virCHDomainObjPrivate *priv;
+
+     virCheckFlags(VIR_DOMAIN_CONSOLE_SAFE | VIR_DOMAIN_CONSOLE_FORCE, -1);
+
+     if (!(vm = chDomObjFromDomain(dom)))
+          goto cleanup;
+
+     if (virDomainOpenConsoleEnsureACL(dom->conn, vm->def) < 0)
+          goto cleanup;
+
+     if (virDomainObjCheckActive(vm) < 0)
+          goto cleanup;
+
+     priv = vm->privateData;
+
+     if (dev_name) {
+          for (i = 0; !chr && i < vm->def->nconsoles; i++) {
+               if (vm->def->consoles[i]->info.alias &&
+                   STREQ(dev_name, vm->def->consoles[i]->info.alias))
+                    chr = vm->def->consoles[i];
+          }
+          for (i = 0; !chr && i < vm->def->nserials; i++) {
+               if (STREQ(dev_name, vm->def->serials[i]->info.alias))
+                    chr = vm->def->serials[i];
+          }
+          for (i = 0; !chr && i < vm->def->nparallels; i++) {
+               if (STREQ(dev_name, vm->def->parallels[i]->info.alias))
+                    chr = vm->def->parallels[i];
+          }
+     } else {
+          if (vm->def->nconsoles &&
+              vm->def->consoles[0]->source->type == VIR_DOMAIN_CHR_TYPE_PTY)
+               chr = vm->def->consoles[0];
+          else if (vm->def->nserials &&
+                   vm->def->serials[0]->source->type == VIR_DOMAIN_CHR_TYPE_PTY)
+               chr = vm->def->serials[0];
+     }
+
+     if (!chr) {
+          virReportError(VIR_ERR_INTERNAL_ERROR, _("cannot find character device %s"),
+                         NULLSTR(dev_name));
+          goto cleanup;
+     }
+
+     if (chr->source->type != VIR_DOMAIN_CHR_TYPE_PTY) {
+          virReportError(VIR_ERR_INTERNAL_ERROR,
+                         _("character device %s is not using a PTY"),
+                         dev_name ? dev_name : NULLSTR(chr->info.alias));
+          goto cleanup;
+     }
+
+     /* handle mutually exclusive access to console devices */
+     ret = virChrdevOpen(priv->chrdevs, chr->source, st,
+                         (flags & VIR_DOMAIN_CONSOLE_FORCE) != 0);
+
+     if (ret == 1) {
+          virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                         _("Active console session exists for this domain"));
+          ret = -1;
+     }
+
+ cleanup:
+     virDomainObjEndAPI(&vm);
+     return ret;
+}
+
 static int chStateCleanup(void)
 {
     if (ch_driver == NULL)
@@ -913,6 +990,7 @@ static virHypervisorDriver chHypervisorDriver = {
     .domainGetXMLDesc = chDomainGetXMLDesc,                 /* 7.5.0 */
     .domainGetInfo = chDomainGetInfo,                       /* 7.5.0 */
     .domainIsActive = chDomainIsActive,                     /* 7.5.0 */
+    .domainOpenConsole = chDomainOpenConsole,               /* 7.6.0 */
     .nodeGetInfo = chNodeGetInfo,                           /* 7.5.0 */
 };
 
-- 
2.31.1

Re: [PATCH 8/8] ch_driver: Add handler for console API
Posted by Daniel P. Berrangé 4 years, 5 months ago
On Thu, Aug 26, 2021 at 02:59:22PM -0700, William Douglas wrote:
> Enable the handler function to find and open the console character
> device that will be used by the console API.
> 
> Signed-off-by: William Douglas <william.douglas@intel.com>
> ---
>  src/ch/ch_driver.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 78 insertions(+)
> 
> diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c
> index ac958d73a8..a11357f83a 100644
> --- a/src/ch/ch_driver.c
> +++ b/src/ch/ch_driver.c
> @@ -30,6 +30,7 @@
>  #include "viraccessapicheck.h"
>  #include "viralloc.h"
>  #include "virbuffer.h"
> +#include "virchrdev.h"
>  #include "vircommand.h"
>  #include "virerror.h"
>  #include "virfile.h"
> @@ -816,6 +817,82 @@ static int chDomainGetInfo(virDomainPtr dom,
>      return ret;
>  }
>  
> +static int
> +chDomainOpenConsole(virDomainPtr dom,
> +                    const char *dev_name,
> +                    virStreamPtr st,
> +                    unsigned int flags)
> +{
> +     virDomainObj *vm = NULL;
> +     int ret = -1;
> +     size_t i;
> +     virDomainChrDef *chr = NULL;
> +     virCHDomainObjPrivate *priv;
> +
> +     virCheckFlags(VIR_DOMAIN_CONSOLE_SAFE | VIR_DOMAIN_CONSOLE_FORCE, -1);
> +
> +     if (!(vm = chDomObjFromDomain(dom)))
> +          goto cleanup;
> +
> +     if (virDomainOpenConsoleEnsureACL(dom->conn, vm->def) < 0)
> +          goto cleanup;
> +
> +     if (virDomainObjCheckActive(vm) < 0)
> +          goto cleanup;
> +
> +     priv = vm->privateData;
> +
> +     if (dev_name) {
> +          for (i = 0; !chr && i < vm->def->nconsoles; i++) {
> +               if (vm->def->consoles[i]->info.alias &&
> +                   STREQ(dev_name, vm->def->consoles[i]->info.alias))
> +                    chr = vm->def->consoles[i];
> +          }
> +          for (i = 0; !chr && i < vm->def->nserials; i++) {
> +               if (STREQ(dev_name, vm->def->serials[i]->info.alias))
> +                    chr = vm->def->serials[i];
> +          }
> +          for (i = 0; !chr && i < vm->def->nparallels; i++) {
> +               if (STREQ(dev_name, vm->def->parallels[i]->info.alias))
> +                    chr = vm->def->parallels[i];
> +          }

You can drop the parallels loop since your driver doesn't
support that IIUC.

> +     } else {
> +          if (vm->def->nconsoles &&
> +              vm->def->consoles[0]->source->type == VIR_DOMAIN_CHR_TYPE_PTY)
> +               chr = vm->def->consoles[0];
> +          else if (vm->def->nserials &&
> +                   vm->def->serials[0]->source->type == VIR_DOMAIN_CHR_TYPE_PTY)
> +               chr = vm->def->serials[0];
> +     }
> +
> +     if (!chr) {
> +          virReportError(VIR_ERR_INTERNAL_ERROR, _("cannot find character device %s"),
> +                         NULLSTR(dev_name));
> +          goto cleanup;
> +     }
> +
> +     if (chr->source->type != VIR_DOMAIN_CHR_TYPE_PTY) {
> +          virReportError(VIR_ERR_INTERNAL_ERROR,
> +                         _("character device %s is not using a PTY"),
> +                         dev_name ? dev_name : NULLSTR(chr->info.alias));
> +          goto cleanup;
> +     }
> +
> +     /* handle mutually exclusive access to console devices */
> +     ret = virChrdevOpen(priv->chrdevs, chr->source, st,
> +                         (flags & VIR_DOMAIN_CONSOLE_FORCE) != 0);
> +
> +     if (ret == 1) {
> +          virReportError(VIR_ERR_OPERATION_FAILED, "%s",
> +                         _("Active console session exists for this domain"));
> +          ret = -1;
> +     }
> +
> + cleanup:
> +     virDomainObjEndAPI(&vm);
> +     return ret;
> +}
> +
>  static int chStateCleanup(void)
>  {
>      if (ch_driver == NULL)
> @@ -913,6 +990,7 @@ static virHypervisorDriver chHypervisorDriver = {
>      .domainGetXMLDesc = chDomainGetXMLDesc,                 /* 7.5.0 */
>      .domainGetInfo = chDomainGetInfo,                       /* 7.5.0 */
>      .domainIsActive = chDomainIsActive,                     /* 7.5.0 */
> +    .domainOpenConsole = chDomainOpenConsole,               /* 7.6.0 */
>      .nodeGetInfo = chNodeGetInfo,                           /* 7.5.0 */
>  };
>  
> -- 
> 2.31.1
> 

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|