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 [email protected] https://www.redhat.com/mailman/listinfo/libvir-list
signature.asc
Description: PGP signature
-- libvir-list mailing list [email protected] https://www.redhat.com/mailman/listinfo/libvir-list
