]> xenbits.xensource.com Git - libvirt.git/commitdiff
admin: Introduce virAdmServer structure
authorErik Skultety <eskultet@redhat.com>
Thu, 13 Aug 2015 14:20:27 +0000 (16:20 +0200)
committerErik Skultety <eskultet@redhat.com>
Wed, 17 Feb 2016 11:46:34 +0000 (12:46 +0100)
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@redhat.com>
include/libvirt/libvirt-admin.h
src/admin/admin_protocol.x
src/admin_protocol-structs
src/datatypes.c
src/datatypes.h
src/libvirt_admin_private.syms

index ab9df96b351f5b775054aee82150c2cdff74c014..b3425102a02c86fae826ea07173ea5fdeee3ef91 100644 (file)
@@ -42,6 +42,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:
  *
@@ -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);
 
index 711201acc4cdc19b0a8cf13c381551d79646a325..549fdf36fb215f76181b8d9b485a798150aa90d4 100644 (file)
  */
 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;
index 809379be349822cf7d9fedbf479f4922709d84b4..95ea4e436bcc3143158e99e7a1f30a80e0f4caff 100644 (file)
@@ -1,4 +1,7 @@
 /* -*- c -*- */
+struct admin_nonnull_server {
+        admin_nonnull_string       name;
+};
 struct admin_connect_open_args {
         u_int                      flags;
 };
index c832d805859f659ef294c119fcba3b2cf9d4673e..da6ec371f42115527824a8b0fe53933732068f32 100644 (file)
@@ -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);
+}
index 1b1777daa8859dc6a7ffe995da6257bce3ce8caf..31c636ca6c5da9bed9694f8e1b9229b4198b51f3 100644 (file)
@@ -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__ */
index 85380dcb2fc53e0b52baed8891e189a0a5ad32ed..ff0ef2e33203bfdfae0bbe9c97e57e5411874741 100644 (file)
@@ -9,6 +9,10 @@
 xdr_admin_connect_get_lib_version_ret;
 xdr_admin_connect_open_args;
 
+# datatypes.h
+virAdmGetServer;
+virAdmServerClass;
+
 # Let emacs know we want case-insensitive sorting
 # Local Variables:
 # sort-fold-case: t