Introduce the virDomainOpenGraphics API

The virDomainOpenGraphics API allows a libvirt client to pass in
a file descriptor for an open socket pair, and get it connected
to the graphics display of the guest. This is limited to working
with local libvirt hypervisors connected over a UNIX domain
socket, since it will use UNIX FD passing

* include/libvirt/libvirt.h.in: Define virDomainOpenGraphics
* src/driver.h: Define driver for virDomainOpenGraphics
* src/libvirt_public.syms, src/libvirt.c: Entry point for
  virDomainOpenGraphics
* src/libvirt_internal.h: VIR_DRV_FEATURE_FD_PASSING
This commit is contained in:
Daniel P. Berrange 2011-10-21 09:00:37 +01:00
parent 5eb3df8bdb
commit 9d96f1ce90
5 changed files with 106 additions and 0 deletions

View File

@ -3140,6 +3140,15 @@ int virDomainOpenConsole(virDomainPtr dom,
virStreamPtr st, virStreamPtr st,
unsigned int flags); unsigned int flags);
typedef enum {
VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH = (1 << 0),
} virDomainOpenGraphicsFlags;
int virDomainOpenGraphics(virDomainPtr dom,
unsigned int idx,
int fd,
unsigned int flags);
int virDomainInjectNMI(virDomainPtr domain, unsigned int flags); int virDomainInjectNMI(virDomainPtr domain, unsigned int flags);

View File

@ -632,6 +632,11 @@ typedef int
const char *dev_name, const char *dev_name,
virStreamPtr st, virStreamPtr st,
unsigned int flags); unsigned int flags);
typedef int
(*virDrvDomainOpenGraphics)(virDomainPtr dom,
unsigned int idx,
int fd,
unsigned int flags);
typedef int typedef int
(*virDrvDomainInjectNMI)(virDomainPtr dom, unsigned int flags); (*virDrvDomainInjectNMI)(virDomainPtr dom, unsigned int flags);
@ -881,6 +886,7 @@ struct _virDriver {
virDrvDomainQemuMonitorCommand qemuDomainMonitorCommand; virDrvDomainQemuMonitorCommand qemuDomainMonitorCommand;
virDrvDomainQemuAttach qemuDomainAttach; virDrvDomainQemuAttach qemuDomainAttach;
virDrvDomainOpenConsole domainOpenConsole; virDrvDomainOpenConsole domainOpenConsole;
virDrvDomainOpenGraphics domainOpenGraphics;
virDrvDomainInjectNMI domainInjectNMI; virDrvDomainInjectNMI domainInjectNMI;
virDrvDomainMigrateBegin3 domainMigrateBegin3; virDrvDomainMigrateBegin3 domainMigrateBegin3;
virDrvDomainMigratePrepare3 domainMigratePrepare3; virDrvDomainMigratePrepare3 domainMigratePrepare3;

View File

@ -16964,3 +16964,88 @@ error:
virDispatchError(dom->conn); virDispatchError(dom->conn);
return -1; return -1;
} }
/**
* virDomainOpenGraphics:
* @dom: pointer to domain object
* @idx: index of graphics config to open
* @fd: file descriptor to attach graphics to
* @flags: flags to control open operation
*
* This will attempt to connect the file descriptor @fd, to
* the graphics backend of @dom. If @dom has multiple graphics
* backends configured, then @idx will determine which one is
* opened, starting from @idx 0.
*
* To disable any authentication, pass the VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH
* constant for @flags.
*
* The caller should use an anonymous socketpair to open
* @fd before invocation.
*
* This method can only be used when connected to a local
* libvirt hypervisor, over a UNIX domain socket. Attempts
* to use this method over a TCP connection will always fail
*
* Returns 0 on success, -1 on failure
*/
int virDomainOpenGraphics(virDomainPtr dom,
unsigned int idx,
int fd,
unsigned int flags)
{
struct stat sb;
VIR_DOMAIN_DEBUG(dom, "idx=%u, fd=%d, flags=%x",
idx, fd, flags);
virResetLastError();
if (!VIR_IS_DOMAIN(dom)) {
virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
virDispatchError(NULL);
return -1;
}
if (fd < 0) {
virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error;
}
if (fstat(fd, &sb) < 0) {
virReportSystemError(errno,
_("Unable to access file descriptor %d"), fd);
goto error;
}
if (!S_ISSOCK(sb.st_mode)) {
virLibDomainError(VIR_ERR_INVALID_ARG,
_("File descriptor %d must be a socket"), fd);
goto error;
}
if (dom->conn->flags & VIR_CONNECT_RO) {
virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
goto error;
}
if (!VIR_DRV_SUPPORTS_FEATURE(dom->conn->driver, dom->conn,
VIR_DRV_FEATURE_FD_PASSING)) {
virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
goto error;
}
if (dom->conn->driver->domainOpenGraphics) {
int ret;
ret = dom->conn->driver->domainOpenGraphics(dom, idx, fd, flags);
if (ret < 0)
goto error;
return ret;
}
virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
error:
virDispatchError(dom->conn);
return -1;
}

View File

@ -79,6 +79,11 @@ enum {
* to domain configuration, i.e., starting from Begin3 and not Perform3. * to domain configuration, i.e., starting from Begin3 and not Perform3.
*/ */
VIR_DRV_FEATURE_MIGRATE_CHANGE_PROTECTION = 7, VIR_DRV_FEATURE_MIGRATE_CHANGE_PROTECTION = 7,
/*
* Support for file descriptor passing
*/
VIR_DRV_FEATURE_FD_PASSING = 8
}; };

View File

@ -491,6 +491,7 @@ LIBVIRT_0.9.5 {
LIBVIRT_0.9.7 { LIBVIRT_0.9.7 {
global: global:
virDomainOpenGraphics;
virDomainReset; virDomainReset;
virDomainSnapshotGetParent; virDomainSnapshotGetParent;
virDomainSnapshotListChildrenNames; virDomainSnapshotListChildrenNames;