2011/6/1 Adam Litke <[email protected]>: This commit has a pretty long summary line.
> * src/remote/remote_protocol.x: provide defines for the new entry points > * src/remote/remote_driver.c daemon/remote.c: implement the client and > server side > * daemon/remote_generator.pl: Specify the manually-written functions > > Signed-off-by: Adam Litke <[email protected]> > --- > daemon/remote.c | 71 +++++++++++++++++++++++++++++++++++++++++ > daemon/remote_generator.pl | 8 +++- > src/remote/remote_driver.c | 72 +++++++++++++++++++++++++++++++++++++++-- > src/remote/remote_protocol.x | 44 +++++++++++++++++++++++++- > 4 files changed, 188 insertions(+), 7 deletions(-) > > diff --git a/daemon/remote.c b/daemon/remote.c > index 2220655..f6aa78e 100644 > --- a/daemon/remote.c > +++ b/daemon/remote.c > @@ -1692,6 +1692,77 @@ no_memory: > goto cleanup; > } > > +static int > +remoteDispatchDomainBlockPull(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_block_pull_args *args, > + remote_domain_block_pull_ret *ret) > +{ > + virDomainPtr dom = NULL; > + virDomainBlockPullInfo tmp; > + 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 (virDomainBlockPull(dom, args->path, &tmp, args->flags) < 0) > + goto cleanup; > + rv = 0; > + ret->info.cur = tmp.cur; > + ret->info.end = tmp.end; > + > +cleanup: > + if (rv < 0) > + remoteDispatchError(rerr); > + if (dom) > + virDomainFree(dom); > + return rv; > +} > + > +static int > +remoteDispatchDomainGetBlockPullInfo(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_get_block_pull_info_args > *args, > + remote_domain_get_block_pull_info_ret > *ret) > +{ > + virDomainPtr dom = NULL; > + virDomainBlockPullInfo tmp; > + 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 (virDomainGetBlockPullInfo(dom, args->path, &tmp, args->flags) < 0) > + goto cleanup; > + rv = 0; > + ret->info.cur = tmp.cur; > + ret->info.end = tmp.end; > + > +cleanup: > + if (rv < 0) > + remoteDispatchError(rerr); > + if (dom) > + virDomainFree(dom); > + return rv; > +} The generator should be able to deal with this. I might have to tweak it to handle multi-return-value procedures more general. > > static int > diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl > index 062ccc1..d7e0383 100755 > --- a/daemon/remote_generator.pl > +++ b/daemon/remote_generator.pl > @@ -278,7 +278,9 @@ elsif ($opt_b) { > "GetType", > "NodeDeviceGetParent", > "NodeGetSecurityModel", > - "SecretGetValue"); > + "SecretGetValue", > + "DomainBlockPull", > + "DomainGetBlockPullInfo"); > } elsif ($structprefix eq "qemu") { > @ungeneratable = ("MonitorCommand"); > } > @@ -779,7 +781,9 @@ elsif ($opt_k) { > "GetType", > "NodeDeviceGetParent", > "NodeGetSecurityModel", > - "SecretGetValue"); > + "SecretGetValue", > + "DomainBlockPull", > + "DomainGetBlockPullInfo"); > } elsif ($structprefix eq "qemu") { > @ungeneratable = ("MonitorCommand"); > } You need to rebase your series to git head as the generator has changed much recently. > diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c > index 07bc629..0a885a9 100644 > --- a/src/remote/remote_driver.c > +++ b/src/remote/remote_driver.c > @@ -2844,6 +2844,70 @@ done: > return rv; > } > > +static int remoteDomainBlockPull(virDomainPtr domain, > + const char *path, > + virDomainBlockPullInfoPtr info, > + unsigned int flags) > +{ > + int rv = -1; > + remote_domain_block_pull_args args; > + remote_domain_block_pull_ret ret; > + struct private_data *priv = domain->conn->privateData; > + > + remoteDriverLock(priv); > + > + make_nonnull_domain(&args.dom, domain); > + args.path = (char *)path; > + args.flags = flags; > + > + if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_BLOCK_PULL, > + (xdrproc_t)xdr_remote_domain_block_pull_args, (char *)&args, > + (xdrproc_t)xdr_remote_domain_block_pull_ret, (char *)&ret) == > -1) > + goto done; > + > + if (info) { > + info->cur = ret.info.cur; > + info->end = ret.info.end; > + } > + rv = 0; > + > +done: > + remoteDriverUnlock(priv); > + return rv; > +} > + > +static int remoteDomainGetBlockPullInfo(virDomainPtr domain, > + const char *path, > + virDomainBlockPullInfoPtr info, > + unsigned int flags) > +{ > + int rv = -1; > + remote_domain_get_block_pull_info_args args; > + remote_domain_get_block_pull_info_ret ret; > + struct private_data *priv = domain->conn->privateData; > + > + remoteDriverLock(priv); > + > + make_nonnull_domain(&args.dom, domain); > + args.path = (char *)path; > + args.flags = flags; > + > + if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_GET_BLOCK_PULL_INFO, > + (xdrproc_t)xdr_remote_domain_get_block_pull_info_args, > + (char *)&args, > + (xdrproc_t)xdr_remote_domain_get_block_pull_info_ret, > + (char *)&ret) == -1) > + goto done; > + > + info->cur = ret.info.cur; > + info->end = ret.info.end; > + rv = 0; > + > +done: > + remoteDriverUnlock(priv); > + return rv; > +} This should be generatable as well. > > static virDrvOpenStatus ATTRIBUTE_NONNULL (1) > @@ -6493,10 +6557,10 @@ static virDriver remote_driver = { > remoteDomainSnapshotDelete, /* domainSnapshotDelete */ > remoteQemuDomainMonitorCommand, /* qemuDomainMonitorCommand */ > remoteDomainOpenConsole, /* domainOpenConsole */ > - NULL, /* domainBlockPull */ > - NULL, /* domainBlockPullAll */ > - NULL, /* domainBlockPullAbort */ > - NULL, /* domainGetBlockPullInfo */ > + remoteDomainBlockPull, /* domainBlockPull */ > + remoteDomainBlockPullAll, /* domainBlockPullAll */ > + remoteDomainBlockPullAbort, /* domainBlockPullAbort */ > + remoteDomainGetBlockPullInfo, /* domainGetBlockPullInfo */ > }; Again, you need to rebase this, this was changed to named C99 initializers recently. Yes, libvirt is a fast moving target :) > static virNetworkDriver network_driver = { > diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x > index c706c36..2f52ceb 100644 > --- a/src/remote/remote_protocol.x > +++ b/src/remote/remote_protocol.x > @@ -917,6 +917,43 @@ struct remote_domain_set_autostart_args { > int autostart; > }; > > +struct remote_domain_block_pull_info { > + unsigned hyper cur; > + unsigned hyper end; > +}; > + > +struct remote_domain_block_pull_args { > + remote_nonnull_domain dom; > + remote_nonnull_string path; > + unsigned int flags; > +}; > + > +struct remote_domain_block_pull_ret { > + remote_domain_block_pull_info info; > +}; > + > +struct remote_domain_block_pull_all_args { > + remote_nonnull_domain dom; > + remote_nonnull_string path; > + unsigned int flags; > +}; > + > +struct remote_domain_block_pull_abort_args { > + remote_nonnull_domain dom; > + remote_nonnull_string path; > + unsigned int flags; > +}; > + > +struct remote_domain_get_block_pull_info_args { > + remote_nonnull_domain dom; > + remote_nonnull_string path; > + unsigned int flags; > +}; > + > +struct remote_domain_get_block_pull_info_ret { > + remote_domain_block_pull_info info; > +}; > + > /* Network calls: */ > > struct remote_num_of_networks_ret { > @@ -2176,7 +2213,12 @@ enum remote_procedure { > REMOTE_PROC_DOMAIN_GET_BLKIO_PARAMETERS = 206, > REMOTE_PROC_DOMAIN_MIGRATE_SET_MAX_SPEED = 207, > REMOTE_PROC_STORAGE_VOL_UPLOAD = 208, > - REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209 > + REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209, > + REMOTE_PROC_DOMAIN_BLOCK_PULL = 210, > + > + REMOTE_PROC_DOMAIN_BLOCK_PULL_ALL = 211, > + REMOTE_PROC_DOMAIN_BLOCK_PULL_ABORT = 212, > + REMOTE_PROC_DOMAIN_GET_BLOCK_PULL_INFO = 213 Annotations for the generator go here. I also miss corresponding updates to src/remote_protocol-structs. Matthias -- libvir-list mailing list [email protected] https://www.redhat.com/mailman/listinfo/libvir-list
