]> xenbits.xensource.com Git - libvirt.git/commitdiff
Introduce remote protocol support for virDomainCreate{XML}WithFiles
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 9 Jul 2013 17:03:18 +0000 (18:03 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 18 Jul 2013 10:01:49 +0000 (11:01 +0100)
Since they make use of file descriptor passing, the remote protocol
methods for virDomainCreate{XML}WithFiles must be written by hand.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
daemon/remote.c
src/remote/remote_driver.c
src/remote/remote_protocol.x
src/remote_protocol-structs

index 5847e60e2e665dab970249c9560ef30de0a51cfb..a1b571c6dca1516a904d5d7421df6c2a80b0903c 100644 (file)
@@ -4891,6 +4891,110 @@ cleanup:
 }
 
 
+static int remoteDispatchDomainCreateXMLWithFiles(
+    virNetServerPtr server ATTRIBUTE_UNUSED,
+    virNetServerClientPtr client,
+    virNetMessagePtr msg ATTRIBUTE_UNUSED,
+    virNetMessageErrorPtr rerr,
+    remote_domain_create_xml_with_files_args *args,
+    remote_domain_create_xml_with_files_ret *ret)
+{
+    int rv = -1;
+    virDomainPtr dom = NULL;
+    struct daemonClientPrivate *priv =
+        virNetServerClientGetPrivateData(client);
+    int *files = NULL;
+    unsigned int nfiles = 0;
+    size_t i;
+
+    if (!priv->conn) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (VIR_ALLOC_N(files, msg->nfds) < 0)
+        goto cleanup;
+    for (i = 0; i < msg->nfds; i++) {
+        if ((files[i] = virNetMessageDupFD(msg, i)) < 0)
+            goto cleanup;
+        nfiles++;
+    }
+
+    if ((dom = virDomainCreateXMLWithFiles(priv->conn, args->xml_desc,
+                                           nfiles, files,
+                                           args->flags)) == NULL)
+        goto cleanup;
+
+    make_nonnull_domain(&ret->dom, dom);
+    rv = 0;
+
+cleanup:
+    for (i = 0; i < nfiles; i++) {
+        VIR_FORCE_CLOSE(files[i]);
+    }
+    VIR_FREE(files);
+    if (rv < 0)
+        virNetMessageSaveError(rerr);
+    if (dom)
+        virDomainFree(dom);
+    return rv;
+}
+
+
+static int remoteDispatchDomainCreateWithFiles(
+    virNetServerPtr server ATTRIBUTE_UNUSED,
+    virNetServerClientPtr client,
+    virNetMessagePtr msg ATTRIBUTE_UNUSED,
+    virNetMessageErrorPtr rerr,
+    remote_domain_create_with_files_args *args,
+    remote_domain_create_with_files_ret *ret)
+{
+    int rv = -1;
+    virDomainPtr dom = NULL;
+    struct daemonClientPrivate *priv =
+        virNetServerClientGetPrivateData(client);
+    int *files = NULL;
+    unsigned int nfiles = 0;
+    size_t i;
+
+    if (!priv->conn) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (VIR_ALLOC_N(files, msg->nfds) < 0)
+        goto cleanup;
+    for (i = 0; i < msg->nfds; i++) {
+        if ((files[i] = virNetMessageDupFD(msg, i)) < 0)
+            goto cleanup;
+        nfiles++;
+    }
+
+    if (!(dom = get_nonnull_domain(priv->conn, args->dom)))
+        goto cleanup;
+
+    if (virDomainCreateWithFiles(dom,
+                                 nfiles, files,
+                                 args->flags) < 0)
+        goto cleanup;
+
+    make_nonnull_domain(&ret->dom, dom);
+    rv = 0;
+
+cleanup:
+    for (i = 0; i < nfiles; i++) {
+        VIR_FORCE_CLOSE(files[i]);
+    }
+    VIR_FREE(files);
+    if (rv < 0)
+        virNetMessageSaveError(rerr);
+    if (dom)
+        virDomainFree(dom);
+    return rv;
+}
+
+
+
 /*----- Helpers. -----*/
 
 /* get_nonnull_domain and get_nonnull_network turn an on-wire
index 0298aabfccb16f025bae00949f7649f7ca1f80c6..71c8e67c93d21866c0ff583d083dc94d92992b49 100644 (file)
@@ -6387,6 +6387,75 @@ cleanup:
 }
 
 
+static virDomainPtr
+remoteDomainCreateXMLWithFiles(virConnectPtr conn, const char *xml_desc,
+                               unsigned int nfiles, int *files, unsigned int flags)
+{
+    virDomainPtr rv = NULL;
+    struct private_data *priv = conn->privateData;
+    remote_domain_create_xml_with_files_args args;
+    remote_domain_create_xml_with_files_ret ret;
+
+    remoteDriverLock(priv);
+
+    args.xml_desc = (char *)xml_desc;
+    args.flags = flags;
+
+    memset(&ret, 0, sizeof(ret));
+
+    if (callFull(conn, priv, 0,
+                 files, nfiles,
+                 NULL, NULL,
+                 REMOTE_PROC_DOMAIN_CREATE_XML_WITH_FILES,
+                 (xdrproc_t)xdr_remote_domain_create_xml_with_files_args, (char *)&args,
+                 (xdrproc_t)xdr_remote_domain_create_xml_with_files_ret, (char *)&ret) == -1) {
+        goto done;
+    }
+
+    rv = get_nonnull_domain(conn, ret.dom);
+    xdr_free((xdrproc_t)xdr_remote_domain_create_xml_with_files_ret, (char *)&ret);
+
+done:
+    remoteDriverUnlock(priv);
+    return rv;
+}
+
+
+static int
+remoteDomainCreateWithFiles(virDomainPtr dom,
+                            unsigned int nfiles, int *files,
+                            unsigned int flags)
+{
+    int rv = -1;
+    struct private_data *priv = dom->conn->privateData;
+    remote_domain_create_with_files_args args;
+    remote_domain_create_with_files_ret ret;
+
+    remoteDriverLock(priv);
+
+    make_nonnull_domain(&args.dom, dom);
+    args.flags = flags;
+
+    memset(&ret, 0, sizeof(ret));
+
+    if (callFull(dom->conn, priv, 0,
+                 files, nfiles,
+                 NULL, NULL,
+                 REMOTE_PROC_DOMAIN_CREATE_WITH_FILES,
+                 (xdrproc_t)xdr_remote_domain_create_with_files_args, (char *)&args,
+                 (xdrproc_t)xdr_remote_domain_create_with_files_ret, (char *)&ret) == -1) {
+        goto done;
+    }
+
+    dom->id = ret.dom.id;
+    xdr_free((xdrproc_t) &xdr_remote_domain_create_with_files_ret, (char *) &ret);
+    rv = 0;
+
+done:
+    remoteDriverUnlock(priv);
+    return rv;
+}
+
 static void
 remoteDomainEventQueue(struct private_data *priv, virDomainEventPtr event)
 {
@@ -6544,6 +6613,7 @@ static virDriver remote_driver = {
     .connectNumOfDomains = remoteConnectNumOfDomains, /* 0.3.0 */
     .connectListAllDomains = remoteConnectListAllDomains, /* 0.9.13 */
     .domainCreateXML = remoteDomainCreateXML, /* 0.3.0 */
