]> xenbits.xensource.com Git - libvirt.git/commitdiff
Remote driver client and server for virDomainOpenConsole
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 23 Jul 2010 12:57:14 +0000 (13:57 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 11 Nov 2010 16:02:46 +0000 (16:02 +0000)
This provides an implementation of the virDomainOpenConsole
API for the remote driver client and server.

* daemon/remote.c: Server side impl
* src/remote/remote_driver.c: Client impl
* src/remote/remote_protocol.x: Wire definition

daemon/remote.c
daemon/remote_dispatch_args.h
daemon/remote_dispatch_prototypes.h
daemon/remote_dispatch_table.h
src/remote/remote_driver.c
src/remote/remote_protocol.c
src/remote/remote_protocol.h
src/remote/remote_protocol.x
src/remote_protocol-structs

index 3cf38866498e70a635072274ec010076eecc4b01..16608156d925f5363639237c83509ef8853a92ab 100644 (file)
@@ -6907,6 +6907,58 @@ qemuDispatchMonitorCommand (struct qemud_server *server ATTRIBUTE_UNUSED,
 }
 
 
+static int
+remoteDispatchDomainOpenConsole(struct qemud_server *server ATTRIBUTE_UNUSED,
+                                struct qemud_client *client,
+                                virConnectPtr conn,
+                                remote_message_header *hdr,
+                                remote_error *rerr,
+                                remote_domain_open_console_args *args,
+                                void *ret ATTRIBUTE_UNUSED)
+{
+    int r;
+    struct qemud_client_stream *stream;
+    virDomainPtr dom;
+
+    CHECK_CONN (client);
+
+    dom = get_nonnull_domain (conn, args->domain);
+    if (dom == NULL) {
+        remoteDispatchConnError(rerr, conn);
+        return -1;
+    }
+
+    stream = remoteCreateClientStream(conn, hdr);
+    if (!stream) {
+        virDomainFree(dom);
+        remoteDispatchOOMError(rerr);
+        return -1;
+    }
+
+    r = virDomainOpenConsole(dom,
+                             args->devname ? *args->devname : NULL,
+                             stream->st,
+                             args->flags);
+    if (r == -1) {
+        virDomainFree(dom);
+        remoteFreeClientStream(client, stream);
+        remoteDispatchConnError(rerr, conn);
+        return -1;
+    }
+
+    if (remoteAddClientStream(client, stream, 1) < 0) {
+        virDomainFree(dom);
+        remoteDispatchConnError(rerr, conn);
+        virStreamAbort(stream->st);
+        remoteFreeClientStream(client, stream);
+        return -1;
+    }
+
+    virDomainFree(dom);
+    return 0;
+}
+
+
 /*----- Helpers. -----*/
 
 /* get_nonnull_domain and get_nonnull_network turn an on-wire
index 9583e9c2bbf0e081a7a4279fc118409e74ba2d61..971af8000836632db7df0e59780d36a94a4f2414 100644 (file)
     remote_domain_get_memory_parameters_args val_remote_domain_get_memory_parameters_args;
     remote_domain_set_vcpus_flags_args val_remote_domain_set_vcpus_flags_args;
     remote_domain_get_vcpus_flags_args val_remote_domain_get_vcpus_flags_args;
+    remote_domain_open_console_args val_remote_domain_open_console_args;
index 6b358514dae8325300ee80ec45ec034a01dca381..15c7ec792eb459c382b36a9958a074847c7dffdd 100644 (file)
@@ -466,6 +466,14 @@ static int remoteDispatchDomainMigrateSetMaxDowntime(
     remote_error *err,
     remote_domain_migrate_set_max_downtime_args *args,
     void *ret);
+static int remoteDispatchDomainOpenConsole(
+    struct qemud_server *server,
+    struct qemud_client *client,
+    virConnectPtr conn,
+    remote_message_header *hdr,
+    remote_error *err,
+    remote_domain_open_console_args *args,
+    void *ret);
 static int remoteDispatchDomainPinVcpu(
     struct qemud_server *server,
     struct qemud_client *client,
index dd2adc776af18af5b7d072db9b4b6acf6e5fb198..4cfa1b1540d9467ee9a86d0390518e698bd5de88 100644 (file)
     .args_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_args,
     .ret_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_ret,
 },
+{   /* DomainOpenConsole => 201 */
+    .fn = (dispatch_fn) remoteDispatchDomainOpenConsole,
+    .args_filter = (xdrproc_t) xdr_remote_domain_open_console_args,
+    .ret_filter = (xdrproc_t) xdr_void,
+},
index 93d539c818616d1c212f1bb2413c2a788dd307f0..5a5db7f48af9a0a8deb6494e512c7dc599ebde54 100644 (file)
@@ -8152,11 +8152,16 @@ remoteStreamEventTimerUpdate(struct private_stream_data *privst)
     if (!privst->cb)
         return;
 
