[libvirt] [PATCH v4 5/7] admin: Introduce virAdmServer structure

Michal Privoznik mprivozn at redhat.com
Tue Feb 16 16:18:10 UTC 2016


On 12.02.2016 11:08, Erik Skultety wrote:
> This is the key structure of all management operations performed on the
> daemon/clients. An admin client needs to be able to identify
> another client (either admin or non-privileged client) to perform an
> action on it. This identification includes a server the client is
> connected to, thus a client-side representation of a server is needed.
> 
> Signed-off-by: Erik Skultety <eskultet at redhat.com>
> ---
>  include/libvirt/libvirt-admin.h | 17 +++++++++++++++++
>  src/admin/admin_protocol.x      |  8 ++++++++
>  src/admin_protocol-structs      |  3 +++
>  src/datatypes.c                 | 35 +++++++++++++++++++++++++++++++++++
>  src/datatypes.h                 | 38 ++++++++++++++++++++++++++++++++++++++
>  src/libvirt_admin_private.syms  |  3 +++
>  6 files changed, 104 insertions(+)
> 
> diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h
> index ab9df96..b342510 100644
> --- a/include/libvirt/libvirt-admin.h
> +++ b/include/libvirt/libvirt-admin.h
> @@ -43,6 +43,14 @@ extern "C" {
>  typedef struct _virAdmConnect virAdmConnect;
>  
>  /**
> + * virAdmServer:
> + *
> + * a virAdmServer is a private structure and client-side representation of
> + * a remote server object
> + */
> +typedef struct _virAdmServer virAdmServer;
> +
> +/**
>   * virAdmConnectPtr:
>   *
>   * a virAdmConnectPtr is pointer to a virAdmConnect private structure,
> @@ -51,6 +59,15 @@ typedef struct _virAdmConnect virAdmConnect;
>   */
>  typedef virAdmConnect *virAdmConnectPtr;
>  
> +/**
> + * virAdmServerPtr:
> + *
> + * a virAdmServerPtr is a pointer to a virAdmServer structure,
> + * this is the type used to reference client-side representation of a
> + * remote server object throughout all the APIs.
> + */
> +typedef virAdmServer *virAdmServerPtr;
> +
>  virAdmConnectPtr virAdmConnectOpen(const char *name, unsigned int flags);
>  int virAdmConnectClose(virAdmConnectPtr conn);
>  
> diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x
> index 711201a..549fdf3 100644
> --- a/src/admin/admin_protocol.x
> +++ b/src/admin/admin_protocol.x
> @@ -32,12 +32,20 @@
>   */
>  const ADMIN_STRING_MAX = 4194304;
>  
> +/* Upper limit on list of servers */
> +const ADMIN_SERVER_LIST_MAX = 16384;
> +
>  /* A long string, which may NOT be NULL. */
>  typedef string admin_nonnull_string<ADMIN_STRING_MAX>;
>  
>  /* A long string, which may be NULL. */
>  typedef admin_nonnull_string *admin_string;
>  
> +/* A server which may NOT be NULL */
> +struct admin_nonnull_server {
> +    admin_nonnull_string name;
> +};
> +
>  /*----- Protocol. -----*/
>  struct admin_connect_open_args {
>      unsigned int flags;
> diff --git a/src/admin_protocol-structs b/src/admin_protocol-structs
> index 809379b..95ea4e4 100644
> --- a/src/admin_protocol-structs
> +++ b/src/admin_protocol-structs
> @@ -1,4 +1,7 @@
>  /* -*- c -*- */
> +struct admin_nonnull_server {
> +        admin_nonnull_string       name;
> +};
>  struct admin_connect_open_args {
>          u_int                      flags;
>  };
> diff --git a/src/datatypes.c b/src/datatypes.c
> index c832d80..da6ec37 100644
> --- a/src/datatypes.c
> +++ b/src/datatypes.c
> @@ -65,6 +65,9 @@ virClassPtr virAdmConnectCloseCallbackDataClass;
>  static void virAdmConnectDispose(void *obj);
>  static void virAdmConnectCloseCallbackDataDispose(void *obj);
>  
> +virClassPtr virAdmServerClass;
> +static void virAdmServerDispose(void *obj);
> +
>  static int
>  virDataTypesOnceInit(void)
>  {
> @@ -94,6 +97,7 @@ virDataTypesOnceInit(void)
>  
>      DECLARE_CLASS_LOCKABLE(virAdmConnect);
>      DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData);
> +    DECLARE_CLASS(virAdmServer);
>  
>  #undef DECLARE_CLASS_COMMON
>  #undef DECLARE_CLASS_LOCKABLE
> @@ -859,3 +863,34 @@ virAdmConnectCloseCallbackDataDispose(void *obj)
>  
>      virObjectUnlock(cb_data);
>  }
> +
> +virAdmServerPtr
> +virAdmGetServer(virAdmConnectPtr conn, const char *name)
> +{
> +    virAdmServerPtr ret = NULL;
> +
> +    if (virDataTypesInitialize() < 0)
> +        goto error;
> +
> +    if (!(ret = virObjectNew(virAdmServerClass)))
> +        goto error;
> +    if (VIR_STRDUP(ret->name, name) < 0)
> +        goto error;
> +
> +    ret->conn = virObjectRef(conn);
> +
> +    return ret;
> + error:
> +    virObjectUnref(ret);
> +    return NULL;
> +}
> +
> +static void
> +virAdmServerDispose(void *obj)
> +{
> +    virAdmServerPtr srv = obj;
> +    VIR_DEBUG("release server srv=%p name=%s", srv, srv->name);
> +
> +    VIR_FREE(srv->name);
> +    virObjectUnref(srv->conn);
> +}
> diff --git a/src/datatypes.h b/src/datatypes.h
> index 1b1777d..31c636c 100644
> --- a/src/datatypes.h
> +++ b/src/datatypes.h
> @@ -42,6 +42,7 @@ extern virClassPtr virStorageVolClass;
>  extern virClassPtr virStoragePoolClass;
>  
>  extern virClassPtr virAdmConnectClass;
> +extern virClassPtr virAdmServerClass;
>  
>  # define virCheckConnectReturn(obj, retval)                             \
>      do {                                                                \
> @@ -317,6 +318,30 @@ extern virClassPtr virAdmConnectClass;
>          }                                                               \
>      } while (0)
>  
> +# define virCheckAdmServerReturn(obj, retval)                           \
> +    do {                                                                \
> +        virAdmServerPtr _srv = (obj);                                   \
> +        if (!virObjectIsClass(_srv, virAdmServerClass) ||               \
> +            !virObjectIsClass(_srv->conn, virAdmConnectClass)) {        \
> +            virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN,   \
> +                                 __FILE__, __FUNCTION__, __LINE__,      \
> +                                 __FUNCTION__);                         \
> +            virDispatchError(NULL);                                     \
> +            return retval;                                              \
> +        }                                                               \
> +    } while (0)
> +# define virCheckAdmServerGoto(obj, label)                              \
> +    do {                                                                \
> +        virAdmServerPtr _srv = (obj);                                   \
> +        if (!virObjectIsClass(_srv, virAdmServerClass) ||               \
> +            !virObjectIsClass(_srv->conn, virAdmConnectClass)) {        \
> +            virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN,   \
> +                                 __FILE__, __FUNCTION__, __LINE__,      \
> +                                 __FUNCTION__);                         \
> +            goto label;                                                 \
> +        }                                                               \
> +    } while (0);
> +
>  /**
>   * VIR_DOMAIN_DEBUG:
>   * @dom: domain
> @@ -417,6 +442,17 @@ struct _virAdmConnect {
>      virAdmConnectCloseCallbackDataPtr closeCallback;
>  };
>  
> +/**
> + * _virAdmServer:
> + *
> + * Internal structure associated to a daemon server
> + */
> +struct _virAdmServer {
> +    virObject object;
> +    virAdmConnectPtr conn;          /* pointer back to the admin connection */
> +    char *name;                     /* the server external name */
> +};
> +
>  
>  /**
>  * _virDomain:
> @@ -601,4 +637,6 @@ virDomainSnapshotPtr virGetDomainSnapshot(virDomainPtr domain,
>  
>  virAdmConnectPtr virAdmConnectNew(void);
>  
> +virAdmServerPtr virAdmGetServer(virAdmConnectPtr conn,
> +                                const char *name);
>  #endif /* __VIR_DATATYPES_H__ */
> diff --git a/src/libvirt_admin_private.syms b/src/libvirt_admin_private.syms
> index 85380dc..31f1f8d 100644
> --- a/src/libvirt_admin_private.syms
> +++ b/src/libvirt_admin_private.syms
> @@ -9,6 +9,9 @@
>  xdr_admin_connect_get_lib_version_ret;
>  xdr_admin_connect_open_args;
>  
> +# datatypes.h
> +virAdmGetServer;

I guess you'll need to expose virAdmServerClass too. Otherwise you may
get into linking troubles since in virCheckAdmServer*() macros defined
above the symbol is accessed directly.

ACK with that changed.

Michal




More information about the libvir-list mailing list