mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
Remote driver implementation of new migration API
* src/remote/remote_protocol.x: Define wire protocol for migration protocol v3 * daemon/remote.c: Server side dispatch * src/remote/remote_driver.c: Client side serialization * src/remote/remote_protocol.c, src/remote/remote_protocol.h, daemon/remote_dispatch_args.h, daemon/remote_dispatch_prototypes.h, daemon/remote_dispatch_ret.h, daemon/remote_dispatch_table.h: Re-generate files * src/remote_protocol-structs: Declare new ABIs
This commit is contained in:
parent
65043d2dff
commit
d59e14a1a2
315
daemon/remote.c
315
daemon/remote.c
@ -76,6 +76,7 @@ static virStorageVolPtr get_nonnull_storage_vol(virConnectPtr conn, remote_nonnu
|
|||||||
static virSecretPtr get_nonnull_secret(virConnectPtr conn, remote_nonnull_secret secret);
|
static virSecretPtr get_nonnull_secret(virConnectPtr conn, remote_nonnull_secret secret);
|
||||||
static virNWFilterPtr get_nonnull_nwfilter(virConnectPtr conn, remote_nonnull_nwfilter nwfilter);
|
static virNWFilterPtr get_nonnull_nwfilter(virConnectPtr conn, remote_nonnull_nwfilter nwfilter);
|
||||||
static virDomainSnapshotPtr get_nonnull_domain_snapshot(virDomainPtr dom, remote_nonnull_domain_snapshot snapshot);
|
static virDomainSnapshotPtr get_nonnull_domain_snapshot(virDomainPtr dom, remote_nonnull_domain_snapshot snapshot);
|
||||||
|
static int make_domain(remote_domain *dom_dst, virDomainPtr dom_src);
|
||||||
static void make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainPtr dom_src);
|
static void make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainPtr dom_src);
|
||||||
static void make_nonnull_network(remote_nonnull_network *net_dst, virNetworkPtr net_src);
|
static void make_nonnull_network(remote_nonnull_network *net_dst, virNetworkPtr net_src);
|
||||||
static void make_nonnull_interface(remote_nonnull_interface *interface_dst, virInterfacePtr interface_src);
|
static void make_nonnull_interface(remote_nonnull_interface *interface_dst, virInterfacePtr interface_src);
|
||||||
@ -3079,6 +3080,305 @@ cleanup:
|
|||||||
#include "qemu_dispatch_bodies.h"
|
#include "qemu_dispatch_bodies.h"
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDispatchDomainMigrateBegin3(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||||
|
struct qemud_client *client ATTRIBUTE_UNUSED,
|
||||||
|
virConnectPtr conn,
|
||||||
|
remote_message_header *hdr ATTRIBUTE_UNUSED,
|
||||||
|
remote_error *rerr,
|
||||||
|
remote_domain_migrate_begin3_args *args,
|
||||||
|
remote_domain_migrate_begin3_ret *ret)
|
||||||
|
{
|
||||||
|
char *xml = NULL;
|
||||||
|
virDomainPtr dom = NULL;
|
||||||
|
char *dname;
|
||||||
|
char *cookieout = NULL;
|
||||||
|
int cookieoutlen = 0;
|
||||||
|
int rv = -1;
|
||||||
|
|
||||||
|
if (!conn) {
|
||||||
|
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dom = get_nonnull_domain(conn, args->dom)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
dname = args->dname == NULL ? NULL : *args->dname;
|
||||||
|
|
||||||
|
if (!(xml = virDomainMigrateBegin3(dom,
|
||||||
|
&cookieout, &cookieoutlen,
|
||||||
|
args->flags, dname, args->resource)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* remoteDispatchClientRequest will free cookie and
|
||||||
|
* the xml string if there is one.
|
||||||
|
*/
|
||||||
|
ret->cookie_out.cookie_out_len = cookieoutlen;
|
||||||
|
ret->cookie_out.cookie_out_val = cookieout;
|
||||||
|
ret->xml = xml;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0)
|
||||||
|
remoteDispatchError(rerr);
|
||||||
|
if (dom)
|
||||||
|
virDomainFree(dom);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDispatchDomainMigratePrepare3(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||||
|
struct qemud_client *client ATTRIBUTE_UNUSED,
|
||||||
|
virConnectPtr conn,
|
||||||
|
remote_message_header *hdr ATTRIBUTE_UNUSED,
|
||||||
|
remote_error *rerr,
|
||||||
|
remote_domain_migrate_prepare3_args *args,
|
||||||
|
remote_domain_migrate_prepare3_ret *ret)
|
||||||
|
{
|
||||||
|
char *cookieout = NULL;
|
||||||
|
int cookieoutlen = 0;
|
||||||
|
char *uri_in;
|
||||||
|
char **uri_out;
|
||||||
|
char *dname;
|
||||||
|
int rv = -1;
|
||||||
|
|
||||||
|
if (!conn) {
|
||||||
|
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
uri_in = args->uri_in == NULL ? NULL : *args->uri_in;
|
||||||
|
dname = args->dname == NULL ? NULL : *args->dname;
|
||||||
|
|
||||||
|
/* Wacky world of XDR ... */
|
||||||
|
if (VIR_ALLOC(uri_out) < 0) {
|
||||||
|
virReportOOMError();
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virDomainMigratePrepare3(conn,
|
||||||
|
args->cookie_in.cookie_in_val,
|
||||||
|
args->cookie_in.cookie_in_len,
|
||||||
|
&cookieout, &cookieoutlen,
|
||||||
|
uri_in, uri_out,
|
||||||
|
args->flags, dname, args->resource,
|
||||||
|
args->dom_xml) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* remoteDispatchClientRequest will free cookie, uri_out and
|
||||||
|
* the string if there is one.
|
||||||
|
*/
|
||||||
|
ret->cookie_out.cookie_out_len = cookieoutlen;
|
||||||
|
ret->cookie_out.cookie_out_val = cookieout;
|
||||||
|
ret->uri_out = *uri_out == NULL ? NULL : uri_out;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0) {
|
||||||
|
remoteDispatchError(rerr);
|
||||||
|
VIR_FREE(uri_out);
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDispatchDomainMigratePrepareTunnel3(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||||
|
struct qemud_client *client,
|
||||||
|
virConnectPtr conn,
|
||||||
|
remote_message_header *hdr,
|
||||||
|
remote_error *rerr,
|
||||||
|
remote_domain_migrate_prepare_tunnel3_args *args,
|
||||||
|
remote_domain_migrate_prepare_tunnel3_ret *ret)
|
||||||
|
{
|
||||||
|
char *dname;
|
||||||
|
char *cookieout = NULL;
|
||||||
|
int cookieoutlen = 0;
|
||||||
|
struct qemud_client_stream *stream = NULL;
|
||||||
|
int rv = -1;
|
||||||
|
|
||||||
|
if (!conn) {
|
||||||
|
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
dname = args->dname == NULL ? NULL : *args->dname;
|
||||||
|
|
||||||
|
if (!(stream = remoteCreateClientStream(conn, hdr))) {
|
||||||
|
virReportOOMError();
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virDomainMigratePrepareTunnel3(conn, stream->st,
|
||||||
|
args->cookie_in.cookie_in_val,
|
||||||
|
args->cookie_in.cookie_in_len,
|
||||||
|
&cookieout, &cookieoutlen,
|
||||||
|
args->flags, dname, args->resource,
|
||||||
|
args->dom_xml) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (remoteAddClientStream(client, stream, 0) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* remoteDispatchClientRequest will free cookie
|
||||||
|
*/
|
||||||
|
ret->cookie_out.cookie_out_len = cookieoutlen;
|
||||||
|
ret->cookie_out.cookie_out_val = cookieout;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0) {
|
||||||
|
remoteDispatchError(rerr);
|
||||||
|
VIR_FREE(cookieout);
|
||||||
|
}
|
||||||
|
if (stream && rv < 0) {
|
||||||
|
virStreamAbort(stream->st);
|
||||||
|
remoteFreeClientStream(client, stream);
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDispatchDomainMigratePerform3(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||||
|
struct qemud_client *client ATTRIBUTE_UNUSED,
|
||||||
|
virConnectPtr conn,
|
||||||
|
remote_message_header *hdr ATTRIBUTE_UNUSED,
|
||||||
|
remote_error *rerr,
|
||||||
|
remote_domain_migrate_perform3_args *args,
|
||||||
|
remote_domain_migrate_perform3_ret *ret)
|
||||||
|
{
|
||||||
|
virDomainPtr dom = NULL;
|
||||||
|
char *dname;
|
||||||
|
char *cookieout = NULL;
|
||||||
|
int cookieoutlen = 0;
|
||||||
|
int rv = -1;
|
||||||
|
|
||||||
|
if (!conn) {
|
||||||
|
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dom = get_nonnull_domain(conn, args->dom)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
dname = args->dname == NULL ? NULL : *args->dname;
|
||||||
|
|
||||||
|
if (virDomainMigratePerform3(dom,
|
||||||
|
args->cookie_in.cookie_in_val,
|
||||||
|
args->cookie_in.cookie_in_len,
|
||||||
|
&cookieout, &cookieoutlen,
|
||||||
|
args->uri,
|
||||||
|
args->flags, dname, args->resource) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* remoteDispatchClientRequest will free cookie
|
||||||
|
*/
|
||||||
|
ret->cookie_out.cookie_out_len = cookieoutlen;
|
||||||
|
ret->cookie_out.cookie_out_val = cookieout;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0)
|
||||||
|
remoteDispatchError(rerr);
|
||||||
|
if (dom)
|
||||||
|
virDomainFree(dom);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDispatchDomainMigrateFinish3(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||||
|
struct qemud_client *client ATTRIBUTE_UNUSED,
|
||||||
|
virConnectPtr conn,
|
||||||
|
remote_message_header *hdr ATTRIBUTE_UNUSED,
|
||||||
|
remote_error *rerr,
|
||||||
|
remote_domain_migrate_finish3_args *args,
|
||||||
|
remote_domain_migrate_finish3_ret *ret)
|
||||||
|
{
|
||||||
|
virDomainPtr dom = NULL;
|
||||||
|
char *cookieout = NULL;
|
||||||
|
int cookieoutlen = 0;
|
||||||
|
int rv = -1;
|
||||||
|
|
||||||
|
if (!conn) {
|
||||||
|
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virDomainMigrateFinish3(conn, args->dname,
|
||||||
|
args->cookie_in.cookie_in_val,
|
||||||
|
args->cookie_in.cookie_in_len,
|
||||||
|
&cookieout, &cookieoutlen,
|
||||||
|
args->uri,
|
||||||
|
args->flags,
|
||||||
|
args->cancelled,
|
||||||
|
&dom) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (dom &&
|
||||||
|
make_domain(&ret->ddom, dom) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* remoteDispatchClientRequest will free cookie
|
||||||
|
*/
|
||||||
|
ret->cookie_out.cookie_out_len = cookieoutlen;
|
||||||
|
ret->cookie_out.cookie_out_val = cookieout;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0) {
|
||||||
|
remoteDispatchError(rerr);
|
||||||
|
VIR_FREE(cookieout);
|
||||||
|
}
|
||||||
|
if (dom)
|
||||||
|
virDomainFree(dom);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDispatchDomainMigrateConfirm3(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||||
|
struct qemud_client *client ATTRIBUTE_UNUSED,
|
||||||
|
virConnectPtr conn,
|
||||||
|
remote_message_header *hdr ATTRIBUTE_UNUSED,
|
||||||
|
remote_error *rerr,
|
||||||
|
remote_domain_migrate_confirm3_args *args,
|
||||||
|
void *ret ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
virDomainPtr dom = NULL;
|
||||||
|
int rv = -1;
|
||||||
|
|
||||||
|
if (!conn) {
|
||||||
|
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dom = get_nonnull_domain(conn, args->dom)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virDomainMigrateConfirm3(dom,
|
||||||
|
args->cookie_in.cookie_in_val,
|
||||||
|
args->cookie_in.cookie_in_len,
|
||||||
|
args->flags, args->cancelled) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0)
|
||||||
|
remoteDispatchError(rerr);
|
||||||
|
if (dom)
|
||||||
|
virDomainFree(dom);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*----- Helpers. -----*/
|
/*----- Helpers. -----*/
|
||||||
|
|
||||||
/* get_nonnull_domain and get_nonnull_network turn an on-wire
|
/* get_nonnull_domain and get_nonnull_network turn an on-wire
|
||||||
@ -3144,6 +3444,21 @@ get_nonnull_domain_snapshot(virDomainPtr dom, remote_nonnull_domain_snapshot sna
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Make remote_nonnull_domain and remote_nonnull_network. */
|
/* Make remote_nonnull_domain and remote_nonnull_network. */
|
||||||
|
static int
|
||||||
|
make_domain(remote_domain *dom_dst, virDomainPtr dom_src)
|
||||||
|
{
|
||||||
|
remote_domain rdom;
|
||||||
|
if (VIR_ALLOC(rdom) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
rdom->id = dom_src->id;
|
||||||
|
rdom->name = strdup(dom_src->name);
|
||||||
|
memcpy(rdom->uuid, dom_src->uuid, VIR_UUID_BUFLEN);
|
||||||
|
|
||||||
|
*dom_dst = rdom;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainPtr dom_src)
|
make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainPtr dom_src)
|
||||||
{
|
{
|
||||||
|
@ -238,6 +238,7 @@ static int remoteAuthPolkit (virConnectPtr conn, struct private_data *priv, int
|
|||||||
virReportErrorHelper(VIR_FROM_REMOTE, code, __FILE__, \
|
virReportErrorHelper(VIR_FROM_REMOTE, code, __FILE__, \
|
||||||
__FUNCTION__, __LINE__, __VA_ARGS__)
|
__FUNCTION__, __LINE__, __VA_ARGS__)
|
||||||
|
|
||||||
|
static virDomainPtr get_domain (virConnectPtr conn, remote_domain domain);
|
||||||
static virDomainPtr get_nonnull_domain (virConnectPtr conn, remote_nonnull_domain domain);
|
static virDomainPtr get_nonnull_domain (virConnectPtr conn, remote_nonnull_domain domain);
|
||||||
static virNetworkPtr get_nonnull_network (virConnectPtr conn, remote_nonnull_network network);
|
static virNetworkPtr get_nonnull_network (virConnectPtr conn, remote_nonnull_network network);
|
||||||
static virNWFilterPtr get_nonnull_nwfilter (virConnectPtr conn, remote_nonnull_nwfilter nwfilter);
|
static virNWFilterPtr get_nonnull_nwfilter (virConnectPtr conn, remote_nonnull_nwfilter nwfilter);
|
||||||
@ -4991,9 +4992,350 @@ done:
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
remoteDomainMigrateBegin3(virDomainPtr domain,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
unsigned long flags,
|
||||||
|
const char *dname,
|
||||||
|
unsigned long resource)
|
||||||
|
{
|
||||||
|
char *rv = NULL;
|
||||||
|
remote_domain_migrate_begin3_args args;
|
||||||
|
remote_domain_migrate_begin3_ret ret;
|
||||||
|
struct private_data *priv = domain->conn->privateData;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
memset(&ret, 0, sizeof(ret));
|
||||||
|
|
||||||
|
make_nonnull_domain (&args.dom, domain);
|
||||||
|
args.flags = flags;
|
||||||
|
args.dname = dname == NULL ? NULL : (char **) &dname;
|
||||||
|
args.resource = resource;
|
||||||
|
|
||||||
|
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_BEGIN3,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_begin3_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_begin3_ret, (char *) &ret) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
if (ret.cookie_out.cookie_out_len > 0) {
|
||||||
|
if (!cookieout || !cookieoutlen) {
|
||||||
|
remoteError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores cookieout or cookieoutlen"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*cookieout = ret.cookie_out.cookie_out_val; /* Caller frees. */
|
||||||
|
*cookieoutlen = ret.cookie_out.cookie_out_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = ret.xml; /* caller frees */
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(ret.cookie_out.cookie_out_val);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDomainMigratePrepare3(virConnectPtr dconn,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
const char *uri_in,
|
||||||
|
char **uri_out,
|
||||||
|
unsigned long flags,
|
||||||
|
const char *dname,
|
||||||
|
unsigned long resource,
|
||||||
|
const char *dom_xml)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
remote_domain_migrate_prepare3_args args;
|
||||||
|
remote_domain_migrate_prepare3_ret ret;
|
||||||
|
struct private_data *priv = dconn->privateData;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
memset(&ret, 0, sizeof(ret));
|
||||||
|
|
||||||
|
args.cookie_in.cookie_in_val = (char *)cookiein;
|
||||||
|
args.cookie_in.cookie_in_len = cookieinlen;
|
||||||
|
args.uri_in = uri_in == NULL ? NULL : (char **) &uri_in;
|
||||||
|
args.flags = flags;
|
||||||
|
args.dname = dname == NULL ? NULL : (char **) &dname;
|
||||||
|
args.resource = resource;
|
||||||
|
args.dom_xml = (char *) dom_xml;
|
||||||
|
|
||||||
|
memset (&ret, 0, sizeof ret);
|
||||||
|
if (call (dconn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE3,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_prepare3_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_prepare3_ret, (char *) &ret) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
if (ret.cookie_out.cookie_out_len > 0) {
|
||||||
|
if (!cookieout || !cookieoutlen) {
|
||||||
|
remoteError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores cookieout or cookieoutlen"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*cookieout = ret.cookie_out.cookie_out_val; /* Caller frees. */
|
||||||
|
*cookieoutlen = ret.cookie_out.cookie_out_len;
|
||||||
|
}
|
||||||
|
if (ret.uri_out) {
|
||||||
|
if (!uri_out) {
|
||||||
|
remoteError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores uri_out"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*uri_out = *ret.uri_out; /* Caller frees. */
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
error:
|
||||||
|
VIR_FREE(ret.cookie_out.cookie_out_val);
|
||||||
|
if (ret.uri_out)
|
||||||
|
VIR_FREE(*ret.uri_out);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDomainMigratePrepareTunnel3(virConnectPtr dconn,
|
||||||
|
virStreamPtr st,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
unsigned long flags,
|
||||||
|
const char *dname,
|
||||||
|
unsigned long resource,
|
||||||
|
const char *dom_xml)
|
||||||
|
{
|
||||||
|
struct private_data *priv = dconn->privateData;
|
||||||
|
struct private_stream_data *privst = NULL;
|
||||||
|
int rv = -1;
|
||||||
|
remote_domain_migrate_prepare_tunnel3_args args;
|
||||||
|
remote_domain_migrate_prepare_tunnel3_ret ret;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
memset(&ret, 0, sizeof(ret));
|
||||||
|
|
||||||
|
if (!(privst = remoteStreamOpen(st,
|
||||||
|
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3,
|
||||||
|
priv->counter)))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
st->driver = &remoteStreamDrv;
|
||||||
|
st->privateData = privst;
|
||||||
|
|
||||||
|
args.cookie_in.cookie_in_val = (char *)cookiein;
|
||||||
|
args.cookie_in.cookie_in_len = cookieinlen;
|
||||||
|
args.flags = flags;
|
||||||
|
args.dname = dname == NULL ? NULL : (char **) &dname;
|
||||||
|
args.resource = resource;
|
||||||
|
args.dom_xml = (char *) dom_xml;
|
||||||
|
|
||||||
|
if (call(dconn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel3_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel3_ret, (char *) &ret) == -1) {
|
||||||
|
remoteStreamRelease(st);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret.cookie_out.cookie_out_len > 0) {
|
||||||
|
if (!cookieout || !cookieoutlen) {
|
||||||
|
remoteError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores cookieout or cookieoutlen"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*cookieout = ret.cookie_out.cookie_out_val; /* Caller frees. */
|
||||||
|
*cookieoutlen = ret.cookie_out.cookie_out_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(ret.cookie_out.cookie_out_val);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDomainMigratePerform3(virDomainPtr dom,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
const char *uri,
|
||||||
|
unsigned long flags,
|
||||||
|
const char *dname,
|
||||||
|
unsigned long resource)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
remote_domain_migrate_perform3_args args;
|
||||||
|
remote_domain_migrate_perform3_ret ret;
|
||||||
|
struct private_data *priv = dom->conn->privateData;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
memset(&ret, 0, sizeof(ret));
|
||||||
|
|
||||||
|
make_nonnull_domain(&args.dom, dom);
|
||||||
|
|
||||||
|
args.cookie_in.cookie_in_val = (char *)cookiein;
|
||||||
|
args.cookie_in.cookie_in_len = cookieinlen;
|
||||||
|
args.uri = (char *) uri;
|
||||||
|
args.flags = flags;
|
||||||
|
args.dname = dname == NULL ? NULL : (char **) &dname;
|
||||||
|
args.resource = resource;
|
||||||
|
|
||||||
|
if (call (dom->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PERFORM3,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_perform3_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_perform3_ret, (char *) &ret) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
if (ret.cookie_out.cookie_out_len > 0) {
|
||||||
|
if (!cookieout || !cookieoutlen) {
|
||||||
|
remoteError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores cookieout or cookieoutlen"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*cookieout = ret.cookie_out.cookie_out_val; /* Caller frees. */
|
||||||
|
*cookieoutlen = ret.cookie_out.cookie_out_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(ret.cookie_out.cookie_out_val);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDomainMigrateFinish3(virConnectPtr dconn,
|
||||||
|
const char *dname,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
const char *uri,
|
||||||
|
unsigned long flags,
|
||||||
|
int cancelled,
|
||||||
|
virDomainPtr *ddom)
|
||||||
|
{
|
||||||
|
remote_domain_migrate_finish3_args args;
|
||||||
|
remote_domain_migrate_finish3_ret ret;
|
||||||
|
struct private_data *priv = dconn->privateData;
|
||||||
|
int rv = -1;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
*ddom = NULL;
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
memset(&ret, 0, sizeof(ret));
|
||||||
|
|
||||||
|
args.cookie_in.cookie_in_val = (char *)cookiein;
|
||||||
|
args.cookie_in.cookie_in_len = cookieinlen;
|
||||||
|
args.dname = (char *) dname;
|
||||||
|
args.uri = (char *) uri;
|
||||||
|
args.flags = flags;
|
||||||
|
args.cancelled = cancelled;
|
||||||
|
|
||||||
|
if (call (dconn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_FINISH3,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_finish3_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_finish3_ret, (char *) &ret) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
*ddom = get_domain(dconn, ret.ddom);
|
||||||
|
|
||||||
|
if (ret.cookie_out.cookie_out_len > 0) {
|
||||||
|
if (!cookieout || !cookieoutlen) {
|
||||||
|
remoteError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores cookieout or cookieoutlen"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*cookieout = ret.cookie_out.cookie_out_val; /* Caller frees. */
|
||||||
|
*cookieoutlen = ret.cookie_out.cookie_out_len;
|
||||||
|
ret.cookie_out.cookie_out_val = NULL;
|
||||||
|
ret.cookie_out.cookie_out_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
xdr_free ((xdrproc_t) &xdr_remote_domain_migrate_finish3_ret, (char *) &ret);
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(ret.cookie_out.cookie_out_val);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDomainMigrateConfirm3(virDomainPtr domain,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
unsigned long flags,
|
||||||
|
int cancelled)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
remote_domain_migrate_confirm3_args args;
|
||||||
|
struct private_data *priv = domain->conn->privateData;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
|
||||||
|
make_nonnull_domain (&args.dom, domain);
|
||||||
|
args.cookie_in.cookie_in_len = cookieinlen;
|
||||||
|
args.cookie_in.cookie_in_val = (char *) cookiein;
|
||||||
|
args.flags = flags;
|
||||||
|
args.cancelled = cancelled;
|
||||||
|
|
||||||
|
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_CONFIRM3,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_confirm3_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_void, (char *) NULL) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#include "remote_client_bodies.h"
|
#include "remote_client_bodies.h"
|
||||||
#include "qemu_client_bodies.h"
|
#include "qemu_client_bodies.h"
|
||||||
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
static struct remote_thread_call *
|
static struct remote_thread_call *
|
||||||
@ -6265,6 +6607,22 @@ remoteDomainEventQueue(struct private_data *priv, virDomainEventPtr event)
|
|||||||
virDomainEventStateQueue(priv->domainEventState, event);
|
virDomainEventStateQueue(priv->domainEventState, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get_nonnull_domain and get_nonnull_network turn an on-wire
|
||||||
|
* (name, uuid) pair into virDomainPtr or virNetworkPtr object.
|
||||||
|
* These can return NULL if underlying memory allocations fail,
|
||||||
|
* but if they do then virterror_internal.has been set.
|
||||||
|
*/
|
||||||
|
static virDomainPtr
|
||||||
|
get_domain (virConnectPtr conn, remote_domain domain)
|
||||||
|
{
|
||||||
|
virDomainPtr dom = NULL;
|
||||||
|
if (domain) {
|
||||||
|
dom = virGetDomain (conn, domain->name, BAD_CAST domain->uuid);
|
||||||
|
if (dom) dom->id = domain->id;
|
||||||
|
}
|
||||||
|
return dom;
|
||||||
|
}
|
||||||
|
|
||||||
/* get_nonnull_domain and get_nonnull_network turn an on-wire
|
/* get_nonnull_domain and get_nonnull_network turn an on-wire
|
||||||
* (name, uuid) pair into virDomainPtr or virNetworkPtr object.
|
* (name, uuid) pair into virDomainPtr or virNetworkPtr object.
|
||||||
* These can return NULL if underlying memory allocations fail,
|
* These can return NULL if underlying memory allocations fail,
|
||||||
@ -6510,6 +6868,12 @@ static virDriver remote_driver = {
|
|||||||
.qemuDomainMonitorCommand = remoteQemuDomainMonitorCommand, /* 0.8.3 */
|
.qemuDomainMonitorCommand = remoteQemuDomainMonitorCommand, /* 0.8.3 */
|
||||||
.domainOpenConsole = remoteDomainOpenConsole, /* 0.8.6 */
|
.domainOpenConsole = remoteDomainOpenConsole, /* 0.8.6 */
|
||||||
.domainInjectNMI = remoteDomainInjectNMI, /* 0.9.2 */
|
.domainInjectNMI = remoteDomainInjectNMI, /* 0.9.2 */
|
||||||
|
.domainMigrateBegin3 = remoteDomainMigrateBegin3, /* 0.9.2 */
|
||||||
|
.domainMigratePrepare3 = remoteDomainMigratePrepare3, /* 0.9.2 */
|
||||||
|
.domainMigratePrepareTunnel3 = remoteDomainMigratePrepareTunnel3, /* 0.9.2 */
|
||||||
|
.domainMigratePerform3 = remoteDomainMigratePerform3, /* 0.9.2 */
|
||||||
|
.domainMigrateFinish3 = remoteDomainMigrateFinish3, /* 0.9.2 */
|
||||||
|
.domainMigrateConfirm3 = remoteDomainMigrateConfirm3, /* 0.9.2 */
|
||||||
};
|
};
|
||||||
|
|
||||||
static virNetworkDriver network_driver = {
|
static virNetworkDriver network_driver = {
|
||||||
|
@ -1965,6 +1965,76 @@ struct remote_domain_get_state_ret {
|
|||||||
int reason;
|
int reason;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_begin3_args {
|
||||||
|
remote_nonnull_domain dom;
|
||||||
|
unsigned hyper flags;
|
||||||
|
remote_string dname;
|
||||||
|
unsigned hyper resource;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_begin3_ret {
|
||||||
|
opaque cookie_out<REMOTE_MIGRATE_COOKIE_MAX>;
|
||||||
|
remote_nonnull_string xml;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_prepare3_args {
|
||||||
|
opaque cookie_in<REMOTE_MIGRATE_COOKIE_MAX>;
|
||||||
|
remote_string uri_in;
|
||||||
|
unsigned hyper flags;
|
||||||
|
remote_string dname;
|
||||||
|
unsigned hyper resource;
|
||||||
|
remote_nonnull_string dom_xml;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_prepare3_ret {
|
||||||
|
opaque cookie_out<REMOTE_MIGRATE_COOKIE_MAX>;
|
||||||
|
remote_string uri_out;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_prepare_tunnel3_args {
|
||||||
|
opaque cookie_in<REMOTE_MIGRATE_COOKIE_MAX>;
|
||||||
|
unsigned hyper flags;
|
||||||
|
remote_string dname;
|
||||||
|
unsigned hyper resource;
|
||||||
|
remote_nonnull_string dom_xml;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_prepare_tunnel3_ret {
|
||||||
|
opaque cookie_out<REMOTE_MIGRATE_COOKIE_MAX>;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_perform3_args {
|
||||||
|
remote_nonnull_domain dom;
|
||||||
|
opaque cookie_in<REMOTE_MIGRATE_COOKIE_MAX>;
|
||||||
|
remote_nonnull_string uri;
|
||||||
|
unsigned hyper flags;
|
||||||
|
remote_string dname;
|
||||||
|
unsigned hyper resource;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_perform3_ret {
|
||||||
|
opaque cookie_out<REMOTE_MIGRATE_COOKIE_MAX>;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_finish3_args {
|
||||||
|
remote_nonnull_string dname;
|
||||||
|
opaque cookie_in<REMOTE_MIGRATE_COOKIE_MAX>;
|
||||||
|
remote_nonnull_string uri;
|
||||||
|
unsigned hyper flags;
|
||||||
|
int cancelled;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_finish3_ret {
|
||||||
|
remote_domain ddom;
|
||||||
|
opaque cookie_out<REMOTE_MIGRATE_COOKIE_MAX>;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct remote_domain_migrate_confirm3_args {
|
||||||
|
remote_nonnull_domain dom;
|
||||||
|
opaque cookie_in<REMOTE_MIGRATE_COOKIE_MAX>;
|
||||||
|
unsigned hyper flags;
|
||||||
|
int cancelled;
|
||||||
|
};
|
||||||
|
|
||||||
/*----- Protocol. -----*/
|
/*----- Protocol. -----*/
|
||||||
|
|
||||||
@ -2208,7 +2278,13 @@ enum remote_procedure {
|
|||||||
REMOTE_PROC_DOMAIN_INJECT_NMI = 210, /* autogen autogen */
|
REMOTE_PROC_DOMAIN_INJECT_NMI = 210, /* autogen autogen */
|
||||||
|
|
||||||
REMOTE_PROC_DOMAIN_SCREENSHOT = 211, /* skipgen skipgen */
|
REMOTE_PROC_DOMAIN_SCREENSHOT = 211, /* skipgen skipgen */
|
||||||
REMOTE_PROC_DOMAIN_GET_STATE = 212 /* skipgen skipgen */
|
REMOTE_PROC_DOMAIN_GET_STATE = 212, /* skipgen skipgen */
|
||||||
|
REMOTE_PROC_DOMAIN_MIGRATE_BEGIN3 = 213, /* skipgen skipgen */
|
||||||
|
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE3 = 214, /* skipgen skipgen */
|
||||||
|
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3 = 215, /* skipgen skipgen */
|
||||||
|
REMOTE_PROC_DOMAIN_MIGRATE_PERFORM3 = 216, /* skipgen skipgen */
|
||||||
|
REMOTE_PROC_DOMAIN_MIGRATE_FINISH3 = 217, /* skipgen skipgen */
|
||||||
|
REMOTE_PROC_DOMAIN_MIGRATE_CONFIRM3 = 218 /* skipgen skipgen */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Notice how the entries are grouped in sets of 10 ?
|
* Notice how the entries are grouped in sets of 10 ?
|
||||||
|
@ -1447,6 +1447,96 @@ struct remote_domain_get_state_ret {
|
|||||||
int state;
|
int state;
|
||||||
int reason;
|
int reason;
|
||||||
};
|
};
|
||||||
|
struct remote_domain_migrate_begin3_args {
|
||||||
|
remote_nonnull_domain dom;
|
||||||
|
uint64_t flags;
|
||||||
|
remote_string dname;
|
||||||
|
uint64_t resource;
|
||||||
|
};
|
||||||
|
struct remote_domain_migrate_begin3_ret {
|
||||||
|
struct {
|
||||||
|
u_int cookie_out_len;
|
||||||
|
char * cookie_out_val;
|
||||||
|
} cookie_out;
|
||||||
|
remote_nonnull_string xml;
|
||||||
|
};
|
||||||
|
struct remote_domain_migrate_prepare3_args {
|
||||||
|
struct {
|
||||||
|
u_int cookie_in_len;
|
||||||
|
char * cookie_in_val;
|
||||||
|
} cookie_in;
|
||||||
|
remote_string uri_in;
|
||||||
|
uint64_t flags;
|
||||||
|
remote_string dname;
|
||||||
|
uint64_t resource;
|
||||||
|
remote_nonnull_string dom_xml;
|
||||||
|
};
|
||||||
|
struct remote_domain_migrate_prepare3_ret {
|
||||||
|
struct {
|
||||||
|
u_int cookie_out_len;
|
||||||
|
char * cookie_out_val;
|
||||||
|
} cookie_out;
|
||||||
|
remote_string uri_out;
|
||||||
|
};
|
||||||
|
struct remote_domain_migrate_prepare_tunnel3_args {
|
||||||
|
struct {
|
||||||
|
u_int cookie_in_len;
|
||||||
|
char * cookie_in_val;
|
||||||
|
} cookie_in;
|
||||||
|
uint64_t flags;
|
||||||
|
remote_string dname;
|
||||||
|
uint64_t resource;
|
||||||
|
remote_nonnull_string dom_xml;
|
||||||
|
};
|
||||||
|
struct remote_domain_migrate_prepare_tunnel3_ret {
|
||||||
|
struct {
|
||||||
|
u_int cookie_out_len;
|
||||||
|
char * cookie_out_val;
|
||||||
|
} cookie_out;
|
||||||
|
};
|
||||||
|
struct remote_domain_migrate_perform3_args {
|
||||||
|
remote_nonnull_domain dom;
|
||||||
|
struct {
|
||||||
|
u_int cookie_in_len;
|
||||||
|
char * cookie_in_val;
|
||||||
|
} cookie_in;
|
||||||
|
remote_nonnull_string uri;
|
||||||
|
uint64_t flags;
|
||||||
|
remote_string dname;
|
||||||
|
uint64_t resource;
|
||||||
|
};
|
||||||
|
struct remote_domain_migrate_perform3_ret {
|
||||||
|
struct {
|
||||||
|
u_int cookie_out_len;
|
||||||
|
char * cookie_out_val;
|
||||||
|
} cookie_out;
|
||||||
|
};
|
||||||
|
struct remote_domain_migrate_finish3_args {
|
||||||
|
remote_nonnull_string dname;
|
||||||
|
struct {
|
||||||
|
u_int cookie_in_len;
|
||||||
|
char * cookie_in_val;
|
||||||
|
} cookie_in;
|
||||||
|
remote_nonnull_string uri;
|
||||||
|
uint64_t flags;
|
||||||
|
int cancelled;
|
||||||
|
};
|
||||||
|
struct remote_domain_migrate_finish3_ret {
|
||||||
|
remote_domain ddom;
|
||||||
|
struct {
|
||||||
|
u_int cookie_out_len;
|
||||||
|
char * cookie_out_val;
|
||||||
|
} cookie_out;
|
||||||
|
};
|
||||||
|
struct remote_domain_migrate_confirm3_args {
|
||||||
|
remote_nonnull_domain dom;
|
||||||
|
struct {
|
||||||
|
u_int cookie_in_len;
|
||||||
|
char * cookie_in_val;
|
||||||
|
} cookie_in;
|
||||||
|
uint64_t flags;
|
||||||
|
int cancelled;
|
||||||
|
};
|
||||||
struct remote_message_header {
|
struct remote_message_header {
|
||||||
u_int prog;
|
u_int prog;
|
||||||
u_int vers;
|
u_int vers;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user