-    if (!privst->cbEvents)
-        virEventUpdateTimeout(privst->cbTimer, -1);
-    else if (privst->incoming &&
-             (privst->cbEvents & VIR_STREAM_EVENT_READABLE))
+    VIR_DEBUG("Check timer offset=%d %d", privst->incomingOffset, privst->cbEvents);
+    if ((privst->incomingOffset &&
+         (privst->cbEvents & VIR_STREAM_EVENT_READABLE)) ||
+        (privst->cbEvents & VIR_STREAM_EVENT_WRITABLE)) {
+        VIR_DEBUG0("Enabling event timer");
         virEventUpdateTimeout(privst->cbTimer, 0);
+    } else {
+        VIR_DEBUG0("Disabling event timer");
+        virEventUpdateTimeout(privst->cbTimer, -1);
+    }
 }
 
 
@@ -8422,24 +8427,33 @@ remoteStreamEventTimer(int timer ATTRIBUTE_UNUSED, void *opaque)
     virStreamPtr st = opaque;
     struct private_data *priv = st->conn->privateData;
     struct private_stream_data *privst = st->privateData;
+    int events = 0;
 
     remoteDriverLock(priv);
+
     if (privst->cb &&
         (privst->cbEvents & VIR_STREAM_EVENT_READABLE) &&
-        privst->incomingOffset) {
+        privst->incomingOffset)
+        events |= VIR_STREAM_EVENT_READABLE;
+    if (privst->cb &&
+        (privst->cbEvents & VIR_STREAM_EVENT_WRITABLE))
+        events |= VIR_STREAM_EVENT_WRITABLE;
+    VIR_DEBUG("Got Timer dispatch %d %d offset=%d", events, privst->cbEvents, privst->incomingOffset);
+    if (events) {
         virStreamEventCallback cb = privst->cb;
         void *cbOpaque = privst->cbOpaque;
         virFreeCallback cbFree = privst->cbFree;
 
         privst->cbDispatch = 1;
         remoteDriverUnlock(priv);
-        (cb)(st, VIR_STREAM_EVENT_READABLE, cbOpaque);
+        (cb)(st, events, cbOpaque);
         remoteDriverLock(priv);
         privst->cbDispatch = 0;
 
         if (!privst->cb && cbFree)
             (cbFree)(cbOpaque);
     }
+
     remoteDriverUnlock(priv);
 }
 
