
On Thu, Sep 03, 2015 at 11:26:06AM +0200, Martin Kletzander wrote:
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.
From a theoretical POV, the number of servers is limited by the size of the array holding the virAdmServer structs. This is in turn size_t limited (well in practice its $RAM limited). So I think we should just use size_t in the struct here, and then use unsigned hyper in the wire which is big enough for any sizet
Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|