mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-18 10:35:20 +00:00
Add RPC implementation for virDomainOpenGraphicsFd
This commit is contained in:
parent
3ddc85440e
commit
408aae3849
@ -4398,6 +4398,50 @@ remoteDispatchDomainOpenGraphics(virNetServerPtr server ATTRIBUTE_UNUSED,
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
/* return 1 here to let virNetServerProgramDispatchCall know
|
||||||
|
* we are passing a FD */
|
||||||
|
rv = 1;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
VIR_FORCE_CLOSE(fd);
|
||||||
|
if (rv < 0) {
|
||||||
|
virNetMessageSaveError(rerr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dom)
|
||||||
|
virDomainFree(dom);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
static int
|
static int
|
||||||
remoteDispatchDomainGetInterfaceParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
|
remoteDispatchDomainGetInterfaceParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||||
virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
||||||
|
@ -6445,6 +6445,48 @@ 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;
|
||||||
|
|
||||||
|
if (fdoutlen != 1) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("no file descriptor received"));
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
*fd = fdout[0];
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
remoteConnectSetKeepAlive(virConnectPtr conn, int interval, unsigned int count)
|
remoteConnectSetKeepAlive(virConnectPtr conn, int interval, unsigned int count)
|
||||||
{
|
{
|
||||||
@ -7963,6 +8005,7 @@ static virDriver remote_driver = {
|
|||||||
.domainOpenConsole = remoteDomainOpenConsole, /* 0.8.6 */
|
.domainOpenConsole = remoteDomainOpenConsole, /* 0.8.6 */
|
||||||
.domainOpenChannel = remoteDomainOpenChannel, /* 1.0.2 */
|
.domainOpenChannel = remoteDomainOpenChannel, /* 1.0.2 */
|
||||||
.domainOpenGraphics = remoteDomainOpenGraphics, /* 0.9.7 */
|
.domainOpenGraphics = remoteDomainOpenGraphics, /* 0.9.7 */
|
||||||
|
.domainOpenGraphicsFD = remoteDomainOpenGraphicsFD, /* 1.2.8 */
|
||||||
.domainInjectNMI = remoteDomainInjectNMI, /* 0.9.2 */
|
.domainInjectNMI = remoteDomainInjectNMI, /* 0.9.2 */
|
||||||
.domainMigrateBegin3 = remoteDomainMigrateBegin3, /* 0.9.2 */
|
.domainMigrateBegin3 = remoteDomainMigrateBegin3, /* 0.9.2 */
|
||||||
.domainMigratePrepare3 = remoteDomainMigratePrepare3, /* 0.9.2 */
|
.domainMigratePrepare3 = remoteDomainMigratePrepare3, /* 0.9.2 */
|
||||||
|
@ -2733,6 +2733,12 @@ struct remote_domain_open_graphics_args {
|
|||||||
unsigned int flags;
|
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 {
|
struct remote_node_suspend_for_duration_args {
|
||||||
unsigned int target;
|
unsigned int target;
|
||||||
unsigned hyper duration;
|
unsigned hyper duration;
|
||||||
@ -5420,5 +5426,12 @@ enum remote_procedure {
|
|||||||
* @generate: both
|
* @generate: both
|
||||||
* @acl: connect:write
|
* @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
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -2153,6 +2153,11 @@ struct remote_domain_open_graphics_args {
|
|||||||
u_int idx;
|
u_int idx;
|
||||||
u_int flags;
|
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 {
|
struct remote_node_suspend_for_duration_args {
|
||||||
u_int target;
|
u_int target;
|
||||||
uint64_t duration;
|
uint64_t duration;
|
||||||
@ -2862,4 +2867,5 @@ enum remote_procedure {
|
|||||||
REMOTE_PROC_NODE_GET_FREE_PAGES = 340,
|
REMOTE_PROC_NODE_GET_FREE_PAGES = 340,
|
||||||
REMOTE_PROC_NETWORK_GET_DHCP_LEASES = 341,
|
REMOTE_PROC_NETWORK_GET_DHCP_LEASES = 341,
|
||||||
REMOTE_PROC_CONNECT_GET_DOMAIN_CAPABILITIES = 342,
|
REMOTE_PROC_CONNECT_GET_DOMAIN_CAPABILITIES = 342,
|
||||||
|
REMOTE_PROC_DOMAIN_OPEN_GRAPHICS_FD = 343,
|
||||||
};
|
};
|
||||||
|
@ -564,3 +564,29 @@ int virNetMessageDupFD(virNetMessagePtr msg,
|
|||||||
}
|
}
|
||||||
return fd;
|
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;
|
||||||
|
}
|
||||||
|
@ -96,4 +96,7 @@ void virNetMessageSaveError(virNetMessageErrorPtr rerr)
|
|||||||
int virNetMessageDupFD(virNetMessagePtr msg,
|
int virNetMessageDupFD(virNetMessagePtr msg,
|
||||||
size_t slot);
|
size_t slot);
|
||||||
|
|
||||||
|
int virNetMessageAddFD(virNetMessagePtr msg,
|
||||||
|
int fd);
|
||||||
|
|
||||||
#endif /* __VIR_NET_MESSAGE_H__ */
|
#endif /* __VIR_NET_MESSAGE_H__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user