+    .domainCreateXMLWithFiles = remoteDomainCreateXMLWithFiles, /* 1.1.1 */
     .domainLookupByID = remoteDomainLookupByID, /* 0.3.0 */
     .domainLookupByUUID = remoteDomainLookupByUUID, /* 0.3.0 */
     .domainLookupByName = remoteDomainLookupByName, /* 0.3.0 */
@@ -6598,6 +6668,7 @@ static virDriver remote_driver = {
     .connectNumOfDefinedDomains = remoteConnectNumOfDefinedDomains, /* 0.3.0 */
     .domainCreate = remoteDomainCreate, /* 0.3.0 */
     .domainCreateWithFlags = remoteDomainCreateWithFlags, /* 0.8.2 */
+    .domainCreateWithFiles = remoteDomainCreateWithFiles, /* 1.1.1 */
     .domainDefineXML = remoteDomainDefineXML, /* 0.3.0 */
     .domainUndefine = remoteDomainUndefine, /* 0.3.0 */
     .domainUndefineFlags = remoteDomainUndefineFlags, /* 0.9.4 */
index d1c77f51332b64cf68b3b21b3e2dc4c0774a1465..b48c1167faf8071c35def8bf4effba08451be47c 100644 (file)
@@ -734,6 +734,15 @@ struct remote_domain_create_xml_ret {
     remote_nonnull_domain dom;
 };
 
+struct remote_domain_create_xml_with_files_args {
+    remote_nonnull_string xml_desc;
+    unsigned int flags;
+};
+
+struct remote_domain_create_xml_with_files_ret {
+    remote_nonnull_domain dom;
+};
+
 struct remote_domain_lookup_by_id_args {
     int id;
 };
@@ -995,6 +1004,15 @@ struct remote_domain_create_with_flags_ret {
     remote_nonnull_domain dom;
 };
 
+struct remote_domain_create_with_files_args {
+    remote_nonnull_domain dom;
+    unsigned int flags;
+};
+
+struct remote_domain_create_with_files_ret {
+    remote_nonnull_domain dom;
+};
+
 struct remote_domain_define_xml_args {
     remote_nonnull_string xml;
 };
@@ -4958,5 +4976,18 @@ enum remote_procedure {
      * @acl: domain:save:!VIR_DOMAIN_AFFECT_CONFIG|VIR_DOMAIN_AFFECT_LIVE
      * @acl: domain:save:VIR_DOMAIN_AFFECT_CONFIG
      */
-    REMOTE_PROC_DOMAIN_SET_MEMORY_STATS_PERIOD = 308
+    REMOTE_PROC_DOMAIN_SET_MEMORY_STATS_PERIOD = 308,
+
+    /**
+     * @generate: none
+     * @acl: domain:write
+     * @acl: domain:start
+     */
+    REMOTE_PROC_DOMAIN_CREATE_XML_WITH_FILES = 309,
+
+    /**
+     * @generate: none
+     * @acl: domain:start
+     */
+    REMOTE_PROC_DOMAIN_CREATE_WITH_FILES = 310
 };
index 86e7650ed35567f015fcf2b8a8fdb10350e7bb2f..fcd6c6699fd8807659000c3e822b77e96a435c90 100644 (file)
@@ -423,6 +423,13 @@ struct remote_domain_create_xml_args {
 struct remote_domain_create_xml_ret {
         remote_nonnull_domain      dom;
 };
+struct remote_domain_create_xml_with_files_args {
+        remote_nonnull_string      xml_desc;
+        u_int                      flags;
+};
+struct remote_domain_create_xml_with_files_ret {
+        remote_nonnull_domain      dom;
+};
 struct remote_domain_lookup_by_id_args {
         int                        id;
 };
@@ -650,6 +657,13 @@ struct remote_domain_create_with_flags_args {
 struct remote_domain_create_with_flags_ret {
         remote_nonnull_domain      dom;
 };
+struct remote_domain_create_with_files_args {
+        remote_nonnull_domain      dom;
+        u_int                      flags;
+};
+struct remote_domain_create_with_files_ret {
+        remote_nonnull_domain      dom;
+};
 struct remote_domain_define_xml_args {
         remote_nonnull_string      xml;
 };
@@ -2607,4 +2621,6 @@ enum remote_procedure {
         REMOTE_PROC_DOMAIN_MIGRATE_FINISH3_PARAMS = 306,
         REMOTE_PROC_DOMAIN_MIGRATE_CONFIRM3_PARAMS = 307,
         REMOTE_PROC_DOMAIN_SET_MEMORY_STATS_PERIOD = 308,
+        REMOTE_PROC_DOMAIN_CREATE_XML_WITH_FILES = 309,
+        REMOTE_PROC_DOMAIN_CREATE_WITH_FILES = 310,
 };