@@ -8465,12 +8479,6 @@ remoteStreamEventAddCallback(virStreamPtr st,
 
     remoteDriverLock(priv);
 
-    if (events & ~VIR_STREAM_EVENT_READABLE) {
-        remoteError(VIR_ERR_INTERNAL_ERROR,
-                    _("unsupported stream events %d"), events);
-        goto cleanup;
-    }
-
     if (privst->cb) {
         remoteError(VIR_ERR_INTERNAL_ERROR,
                     _("multiple stream callbacks not supported"));
@@ -8492,6 +8500,8 @@ remoteStreamEventAddCallback(virStreamPtr st,
     privst->cbFree = ff;
     privst->cbEvents = events;
 
+    remoteStreamEventTimerUpdate(privst);
+
     ret = 0;
 
 cleanup:
@@ -8509,12 +8519,6 @@ remoteStreamEventUpdateCallback(virStreamPtr st,
 
     remoteDriverLock(priv);
 
-    if (events & ~VIR_STREAM_EVENT_READABLE) {
-        remoteError(VIR_ERR_INTERNAL_ERROR,
-                    _("unsupported stream events %d"), events);
-        goto cleanup;
-    }
-
     if (!privst->cb) {
         remoteError(VIR_ERR_INTERNAL_ERROR,
                     _("no stream callback registered"));
@@ -9196,6 +9200,46 @@ done:
 }
 
 
+static int
+remoteDomainOpenConsole(virDomainPtr dom,
+                        const char *devname,
+                        virStreamPtr st,
+                        unsigned int flags)
+{
+    struct private_data *priv = dom->conn->privateData;
+    struct private_stream_data *privst = NULL;
+    int rv = -1;
+    remote_domain_open_console_args args;
+
+    remoteDriverLock(priv);
+
+    if (!(privst = remoteStreamOpen(st, 1, REMOTE_PROC_DOMAIN_OPEN_CONSOLE, priv->counter)))
+        goto done;
+
+    st->driver = &remoteStreamDrv;
+    st->privateData = privst;
+
+    make_nonnull_domain (&args.domain, dom);
+    args.devname = devname ? (char **)&devname : NULL;
+    args.flags = flags;
+
+    if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_OPEN_CONSOLE,
+             (xdrproc_t) xdr_remote_domain_open_console_args, (char *) &args,
+             (xdrproc_t) xdr_void, NULL) == -1) {
+        remoteStreamRelease(st);
+        goto done;
+    }
+
+    rv = 0;
+
+done:
+    remoteDriverUnlock(priv);
+
+    return rv;
+
+}
+
+
 /*----------------------------------------------------------------------*/
 
 static int
@@ -10691,7 +10735,7 @@ static virDriver remote_driver = {
     remoteQemuDomainMonitorCommand, /* qemuDomainMonitorCommand */
     remoteDomainSetMemoryParameters, /* domainSetMemoryParameters */
     remoteDomainGetMemoryParameters, /* domainGetMemoryParameters */
-    NULL, /* domainOpenConsole */
+    remoteDomainOpenConsole, /* domainOpenConsole */
 };
 
 static virNetworkDriver network_driver = {
index 38ea050eb41384c5c73f8ec081d357c6d81a6c87..41f5e7d7fb5ae62875bf827811b4733a63aba90e 100644 (file)
@@ -3708,6 +3708,19 @@ xdr_remote_domain_snapshot_delete_args (XDR *xdrs, remote_domain_snapshot_delete
         return TRUE;
 }
 
+bool_t
+xdr_remote_domain_open_console_args (XDR *xdrs, remote_domain_open_console_args *objp)
+{
+
+         if (!xdr_remote_nonnull_domain (xdrs, &objp->domain))
+                 return FALSE;
+         if (!xdr_remote_string (xdrs, &objp->devname))
+                 return FALSE;
+         if (!xdr_u_int (xdrs, &objp->flags))
+                 return FALSE;
+        return TRUE;
+}
+
 bool_t
 xdr_remote_procedure (XDR *xdrs, remote_procedure *objp)
 {
index d75e76c629fab8c18c886ee91094c959e910884f..8dc89a50fd9713c29c24436596718792c1772403 100644 (file)
@@ -2097,6 +2097,13 @@ struct remote_domain_snapshot_delete_args {
         int flags;
 };
 typedef struct remote_domain_snapshot_delete_args remote_domain_snapshot_delete_args;
+
+struct remote_domain_open_console_args {
+        remote_nonnull_domain domain;
+        remote_string devname;
+        u_int flags;
+};
+typedef struct remote_domain_open_console_args remote_domain_open_console_args;
 #define REMOTE_PROGRAM 0x20008086
 #define REMOTE_PROTOCOL_VERSION 1
 
@@ -2301,6 +2308,7 @@ enum remote_procedure {
         REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
         REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199,
         REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200,
+        REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201,
 };
 typedef enum remote_procedure remote_procedure;
 
@@ -2670,6 +2678,7 @@ extern  bool_t xdr_remote_domain_snapshot_current_args (XDR *, remote_domain_sna
 extern  bool_t xdr_remote_domain_snapshot_current_ret (XDR *, remote_domain_snapshot_current_ret*);
 extern  bool_t xdr_remote_domain_revert_to_snapshot_args (XDR *, remote_domain_revert_to_snapshot_args*);
 extern  bool_t xdr_remote_domain_snapshot_delete_args (XDR *, remote_domain_snapshot_delete_args*);
+extern  bool_t xdr_remote_domain_open_console_args (XDR *, remote_domain_open_console_args*);
 extern  bool_t xdr_remote_procedure (XDR *, remote_procedure*);
 extern  bool_t xdr_remote_message_type (XDR *, remote_message_type*);
 extern  bool_t xdr_remote_message_status (XDR *, remote_message_status*);
@@ -3013,6 +3022,7 @@ extern bool_t xdr_remote_domain_snapshot_current_args ();
 extern bool_t xdr_remote_domain_snapshot_current_ret ();
 extern bool_t xdr_remote_domain_revert_to_snapshot_args ();
 extern bool_t xdr_remote_domain_snapshot_delete_args ();
+extern bool_t xdr_remote_domain_open_console_args ();
 extern bool_t xdr_remote_procedure ();
 extern bool_t xdr_remote_message_type ();
 extern bool_t xdr_remote_message_status ();
index d57e6d0a56e688e8ee74f2fc0033521d1a26cc28..e84afe52c5bdc738d44cfc0a46c621f473979a4c 100644 (file)
@@ -1853,6 +1853,11 @@ struct remote_domain_snapshot_delete_args {
     int flags;
 };
 
+struct remote_domain_open_console_args {
+    remote_nonnull_domain domain;
+    remote_string devname;
+    unsigned int flags;
+};
 
 /*----- Protocol. -----*/
 
@@ -2079,7 +2084,9 @@ enum remote_procedure {
     REMOTE_PROC_DOMAIN_SET_MEMORY_PARAMETERS = 197,
     REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
     REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199,
-    REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200
+    REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200,
+
+    REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201
 
     /*
      * Notice how the entries are grouped in sets of 10 ?
index d5058866ecb8f5333fe9379be6850c1c78b7db53..3054bbf7d780352eb38a7c94af3651ed8550b356 100644 (file)
@@ -1352,6 +1352,11 @@ struct remote_domain_snapshot_delete_args {
        remote_nonnull_domain_snapshot snap;
        int                        flags;
 };
+struct remote_domain_open_console_args {
+       remote_nonnull_domain      domain;
+       remote_string              devname;
+       u_int                      flags;
+};
 struct remote_message_header {
        u_int                      prog;
        u_int                      vers;