[libvirt] [PATCH 7/9] virt-admin: Introduce vshAdmCatchDisconnect handler

Michal Privoznik mprivozn at redhat.com
Wed Oct 14 11:25:25 UTC 2015


On 13.10.2015 15:38, Erik Skultety wrote:
> Since close callback and URI support was introduced in the earlier patches, it
> is now the right time to implement the disconnect handler itself and switch the
> dummy NULL reference in virAdmConnectRegisterCloseCallback for this new handler.
> The handler itself is the same as the one used in virsh, it only remembers that
> the event occurs, lets the user know, but no other useful logic is present.
> ---
>  tools/virt-admin.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 48 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/virt-admin.c b/tools/virt-admin.c
> index a202ce2..3069d48 100644
> --- a/tools/virt-admin.c
> +++ b/tools/virt-admin.c
> @@ -77,6 +77,51 @@ static const vshClientHooks hooks;
>   */
>  static int disconnected; /* we may have been disconnected */
>  
> +/*
> + * vshAdmCatchDisconnect:
> + *
> + * We get here when the connection was closed. Right now, we only save the fact
> + * the event was raised.
> + */
> +static void
> +vshAdmCatchDisconnect(virAdmConnectPtr conn ATTRIBUTE_UNUSED,
> +                      int reason,
> +                      void *opaque)
> +{
> +    if (reason != VIR_CONNECT_CLOSE_REASON_CLIENT) {
> +        vshControl *ctl = opaque;
> +        const char *str = "unknown reason";
> +        virErrorPtr error;
> +        char *uri = NULL;
> +
> +        error = virSaveLastError();
> +        uri = virAdmConnectGetURI(conn);
> +
> +        switch ((virConnectCloseReason) reason) {
> +        case VIR_CONNECT_CLOSE_REASON_ERROR:
> +            str = N_("Disconnected from %s due to I/O error");
> +            break;
> +        case VIR_CONNECT_CLOSE_REASON_EOF:
> +            str = N_("Disconnected from %s due to end of file");
> +            break;
> +        case VIR_CONNECT_CLOSE_REASON_KEEPALIVE:
> +            str = N_("Disconnected from %s due to keepalive timeout");
> +            break;
> +        /* coverity[dead_error_condition] */
> +        case VIR_CONNECT_CLOSE_REASON_CLIENT:
> +        case VIR_CONNECT_CLOSE_REASON_LAST:
> +            break;
> +        }
> +        vshError(ctl, _(str), NULLSTR(uri));
> +
> +        if (error) {
> +            virSetError(error);
> +            virFreeError(error);
> +        }
> +        disconnected++;
> +    }
> +}
> +
>  static virAdmConnectPtr
>  vshAdmConnect(vshControl *ctl, unsigned int flags)
>  {
> @@ -91,8 +136,8 @@ vshAdmConnect(vshControl *ctl, unsigned int flags)
>              vshError(ctl, "%s", _("Failed to connect to the admin server"));
>          return NULL;
>      } else {
> -        if (virAdmConnectRegisterCloseCallback(priv->conn, NULL, NULL,
> -                                               NULL) < 0)
> +        if (virAdmConnectRegisterCloseCallback(priv->conn, vshAdmCatchDisconnect,
> +                                               NULL, NULL) < 0)
>              vshError(ctl, "%s", _("Unable to register disconnect callback"));
>  
>          if (priv->wantReconnect)
> @@ -112,7 +157,7 @@ vshAdmDisconnectInternal(vshControl *ctl, virAdmConnectPtr *conn)
>      if (!*conn)
>          return ret;
>  
> -    virAdmConnectUnregisterCloseCallback(*conn, NULL);
> +    virAdmConnectUnregisterCloseCallback(*conn, vshAdmCatchDisconnect);
>      ret = virAdmConnectClose(*conn);
>      if (ret < 0)
>          vshError(ctl, "%s", _("Failed to disconnect from the admin server"));
> 

For some reason, this is not working yet... Maybe you need to enable it
somewhere?

Michal




More information about the libvir-list mailing list