Alas, the special handling of nformats == 0 means we can't use autogen.
* src/remote/remote_protocol.x (remote_domain_native_formats_args)
(remote_domain_native_formats_ret): New types.
* daemon/remote.c (remoteDispatchDomainNativeFormats): New function.
* src/remote/remote_driver.c (remoteDomainNativeFormats): Likewise.
(remote_driver): Register it.
* src/remote_protocol-structs: Regenerate.
---
daemon/remote.c | 56 ++++++++++++++++++++++++++++++++++++
src/remote/remote_driver.c | 64 +++++++++++++++++++++++++++++++++++++++++-
src/remote/remote_protocol.x | 17 ++++++++++-
src/remote_protocol-structs | 12 ++++++++
4 files changed, 146 insertions(+), 3 deletions(-)
diff --git a/daemon/remote.c b/daemon/remote.c
index a28a754..3511158 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -1298,6 +1298,62 @@ cleanup:
}
static int
+remoteDispatchDomainNativeFormats(virNetServerPtr server ATTRIBUTE_UNUSED,
+ virNetServerClientPtr client ATTRIBUTE_UNUSED,
+ virNetMessagePtr msg ATTRIBUTE_UNUSED,
+ virNetMessageErrorPtr rerr,
+ remote_domain_native_formats_args *args,
+ remote_domain_native_formats_ret *ret)
+{
+ char **formats = NULL;
+ unsigned int flags;
+ int rv = -1;
+ struct daemonClientPrivate *priv =
+ virNetServerClientGetPrivateData(client);
+
+ if (!priv->conn) {
+ virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not
open"));
+ goto cleanup;
+ }
+
+ flags = args->flags;
+
+ if (args->nformats > REMOTE_DOMAIN_NATIVE_FORMATS_MAX) {
+ virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("nformats too
large"));
+ goto cleanup;
+ }
+ if (args->nformats) {
+ if (VIR_ALLOC_N(formats, args->nformats) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ ret->formats.formats_val = formats;
+ }
+
+ ret->nformats = virConnectDomainNativeFormats(priv->conn,
+ ret->formats.formats_val,
+ args->nformats, flags);
+ if (ret->nformats < 0)
+ goto cleanup;
+
+ /* In this case, we need to send back the number of formats supported
+ */
+ if (args->nformats == 0)
+ goto success;
+
+ ret->formats.formats_len = ret->nformats;
+success:
+ rv = 0;
+
+cleanup:
+ if (rv < 0) {
+ virNetMessageSaveError(rerr);
+ VIR_FREE(ret->formats.formats_val);
+ }
+ return rv;
+}
+
+static int
remoteDispatchDomainGetVcpuPinInfo(virNetServerPtr server ATTRIBUTE_UNUSED,
virNetServerClientPtr client ATTRIBUTE_UNUSED,
virNetMessagePtr msg ATTRIBUTE_UNUSED,
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index e28840b..8b35c5f 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -2,7 +2,7 @@
* remote_driver.c: driver to provide access to libvirtd running
* on a remote machine
*
- * Copyright (C) 2007-2011 Red Hat, Inc.
+ * Copyright (C) 2007-2012 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -1901,6 +1901,67 @@ done:
}
static int
+remoteDomainNativeFormats (virConnectPtr conn,
+ char **formats, int nformats,
+ unsigned int flags)
+{
+ int rv = -1;
+ remote_domain_native_formats_args args;
+ remote_domain_native_formats_ret ret;
+ int i = -1;
+ struct private_data *priv = conn->privateData;
+
+ remoteDriverLock(priv);
+
+ args.nformats = nformats;
+ args.flags = flags;
+
+ memset (&ret, 0, sizeof ret);
+ if (call (conn, priv, 0, REMOTE_PROC_DOMAIN_NATIVE_FORMATS,
+ (xdrproc_t) xdr_remote_domain_native_formats_args, (char *) &args,
+ (xdrproc_t) xdr_remote_domain_native_formats_ret, (char *) &ret) ==
-1)
+ goto done;
+
+ /* Check the length of the returned list carefully. */
+ if (ret.formats.formats_len > REMOTE_DOMAIN_NATIVE_FORMATS_MAX ||
+ ret.formats.formats_len > nformats) {
+ remoteError(VIR_ERR_RPC, "%s",
+ _("remoteDomainNativeFormats: "
+ "returned number of formats exceeds limit"));
+ goto cleanup;
+ }
+ /* Handle the case when the caller does not know the number of formats
+ * and is asking for the number of formats supported
+ */
+ if (nformats == 0) {
+ rv = ret.nformats;
+ goto cleanup;
+ }
+
+ /* Deserialise the result. */
+ for (i = 0; i < ret.formats.formats_len; ++i) {
+ if ((formats[i] = strdup(ret.formats.formats_val[i])) == NULL) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ }
+
+ rv = ret.formats.formats_len;
+
+cleanup:
+ if (rv < 0) {
+ int j;
+ for (j = 0; j < i; j++)
+ VIR_FREE(formats[j]);
+ }
+ xdr_free ((xdrproc_t) xdr_remote_domain_native_formats_ret,
+ (char *) &ret);
+done:
+ remoteDriverUnlock(priv);
+ return rv;
+}
+
+static int
remoteDomainMigratePrepare (virConnectPtr dconn,
char **cookie, int *cookielen,
const char *uri_in, char **uri_out,
@@ -4654,6 +4715,7 @@ static virDriver remote_driver = {
.domainGetXMLDesc = remoteDomainGetXMLDesc, /* 0.3.0 */
.domainXMLFromNative = remoteDomainXMLFromNative, /* 0.6.4 */
.domainXMLToNative = remoteDomainXMLToNative, /* 0.6.4 */
+ .domainNativeFormats = remoteDomainNativeFormats, /* 0.9.10 */
.listDefinedDomains = remoteListDefinedDomains, /* 0.3.0 */
.numOfDefinedDomains = remoteNumOfDefinedDomains, /* 0.3.0 */
.domainCreate = remoteDomainCreate, /* 0.3.0 */
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index ca739ff..cda7501 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -3,7 +3,7 @@
* remote_internal driver and libvirtd. This protocol is
* internal and may change at any time.
*
- * Copyright (C) 2006-2011 Red Hat, Inc.
+ * Copyright (C) 2006-2012 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -207,6 +207,9 @@ const REMOTE_DOMAIN_SEND_KEY_MAX = 16;
*/
const REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX = 16;
+/* Upper limit on number of domain native formats */
+const REMOTE_DOMAIN_NATIVE_FORMATS_MAX = 16;
+
/* UUID. VIR_UUID_BUFLEN definition comes from libvirt.h */
typedef opaque remote_uuid[VIR_UUID_BUFLEN];
@@ -1800,6 +1803,15 @@ struct remote_domain_xml_to_native_ret {
remote_nonnull_string nativeConfig;
};
+struct remote_domain_native_formats_args {
+ int nformats;
+ unsigned int flags;
+};
+
+struct remote_domain_native_formats_ret {
+ remote_nonnull_string formats<REMOTE_DOMAIN_NATIVE_FORMATS_MAX>;
+ int nformats;
+};
struct remote_num_of_secrets_ret {
int num;
@@ -2653,7 +2665,8 @@ enum remote_procedure {
REMOTE_PROC_DOMAIN_SET_NUMA_PARAMETERS = 254, /* autogen autogen */
REMOTE_PROC_DOMAIN_GET_NUMA_PARAMETERS = 255, /* skipgen skipgen */
REMOTE_PROC_DOMAIN_SET_INTERFACE_PARAMETERS = 256, /* autogen autogen */
- REMOTE_PROC_DOMAIN_GET_INTERFACE_PARAMETERS = 257 /* skipgen skipgen */
+ REMOTE_PROC_DOMAIN_GET_INTERFACE_PARAMETERS = 257, /* skipgen skipgen */
+ REMOTE_PROC_DOMAIN_NATIVE_FORMATS = 258 /* skipgen skipgen priority:high */
/*
* Notice how the entries are grouped in sets of 10 ?
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index 2758315..9dacbce 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -1354,6 +1354,17 @@ struct remote_domain_xml_to_native_args {
struct remote_domain_xml_to_native_ret {
remote_nonnull_string nativeConfig;
};
+struct remote_domain_native_formats_args {
+ int nformats;
+ u_int flags;
+};
+struct remote_domain_native_formats_ret {
+ struct {
+ u_int formats_len;
+ remote_nonnull_string * formats_val;
+ } formats;
+ int nformats;
+};
struct remote_num_of_secrets_ret {
int num;
};
@@ -2090,4 +2101,5 @@ enum remote_procedure {
REMOTE_PROC_DOMAIN_GET_NUMA_PARAMETERS = 255,
REMOTE_PROC_DOMAIN_SET_INTERFACE_PARAMETERS = 256,
REMOTE_PROC_DOMAIN_GET_INTERFACE_PARAMETERS = 257,
+ REMOTE_PROC_DOMAIN_NATIVE_FORMATS = 258,
};
--
1.7.7.5