[libvirt] [PATCH 2/3] Add RPC implementation for virDomainOpenGraphicsFd
Peter Krempa
pkrempa at redhat.com
Tue Aug 26 16:41:02 UTC 2014
On 08/25/14 20:22, Ján Tomko wrote:
> ---
> daemon/remote.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> src/remote/remote_driver.c | 39 +++++++++++++++++++++++++++++++++++++++
> src/remote/remote_protocol.x | 15 ++++++++++++++-
> src/rpc/virnetmessage.c | 26 ++++++++++++++++++++++++++
> src/rpc/virnetmessage.h | 3 +++
> 5 files changed, 124 insertions(+), 1 deletion(-)
>
> diff --git a/daemon/remote.c b/daemon/remote.c
> index ea16789..bd3b377 100644
> --- a/daemon/remote.c
> +++ b/daemon/remote.c
> @@ -4399,6 +4399,48 @@ remoteDispatchDomainOpenGraphics(virNetServerPtr server ATTRIBUTE_UNUSED,
> }
>
> static int
> +remoteDispatchDomainOpenGraphicsFd(virNetServerPtr server ATTRIBUTE_UNUSED,
> + virNetServerClientPtr client ATTRIBUTE_UNUSED,
> + virNetMessagePtr msg,
> + virNetMessageErrorPtr rerr,
> + remote_domain_open_graphics_fd_args *args)
> +{
> + virDomainPtr dom = NULL;
> + int rv = -1;
> + int fd = -1;
> + struct daemonClientPrivate *priv =
> + virNetServerClientGetPrivateData(client);
> +
> + if (!priv->conn) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
> + goto cleanup;
> + }
> +
> + if (!(dom = get_nonnull_domain(priv->conn, args->dom)))
> + goto cleanup;
> +
> + if (virDomainOpenGraphicsFD(dom,
> + args->idx,
> + &fd,
> + args->flags) < 0)
> + goto cleanup;
> +
> + if (virNetMessageAddFD(msg, fd) < 0)
> + goto cleanup;
> +
> + rv = 1;
1 ? You probably should return 0 here.
> +
> + cleanup:
> + VIR_FORCE_CLOSE(fd);
> + if (rv < 0) {
> + virNetMessageSaveError(rerr);
> + }
> +
> + if (dom)
> + virDomainFree(dom);
> + return rv;
> +}
> +static int
> remoteDispatchDomainGetInterfaceParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
> virNetServerClientPtr client ATTRIBUTE_UNUSED,
> virNetMessagePtr msg ATTRIBUTE_UNUSED,
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index 9a1d78f..fb1fea7 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -6446,6 +6446,44 @@ remoteDomainOpenGraphics(virDomainPtr dom,
>
>
> static int
> +remoteDomainOpenGraphicsFD(virDomainPtr dom,
> + unsigned int idx,
> + int *fd,
> + unsigned int flags)
> +{
> + int rv = -1;
> + remote_domain_open_graphics_args args;
> + struct private_data *priv = dom->conn->privateData;
> + int *fdout = NULL;
> + size_t fdoutlen = 0;
> +
> + remoteDriverLock(priv);
> +
> + make_nonnull_domain(&args.dom, dom);
> + args.idx = idx;
> + args.flags = flags;
> +
> + if (callFull(dom->conn, priv, 0,
> + NULL, 0,
> + &fdout, &fdoutlen,
> + REMOTE_PROC_DOMAIN_OPEN_GRAPHICS_FD,
> + (xdrproc_t) xdr_remote_domain_open_graphics_fd_args, (char *) &args,
> + (xdrproc_t) xdr_void, NULL) == -1)
> + goto done;
> +
> + /* TODO: Check fdoutlen */
Maybe solve the TODO? shouldn't be that hard.
> + *fd = fdout[0];
> +
> + rv = 0;
> +
> + done:
> + remoteDriverUnlock(priv);
> +
> + return rv;
> +}
> +
> +
> +static int
> remoteConnectSetKeepAlive(virConnectPtr conn, int interval, unsigned int count)
> {
> struct private_data *priv = conn->privateData;
> @@ -7963,6 +8001,7 @@ static virDriver remote_driver = {
> .domainOpenConsole = remoteDomainOpenConsole, /* 0.8.6 */
> .domainOpenChannel = remoteDomainOpenChannel, /* 1.0.2 */
> .domainOpenGraphics = remoteDomainOpenGraphics, /* 0.9.7 */
> + .domainOpenGraphicsFD = remoteDomainOpenGraphicsFD, /* 1.2.8 */
> .domainInjectNMI = remoteDomainInjectNMI, /* 0.9.2 */
> .domainMigrateBegin3 = remoteDomainMigrateBegin3, /* 0.9.2 */
> .domainMigratePrepare3 = remoteDomainMigratePrepare3, /* 0.9.2 */
> diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
> index 5c316fb..6dc2d29 100644
> --- a/src/remote/remote_protocol.x
> +++ b/src/remote/remote_protocol.x
> @@ -2733,6 +2733,12 @@ struct remote_domain_open_graphics_args {
> unsigned int flags;
> };
>
> +struct remote_domain_open_graphics_fd_args {
> + remote_nonnull_domain dom;
> + unsigned int idx;
> + unsigned int flags;
> +};
> +
> struct remote_node_suspend_for_duration_args {
> unsigned int target;
> unsigned hyper duration;
> @@ -5420,5 +5426,12 @@ enum remote_procedure {
> * @generate: both
> * @acl: connect:write
> */
> - REMOTE_PROC_CONNECT_GET_DOMAIN_CAPABILITIES = 342
> + REMOTE_PROC_CONNECT_GET_DOMAIN_CAPABILITIES = 342,
> +
> + /**
> + * @generate: none
> + * @acl: domain:open_graphics
> + */
> + REMOTE_PROC_DOMAIN_OPEN_GRAPHICS_FD = 343
> +
> };
> diff --git a/src/rpc/virnetmessage.c b/src/rpc/virnetmessage.c
> index 19b2d6c..5c57128 100644
> --- a/src/rpc/virnetmessage.c
> +++ b/src/rpc/virnetmessage.c
> @@ -564,3 +564,29 @@ int virNetMessageDupFD(virNetMessagePtr msg,
> }
> return fd;
> }
> +
> +int virNetMessageAddFD(virNetMessagePtr msg,
> + int fd)
> +{
> + int newfd = -1;
> +
> + if ((newfd = dup(fd)) < 0) {
> + virReportSystemError(errno,
> + _("Unable to duplicate FD %d"),
> + fd);
> + goto error;
> + }
> +
> + if (virSetInherit(newfd, false) < 0) {
> + virReportSystemError(errno,
> + _("Cannot set close-on-exec %d"),
> + newfd);
> + goto error;
> + }
> + if (VIR_APPEND_ELEMENT(msg->fds, msg->nfds, newfd) < 0)
> + goto error;
> + return 0;
> + error:
> + VIR_FORCE_CLOSE(newfd);
> + return -1;
> +}
> diff --git a/src/rpc/virnetmessage.h b/src/rpc/virnetmessage.h
> index c94dddc..89a2ebf 100644
> --- a/src/rpc/virnetmessage.h
> +++ b/src/rpc/virnetmessage.h
> @@ -96,4 +96,7 @@ void virNetMessageSaveError(virNetMessageErrorPtr rerr)
> int virNetMessageDupFD(virNetMessagePtr msg,
> size_t slot);
>
> +int virNetMessageAddFD(virNetMessagePtr msg,
> + int fd);
> +
> #endif /* __VIR_NET_MESSAGE_H__ */
>
Fails syntax-check:
GEN remote_protocol-struct
--- remote_protocol-structs 2014-08-26 18:24:38.283925041 +0200
+++ remote_protocol-struct-t3 2014-08-26 18:39:19.297274744 +0200
@@ -2153,6 +2153,11 @@
u_int idx;
u_int flags;
};
+struct remote_domain_open_graphics_fd_args {
+ remote_nonnull_domain dom;
+ u_int idx;
+ u_int flags;
+};
struct remote_node_suspend_for_duration_args {
u_int target;
uint64_t duration;
@@ -2862,4 +2867,5 @@
REMOTE_PROC_NODE_GET_FREE_PAGES = 340,
REMOTE_PROC_NETWORK_GET_DHCP_LEASES = 341,
REMOTE_PROC_CONNECT_GET_DOMAIN_CAPABILITIES = 342,
+ REMOTE_PROC_DOMAIN_OPEN_GRAPHICS_FD = 343,
};
make[3]: *** [remote_protocol-struct] Error 1
make[3]: Leaving directory `/home/pipo/libvirt/src'
You probably don't have one of the tools installed.
I'd like to see a v2.
Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140826/423b7285/attachment-0001.sig>
More information about the libvir-list
mailing list