return rv;
}
+
static int
remoteDispatchDomainOpenGraphicsFd(virNetServerPtr server ATTRIBUTE_UNUSED,
virNetServerClientPtr client ATTRIBUTE_UNUSED,
if (!(dom = get_nonnull_domain(priv->conn, args->dom)))
goto cleanup;
- if (virDomainOpenGraphicsFD(dom,
- args->idx,
- &fd,
- args->flags) < 0)
+ if ((fd = virDomainOpenGraphicsFD(dom,
+ args->idx,
+ args->flags)) < 0)
goto cleanup;
if (virNetMessageAddFD(msg, fd) < 0)
virDomainFree(dom);
return rv;
}
+
+
static int
remoteDispatchDomainGetInterfaceParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
virNetServerClientPtr client ATTRIBUTE_UNUSED,
int virDomainOpenGraphicsFD(virDomainPtr dom,
unsigned int idx,
- int *fd,
unsigned int flags);
int virDomainInjectNMI(virDomainPtr domain, unsigned int flags);
typedef int
(*virDrvDomainOpenGraphicsFD)(virDomainPtr dom,
unsigned int idx,
- int *fd,
unsigned int flags);
typedef int
* virDomainOpenGraphicsFD:
* @dom: pointer to domain object
* @idx: index of graphics config to open
- * @fd: returned file descriptor
* @flags: bitwise-OR of virDomainOpenGraphicsFlags
*
* This will create a socket pair connected to the graphics backend of @dom.
- * One socket will be returned as @fd.
+ * One end of the socket will be returned on success, and the other end is
+ * handed to the hypervisor.
* If @dom has multiple graphics backends configured, then @idx will determine
* which one is opened, starting from @idx 0.
*
*
* 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
+ * to use this method over a TCP connection will always fail.
*
- * Returns 0 on success, -1 on failure
+ * Returns an fd on success, -1 on failure
*/
int
virDomainOpenGraphicsFD(virDomainPtr dom,
unsigned int idx,
- int *fd,
unsigned int flags)
{
- VIR_DOMAIN_DEBUG(dom, "idx=%u, fd=%p, flags=%x",
- idx, fd, flags);
+ VIR_DOMAIN_DEBUG(dom, "idx=%u, flags=%x", idx, flags);
virResetLastError();
virCheckDomainReturn(dom, -1);
- virCheckNonNullArgGoto(fd, error);
virCheckReadOnlyGoto(dom->conn->flags, error);
if (dom->conn->driver->domainOpenGraphicsFD) {
int ret;
- ret = dom->conn->driver->domainOpenGraphicsFD(dom, idx, fd, flags);
+ ret = dom->conn->driver->domainOpenGraphicsFD(dom, idx, flags);
if (ret < 0)
goto error;
return ret;
virDispatchError(dom->conn);
return -1;
}
+
+
/**
* virConnectSetKeepAlive:
* @conn: pointer to a hypervisor connection
static int
qemuDomainOpenGraphicsFD(virDomainPtr dom,
unsigned int idx,
- int *fd,
unsigned int flags)
{
virQEMUDriverPtr driver = dom->conn->privateData;
goto cleanup;
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorOpenGraphics(priv->mon, protocol, pair[1], "graphicsfd",
- (flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH) != 0);
+ (flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH));
qemuDomainObjExitMonitor(driver, vm);
if (!qemuDomainObjEndJob(driver, vm))
vm = NULL;
+ if (ret < 0)
+ goto cleanup;
- *fd = pair[0];
+ ret = pair[0];
+ pair[0] = -1;
cleanup:
- if (ret < 0) {
- VIR_FORCE_CLOSE(pair[0]);
- VIR_FORCE_CLOSE(pair[1]);
- }
+ VIR_FORCE_CLOSE(pair[0]);
+ VIR_FORCE_CLOSE(pair[1]);
if (vm)
virObjectUnlock(vm);
return ret;
static int
remoteDomainOpenGraphicsFD(virDomainPtr dom,
unsigned int idx,
- int *fd,
unsigned int flags)
{
int rv = -1;
goto done;
if (fdoutlen != 1) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("no file descriptor received"));
+ if (fdoutlen) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("too many file descriptors received"));
+ while (fdoutlen)
+ VIR_FORCE_CLOSE(fdout[--fdoutlen]);
+ } else {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("no file descriptor received"));
+ }
goto done;
}
- *fd = fdout[0];
-
- rv = 0;
+ rv = fdout[0];
done:
+ VIR_FREE(fdout);
remoteDriverUnlock(priv);
return rv;