]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
Add JSON serialization of virNetServerServicePtr objects for process re-exec()
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 9 Aug 2012 11:54:54 +0000 (12:54 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 16 Oct 2012 14:45:55 +0000 (15:45 +0100)
Add two new APIs virNetServerServiceNewPostExecRestart and
virNetServerServicePreExecRestart which allow a virNetServerServicePtr
object to be created from a JSON object and saved to a
JSON object, for the purpose of re-exec'ing a process.

This includes serialization of the listening sockets associated
with the service

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
po/POTFILES.in
src/libvirt_private.syms
src/rpc/virnetserverservice.c
src/rpc/virnetserverservice.h

index 23f675d5e82e8c68f3ebb51164a6ac287f5bb616..66779dd87e83914ef75d89212625af92cef01fb6 100644 (file)
@@ -103,6 +103,7 @@ src/rpc/virnetserver.c
 src/rpc/virnetserverclient.c
 src/rpc/virnetservermdns.c
 src/rpc/virnetserverprogram.c
+src/rpc/virnetserverservice.c
 src/rpc/virnetsshsession.c
 src/rpc/virnettlscontext.c
 src/secret/secret_driver.c
index b0f6c81e1b055079f13c4faa8ac1336d7ccc8f2b..3f9d96cff91222ee8339468740036d5cf4c7748b 100644 (file)
@@ -1638,8 +1638,10 @@ virNetServerServiceGetPort;
 virNetServerServiceGetTLSContext;
 virNetServerServiceIsReadonly;
 virNetServerServiceNewFD;
+virNetServerServiceNewPostExecRestart;
 virNetServerServiceNewTCP;
 virNetServerServiceNewUNIX;
+virNetServerServicePreExecRestart;
 virNetServerServiceSetDispatcher;
 virNetServerServiceToggle;
 
index 4d5896a6532b0cde0f99175e298aafbf71b6cc47..8ac523cde22fe8375e535ae1bbb7d99d13d3d863 100644 (file)
@@ -250,6 +250,130 @@ error:
 }
 
 
+virNetServerServicePtr virNetServerServiceNewPostExecRestart(virJSONValuePtr object)
+{
+    virNetServerServicePtr svc;
+    virJSONValuePtr socks;
+    size_t i;
+    int n;
+
+    if (virNetServerServiceInitialize() < 0)
+        return NULL;
+
+    if (!(svc = virObjectNew(virNetServerServiceClass)))
+        return NULL;
+
+    if (virJSONValueObjectGetNumberInt(object, "auth", &svc->auth) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Missing auth field in JSON state document"));
+        goto error;
+    }
+    if (virJSONValueObjectGetBoolean(object, "readonly", &svc->readonly) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Missing readonly field in JSON state document"));
+        goto error;
+    }
+    if (virJSONValueObjectGetNumberUint(object, "nrequests_client_max",
+                                        (unsigned int *)&svc->nrequests_client_max) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Missing nrequests_client_max field in JSON state document"));
+        goto error;
+    }
+
+    if (!(socks = virJSONValueObjectGet(object, "socks"))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Missing socks field in JSON state document"));
+        goto error;
+    }
+
+    if ((n = virJSONValueArraySize(socks)) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("socks field in JSON was not an array"));
+        goto error;
+    }
+
+    svc->nsocks = n;
+    if (VIR_ALLOC_N(svc->socks, svc->nsocks) < 0) {
+        virReportOOMError();
+        goto error;
+    }
+
+    for (i = 0 ; i < svc->nsocks ; i++) {
+        virJSONValuePtr child = virJSONValueArrayGet(socks, i);
+        virNetSocketPtr sock;
+
+        if (!(sock = virNetSocketNewPostExecRestart(child))) {
+            virObjectUnref(sock);
+            goto error;
+        }
+
+        svc->socks[i] = sock;
+
+        /* IO callback is initially disabled, until we're ready
+         * to deal with incoming clients */
+        virObjectRef(svc);
+        if (virNetSocketAddIOCallback(sock,
+                                      0,
+                                      virNetServerServiceAccept,
+                                      svc,
+                                      virObjectFreeCallback) < 0) {
+            virObjectUnref(svc);
+            virObjectUnref(sock);
+            goto error;
+        }
+    }
+
+    return svc;
+
+error:
+    virObjectUnref(svc);
+    return NULL;
+}
+
+
+virJSONValuePtr virNetServerServicePreExecRestart(virNetServerServicePtr svc)
+{
+    virJSONValuePtr object = virJSONValueNewObject();
+    virJSONValuePtr socks;
+    size_t i;
+
+    if (!object)
+        return NULL;
+
+    if (!(socks = virJSONValueNewArray()))
+        goto error;
+
+    if (virJSONValueObjectAppendNumberInt(object, "auth", svc->auth) < 0)
+        goto error;
+    if (virJSONValueObjectAppendBoolean(object, "readonly", svc->readonly) < 0)
+        goto error;
+    if (virJSONValueObjectAppendNumberUint(object, "nrequests_client_max", svc->nrequests_client_max) < 0)
+        goto error;
+
+    if (virJSONValueObjectAppend(object, "socks", socks) < 0) {
+        virJSONValueFree(socks);
+        goto error;
+    }
+
+    for (i = 0 ; i < svc->nsocks ; i++) {
+        virJSONValuePtr child;
+        if (!(child = virNetSocketPreExecRestart(svc->socks[i])))
+            goto error;
+
+        if (virJSONValueArrayAppend(socks, child) < 0) {
+            virJSONValueFree(child);
+            goto error;
+        }
+    }
+
+    return object;
+
+error:
+    virJSONValueFree(object);
+    return NULL;
+}
+
+
 int virNetServerServiceGetPort(virNetServerServicePtr svc)
 {
     /* We're assuming if there are multiple sockets
index 3fe089be4aebf3a8e8a6d3efbf6bbb2b0d51d82d..615b572c1a5198bce6a74d25a16cd7b04dbee20a 100644 (file)
@@ -56,6 +56,10 @@ virNetServerServicePtr virNetServerServiceNewFD(int fd,
                                                 size_t nrequests_client_max,
                                                 virNetTLSContextPtr tls);
 
+virNetServerServicePtr virNetServerServiceNewPostExecRestart(virJSONValuePtr object);
+
+virJSONValuePtr virNetServerServicePreExecRestart(virNetServerServicePtr service);
+
 int virNetServerServiceGetPort(virNetServerServicePtr svc);
 
 int virNetServerServiceGetAuth(virNetServerServicePtr svc);