[libvirt] [PATCH v2 7/9] admin: Introduce virAdmServer structure
Martin Kletzander
mkletzan at redhat.com
Thu Sep 3 09:26:06 UTC 2015
On Fri, Aug 21, 2015 at 08:04:08PM +0200, 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.
>---
> include/libvirt/libvirt-admin.h | 4 ++++
> src/admin/admin_protocol.x | 9 +++++++++
> src/datatypes.c | 35 +++++++++++++++++++++++++++++++++++
> src/datatypes.h | 36 ++++++++++++++++++++++++++++++++++++
> src/libvirt_admin_private.syms | 5 +++++
> 5 files changed, 89 insertions(+)
>
>diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h
>index 9997cc2..f0752f5 100644
>--- a/include/libvirt/libvirt-admin.h
>+++ b/include/libvirt/libvirt-admin.h
>@@ -39,6 +39,8 @@ extern "C" {
> */
> typedef struct _virAdmConnect virAdmConnect;
>
>+typedef struct _virAdmServer virAdmServer;
>+
> /**
> * virAdmConnectPtr:
> *
>@@ -48,6 +50,8 @@ typedef struct _virAdmConnect virAdmConnect;
> */
> typedef virAdmConnect *virAdmConnectPtr;
>
>+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 cfc92ff..d062e9a 100644
>--- a/src/admin/admin_protocol.x
>+++ b/src/admin/admin_protocol.x
>@@ -30,12 +30,21 @@
> */
> 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;
>+ unsigned hyper id;
64 bits is a lot, I think, but no biggie, I feel agnostic to this.
>+};
>+
> /*----- Protocol. -----*/
> struct admin_connect_open_args {
> unsigned int flags;
>diff --git a/src/datatypes.c b/src/datatypes.c
>index 12bcfc1..9c61ece 100644
>--- a/src/datatypes.c
>+++ b/src/datatypes.c
>@@ -60,8 +60,10 @@ static void virStorageVolDispose(void *obj);
> static void virStoragePoolDispose(void *obj);
>
> virClassPtr virAdmConnectClass;
>+virClassPtr virAdmServerClass;
>
> static void virAdmConnectDispose(void *obj);
>+static void virAdmServerDispose(void *obj);
>
> static int
> virDataTypesOnceInit(void)
>@@ -90,6 +92,7 @@ virDataTypesOnceInit(void)
> DECLARE_CLASS(virStorageVol);
> DECLARE_CLASS(virStoragePool);
>
>+ DECLARE_CLASS(virAdmServer);
> DECLARE_CLASS_LOCKABLE(virAdmConnect);
>
> #undef DECLARE_CLASS_COMMON
>@@ -833,3 +836,35 @@ virAdmConnectDispose(void *obj)
> if (conn->privateDataFreeFunc)
> conn->privateDataFreeFunc(conn);
> }
>+
>+virAdmServerPtr
>+virAdmGetServer(virAdmConnectPtr conn, const char *name, const int id)
>+{
>+ 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);
>+ ret->id = id;
>+
>+ return ret;
>+ error:
>+ virObjectUnref(ret);
>+ return NULL;
>+}
>+
>+static void
>+virAdmServerDispose(void *obj)
>+{
>+ virAdmServerPtr srv = obj;
>+ VIR_DEBUG("release server %p %d", srv, srv->id);
>+
>+ VIR_FREE(srv->name);
>+ virObjectUnref(srv->conn);
>+}
>diff --git a/src/datatypes.h b/src/datatypes.h
>index be108fe..1147a7e 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,26 @@ extern virClassPtr virAdmConnectClass;
> } \
> } while (0)
>
>+# define virCheckAdmServerReturn(obj, retval) \
>+ do { \
>+ if (!virObjectIsClass(obj, virAdmServerClass)) { \
>+ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \
>+ __FILE__, __FUNCTION__, __LINE__, \
>+ __FUNCTION__); \
>+ virDispatchError(NULL); \
>+ return retval; \
>+ } \
>+ } while (0)
>+# define virCheckAdmServerGoto(obj, label) \
>+ do { \
>+ if (!virObjectIsClass(obj, virAdmServerClass)) { \
>+ virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INVALID_CONN, \
>+ __FILE__, __FUNCTION__, __LINE__, \
>+ __FUNCTION__); \
>+ goto label; \
>+ } \
>+ } while (0);
>+
> /**
> * VIR_DOMAIN_DEBUG:
> * @dom: domain
>@@ -402,6 +423,18 @@ struct _virAdmConnect {
> virFreeCallback privateDataFreeFunc;
> };
>
>+/**
>+ * _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 */
>+ unsigned int id; /* the server unique ID */
If it's 64bits though, this needs to change, so at least one of these
declarations must be changed to match the other. My agnosticism
swirls slowly into simple int-preference.
>+};
>+
>
> /**
> * _virDomain:
>@@ -586,4 +619,7 @@ virDomainSnapshotPtr virGetDomainSnapshot(virDomainPtr domain,
>
> virAdmConnectPtr virAdmConnectNew(void);
>
>+virAdmServerPtr virAdmGetServer(virAdmConnectPtr conn,
>+ const char *name,
>+ const int id);
> #endif /* __VIR_DATATYPES_H__ */
>diff --git a/src/libvirt_admin_private.syms b/src/libvirt_admin_private.syms
>index 401cd4e..da559e0 100644
>--- a/src/libvirt_admin_private.syms
>+++ b/src/libvirt_admin_private.syms
>@@ -6,8 +6,13 @@
> #
>
> # admin/admin_protocol.x
>+xdr_admin_connect_list_servers_args;
>+xdr_admin_connect_list_servers_ret;
This should be in the following patch.
> xdr_admin_connect_open_args;
>
>+# datatypes.h
>+virAdmGetServer;
>+
> # Let emacs know we want case-insensitive sorting
> # Local Variables:
> # sort-fold-case: t
>--
>2.4.3
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150903/1f2419e0/attachment-0001.sig>
More information about the libvir-list
mailing list