On Tue, Jun 28, 2022 at 06:09:40PM +0200, Tim Wiederhake wrote:
Signed-off-by: Tim Wiederhake <twiederh(a)redhat.com>
---
src/remote/remote_daemon_dispatch.c | 44 +++++++++++++++++++++
src/remote/remote_driver.c | 59 +++++++++++++++++++++++++++++
src/remote/remote_protocol.x | 19 +++++++++-
src/remote_protocol-structs | 16 ++++++++
4 files changed, 137 insertions(+), 1 deletion(-)
diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c
index dc5790f077..9011977e18 100644
--- a/src/remote/remote_daemon_dispatch.c
+++ b/src/remote/remote_daemon_dispatch.c
@@ -5869,6 +5869,50 @@ remoteDispatchConnectGetCPUModelNames(virNetServer *server
G_GNUC_UNUSED,
}
+static int
+remoteDispatchConnectGetHypervisorCPUModelNames(virNetServer *server G_GNUC_UNUSED,
+ virNetServerClient *client,
+ virNetMessage *msg G_GNUC_UNUSED,
+ struct virNetMessageError *rerr,
+
remote_connect_get_hypervisor_cpu_model_names_args *args,
+
remote_connect_get_hypervisor_cpu_model_names_ret *ret)
+{
+ int len = 0;
+ int rv = -1;
+ g_auto(GStrv) names = NULL;
+ g_auto(GStrv) aliases = NULL;
+ virConnectPtr conn = remoteGetHypervisorConn(client);
+
+ if (!conn)
+ goto cleanup;
+
+ len = virConnectGetHypervisorCPUModelNames(conn, args->arch, &names,
+ &aliases, args->flags);
+ if (len < 0)
+ goto cleanup;
+
+ if (len > REMOTE_CONNECT_CPU_MODELS_MAX) {
+ virReportError(VIR_ERR_RPC,
+ _("Too many CPU models '%d' for limit
'%d'"),
+ len, REMOTE_CONNECT_CPU_MODELS_MAX);
+ goto cleanup;
+ }
+
+ ret->names.names_val = g_steal_pointer(&names);
+ ret->names.names_len = len;
+ ret->aliases.aliases_val = g_steal_pointer(&aliases);
+ ret->aliases.aliases_len = len;
+ ret->ret = len;
'ret->ret' is not required, since both 'names' and 'aliases'
already
encode the length on the wire.
+
+ rv = 0;
+
+ cleanup:
+ if (rv < 0)
+ virNetMessageSaveError(rerr);
+ return rv;
+}
+
+
static int
remoteDispatchDomainCreateXMLWithFiles(virNetServer *server G_GNUC_UNUSED,
virNetServerClient *client,
+static int
+remoteConnectGetHypervisorCPUModelNames(virConnectPtr conn,
+ const char *archName,
+ char ***names,
+ char ***aliases,
+ unsigned int flags)
+{
+ int rv = -1;
+ size_t i;
+ remote_connect_get_hypervisor_cpu_model_names_args args;
+ remote_connect_get_hypervisor_cpu_model_names_ret ret;
+
+ struct private_data *priv = conn->privateData;
+
+ remoteDriverLock(priv);
+
+ args.arch = (char *) archName;
+ args.flags = flags;
+
+ memset(&ret, 0, sizeof(ret));
+ if (call(conn, priv, 0, REMOTE_PROC_CONNECT_GET_HYPERVISOR_CPU_MODEL_NAMES,
+ (xdrproc_t) xdr_remote_connect_get_hypervisor_cpu_model_names_args,
+ (char *) &args,
+ (xdrproc_t) xdr_remote_connect_get_hypervisor_cpu_model_names_ret,
+ (char *) &ret) < 0)
+ goto done;
+
+ /* Check the length of the returned list carefully. */
+ if (ret.names.names_len > REMOTE_CONNECT_CPU_MODELS_MAX) {
+ virReportError(VIR_ERR_RPC,
+ _("Too many model names '%d' for limit
'%d'"),
+ ret.names.names_len,
+ REMOTE_CONNECT_CPU_MODELS_MAX);
+ goto cleanup;
+ }
Also validate ret.names.names_len == ret.aliases.aliases_len
+
+ *names = g_new0(char *, ret.names.names_len + 1);
+ for (i = 0; i < ret.names.names_len; i++) {
+ (*names)[i] = g_steal_pointer(&ret.names.names_val[i]);
+ }
+
+ *aliases = g_new0(char *, ret.aliases.aliases_len + 1);
+ for (i = 0; i < ret.aliases.aliases_len; i++) {
+ (*aliases)[i] = g_steal_pointer(&ret.aliases.aliases_val[i]);
+ }
+
+ rv = ret.ret;
+
+ cleanup:
+ xdr_free((xdrproc_t) xdr_remote_connect_get_hypervisor_cpu_model_names_ret,
+ (char *) &ret);
+
+ done:
+ remoteDriverUnlock(priv);
+ return rv;
+}
+
diff --git a/src/remote/remote_protocol.x
b/src/remote/remote_protocol.x
index 79ffc63f03..a5c60399c7 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -3303,6 +3303,17 @@ struct remote_connect_get_cpu_model_names_ret {
int ret;
};
+struct remote_connect_get_hypervisor_cpu_model_names_args {
+ remote_nonnull_string arch;
+ unsigned int flags;
+};
+
+struct remote_connect_get_hypervisor_cpu_model_names_ret {
+ remote_nonnull_string names<REMOTE_CONNECT_CPU_MODELS_MAX>;
+ remote_nonnull_string aliases<REMOTE_CONNECT_CPU_MODELS_MAX>;
I'd expect 'remote_string', since aliases should be able to be NULL
+ int ret;
Drop 'ret'
+};
+
With regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|