mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
Remote driver client and server for virDomainOpenConsole
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
This commit is contained in:
parent
88a9b382c6
commit
73d8b03cda
@ -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. -----*/
|
/*----- Helpers. -----*/
|
||||||
|
|
||||||
/* get_nonnull_domain and get_nonnull_network turn an on-wire
|
/* get_nonnull_domain and get_nonnull_network turn an on-wire
|
||||||
|
@ -169,3 +169,4 @@
|
|||||||
remote_domain_get_memory_parameters_args val_remote_domain_get_memory_parameters_args;
|
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_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_get_vcpus_flags_args val_remote_domain_get_vcpus_flags_args;
|
||||||
|
remote_domain_open_console_args val_remote_domain_open_console_args;
|
||||||
|
@ -466,6 +466,14 @@ static int remoteDispatchDomainMigrateSetMaxDowntime(
|
|||||||
remote_error *err,
|
remote_error *err,
|
||||||
remote_domain_migrate_set_max_downtime_args *args,
|
remote_domain_migrate_set_max_downtime_args *args,
|
||||||
void *ret);
|
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(
|
static int remoteDispatchDomainPinVcpu(
|
||||||
struct qemud_server *server,
|
struct qemud_server *server,
|
||||||
struct qemud_client *client,
|
struct qemud_client *client,
|
||||||
|
@ -1007,3 +1007,8 @@
|
|||||||
.args_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_args,
|
.args_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_args,
|
||||||
.ret_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_ret,
|
.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,
|
||||||
|
},
|
||||||
|
@ -8152,11 +8152,16 @@ remoteStreamEventTimerUpdate(struct private_stream_data *privst)
|
|||||||
if (!privst->cb)
|
if (!privst->cb)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!privst->cbEvents)
|
VIR_DEBUG("Check timer offset=%d %d", privst->incomingOffset, privst->cbEvents);
|
||||||
virEventUpdateTimeout(privst->cbTimer, -1);
|
if ((privst->incomingOffset &&
|
||||||
else if (privst->incoming &&
|
(privst->cbEvents & VIR_STREAM_EVENT_READABLE)) ||
|
||||||
(privst->cbEvents & VIR_STREAM_EVENT_READABLE))
|
(privst->cbEvents & VIR_STREAM_EVENT_WRITABLE)) {
|
||||||
|
VIR_DEBUG0("Enabling event timer");
|
||||||
virEventUpdateTimeout(privst->cbTimer, 0);
|
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;
|
virStreamPtr st = opaque;
|
||||||
struct private_data *priv = st->conn->privateData;
|
struct private_data *priv = st->conn->privateData;
|
||||||
struct private_stream_data *privst = st->privateData;
|
struct private_stream_data *privst = st->privateData;
|
||||||
|
int events = 0;
|
||||||
|
|
||||||
remoteDriverLock(priv);
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
if (privst->cb &&
|
if (privst->cb &&
|
||||||
(privst->cbEvents & VIR_STREAM_EVENT_READABLE) &&
|
(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;
|
virStreamEventCallback cb = privst->cb;
|
||||||
void *cbOpaque = privst->cbOpaque;
|
void *cbOpaque = privst->cbOpaque;
|
||||||
virFreeCallback cbFree = privst->cbFree;
|
virFreeCallback cbFree = privst->cbFree;
|
||||||
|
|
||||||
privst->cbDispatch = 1;
|
privst->cbDispatch = 1;
|
||||||
remoteDriverUnlock(priv);
|
remoteDriverUnlock(priv);
|
||||||
(cb)(st, VIR_STREAM_EVENT_READABLE, cbOpaque);
|
(cb)(st, events, cbOpaque);
|
||||||
remoteDriverLock(priv);
|
remoteDriverLock(priv);
|
||||||
privst->cbDispatch = 0;
|
privst->cbDispatch = 0;
|
||||||
|
|
||||||
if (!privst->cb && cbFree)
|
if (!privst->cb && cbFree)
|
||||||
(cbFree)(cbOpaque);
|
(cbFree)(cbOpaque);
|
||||||
}
|
}
|
||||||
|
|
||||||
remoteDriverUnlock(priv);
|
remoteDriverUnlock(priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8465,12 +8479,6 @@ remoteStreamEventAddCallback(virStreamPtr st,
|
|||||||
|
|
||||||
remoteDriverLock(priv);
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
if (events & ~VIR_STREAM_EVENT_READABLE) {
|
|
||||||
remoteError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("unsupported stream events %d"), events);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (privst->cb) {
|
if (privst->cb) {
|
||||||
remoteError(VIR_ERR_INTERNAL_ERROR,
|
remoteError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("multiple stream callbacks not supported"));
|
_("multiple stream callbacks not supported"));
|
||||||
@ -8492,6 +8500,8 @@ remoteStreamEventAddCallback(virStreamPtr st,
|
|||||||
privst->cbFree = ff;
|
privst->cbFree = ff;
|
||||||
privst->cbEvents = events;
|
privst->cbEvents = events;
|
||||||
|
|
||||||
|
remoteStreamEventTimerUpdate(privst);
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
@ -8509,12 +8519,6 @@ remoteStreamEventUpdateCallback(virStreamPtr st,
|
|||||||
|
|
||||||
remoteDriverLock(priv);
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
if (events & ~VIR_STREAM_EVENT_READABLE) {
|
|
||||||
remoteError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("unsupported stream events %d"), events);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!privst->cb) {
|
if (!privst->cb) {
|
||||||
remoteError(VIR_ERR_INTERNAL_ERROR,
|
remoteError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("no stream callback registered"));
|
_("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
|
static int
|
||||||
@ -10691,7 +10735,7 @@ static virDriver remote_driver = {
|
|||||||
remoteQemuDomainMonitorCommand, /* qemuDomainMonitorCommand */
|
remoteQemuDomainMonitorCommand, /* qemuDomainMonitorCommand */
|
||||||
remoteDomainSetMemoryParameters, /* domainSetMemoryParameters */
|
remoteDomainSetMemoryParameters, /* domainSetMemoryParameters */
|
||||||
remoteDomainGetMemoryParameters, /* domainGetMemoryParameters */
|
remoteDomainGetMemoryParameters, /* domainGetMemoryParameters */
|
||||||
NULL, /* domainOpenConsole */
|
remoteDomainOpenConsole, /* domainOpenConsole */
|
||||||
};
|
};
|
||||||
|
|
||||||
static virNetworkDriver network_driver = {
|
static virNetworkDriver network_driver = {
|
||||||
|
@ -3708,6 +3708,19 @@ xdr_remote_domain_snapshot_delete_args (XDR *xdrs, remote_domain_snapshot_delete
|
|||||||
return TRUE;
|
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
|
bool_t
|
||||||
xdr_remote_procedure (XDR *xdrs, remote_procedure *objp)
|
xdr_remote_procedure (XDR *xdrs, remote_procedure *objp)
|
||||||
{
|
{
|
||||||
|
@ -2097,6 +2097,13 @@ struct remote_domain_snapshot_delete_args {
|
|||||||
int flags;
|
int flags;
|
||||||
};
|
};
|
||||||
typedef struct remote_domain_snapshot_delete_args remote_domain_snapshot_delete_args;
|
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_PROGRAM 0x20008086
|
||||||
#define REMOTE_PROTOCOL_VERSION 1
|
#define REMOTE_PROTOCOL_VERSION 1
|
||||||
|
|
||||||
@ -2301,6 +2308,7 @@ enum remote_procedure {
|
|||||||
REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
|
REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
|
||||||
REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199,
|
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,
|
||||||
};
|
};
|
||||||
typedef enum remote_procedure remote_procedure;
|
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_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_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_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_procedure (XDR *, remote_procedure*);
|
||||||
extern bool_t xdr_remote_message_type (XDR *, remote_message_type*);
|
extern bool_t xdr_remote_message_type (XDR *, remote_message_type*);
|
||||||
extern bool_t xdr_remote_message_status (XDR *, remote_message_status*);
|
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_snapshot_current_ret ();
|
||||||
extern bool_t xdr_remote_domain_revert_to_snapshot_args ();
|
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_snapshot_delete_args ();
|
||||||
|
extern bool_t xdr_remote_domain_open_console_args ();
|
||||||
extern bool_t xdr_remote_procedure ();
|
extern bool_t xdr_remote_procedure ();
|
||||||
extern bool_t xdr_remote_message_type ();
|
extern bool_t xdr_remote_message_type ();
|
||||||
extern bool_t xdr_remote_message_status ();
|
extern bool_t xdr_remote_message_status ();
|
||||||
|
@ -1853,6 +1853,11 @@ struct remote_domain_snapshot_delete_args {
|
|||||||
int flags;
|
int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct remote_domain_open_console_args {
|
||||||
|
remote_nonnull_domain domain;
|
||||||
|
remote_string devname;
|
||||||
|
unsigned int flags;
|
||||||
|
};
|
||||||
|
|
||||||
/*----- Protocol. -----*/
|
/*----- Protocol. -----*/
|
||||||
|
|
||||||
@ -2079,7 +2084,9 @@ enum remote_procedure {
|
|||||||
REMOTE_PROC_DOMAIN_SET_MEMORY_PARAMETERS = 197,
|
REMOTE_PROC_DOMAIN_SET_MEMORY_PARAMETERS = 197,
|
||||||
REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
|
REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
|
||||||
REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199,
|
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 ?
|
* Notice how the entries are grouped in sets of 10 ?
|
||||||
|
@ -1352,6 +1352,11 @@ struct remote_domain_snapshot_delete_args {
|
|||||||
remote_nonnull_domain_snapshot snap;
|
remote_nonnull_domain_snapshot snap;
|
||||||
int flags;
|
int flags;
|
||||||
};
|
};
|
||||||
|
struct remote_domain_open_console_args {
|
||||||
|
remote_nonnull_domain domain;
|
||||||
|
remote_string devname;
|
||||||
|
u_int flags;
|
||||||
|
};
|
||||||
struct remote_message_header {
|
struct remote_message_header {
|
||||||
u_int prog;
|
u_int prog;
|
||||||
u_int vers;
|
u_int vers;
|
||||||
|
Loading…
Reference in New Issue
Block a user