This moves the socket generation if "vnc_auto_unix_socket" is set.
It also fixes a bug with this config option that we should auto-generate
socket path only if listen type is address and there is no address
specified.
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
# unix socket. This prevents unprivileged access from users on the
# host machine, though most VNC clients do not support it.
#
-# This will only be enabled for VNC configurations that do not have
-# a hardcoded 'listen' or 'socket' value. This setting takes preference
-# over vnc_listen.
+# This will only be enabled for VNC configurations that have listen
+# type=address but without any address specified. This setting takes
+# preference over vnc_listen.
#
#vnc_auto_unix_socket = 1
qemuBuildGraphicsVNCCommandLine(virQEMUDriverConfigPtr cfg,
virCommandPtr cmd,
virQEMUCapsPtr qemuCaps,
- virDomainGraphicsDefPtr graphics,
- const char *domainLibDir)
+ virDomainGraphicsDefPtr graphics)
{
virBuffer opt = VIR_BUFFER_INITIALIZER;
virDomainGraphicsListenDefPtr glisten = NULL;
glisten = virDomainGraphicsGetListen(graphics, 0);
- if (graphics->data.vnc.socket || cfg->vncAutoUnixSocket) {
- if (!graphics->data.vnc.socket) {
- if (virAsprintf(&graphics->data.vnc.socket,
- "%s/vnc.sock", domainLibDir) < 0)
- goto error;
-
- graphics->data.vnc.socketFromConfig = true;
- }
-
+ if (graphics->data.vnc.socket) {
virBufferAddLit(&opt, "unix:");
qemuBufferEscapeComma(&opt, graphics->data.vnc.socket);
virCommandPtr cmd,
virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
- virDomainGraphicsDefPtr graphics,
- const char *domainLibDir)
+ virDomainGraphicsDefPtr graphics)
{
switch (graphics->type) {
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
break;
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
- return qemuBuildGraphicsVNCCommandLine(cfg, cmd, qemuCaps,
- graphics, domainLibDir);
+ return qemuBuildGraphicsVNCCommandLine(cfg, cmd, qemuCaps, graphics);
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
return qemuBuildGraphicsSPICECommandLine(cfg, cmd, qemuCaps, graphics);
for (i = 0; i < def->ngraphics; ++i) {
if (qemuBuildGraphicsCommandLine(cfg, cmd, def, qemuCaps,
- def->graphics[i], domainLibDir) < 0)
+ def->graphics[i]) < 0)
goto error;
}
static int
qemuProcessGraphicsSetupListen(virQEMUDriverConfigPtr cfg,
- virDomainGraphicsDefPtr graphics)
+ virDomainGraphicsDefPtr graphics,
+ virDomainObjPtr vm)
{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ const char *type = virDomainGraphicsTypeToString(graphics->type);
char *listenAddr = NULL;
+ bool useSocket = false;
size_t i;
switch (graphics->type) {
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+ useSocket = cfg->vncAutoUnixSocket;
listenAddr = cfg->vncListen;
break;
switch (glisten->type) {
case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
- if (glisten->address || !listenAddr)
- continue;
-
- if (VIR_STRDUP(glisten->address, listenAddr) < 0)
- return -1;
-
- glisten->fromConfig = true;
+ if (!glisten->address) {
+ /* If there is no address specified and qemu.conf has
+ * *_auto_unix_socket set we should use unix socket as
+ * default instead of tcp listen. */
+ if (useSocket) {
+ VIR_DELETE_ELEMENT(graphics->listens, i, graphics->nListens);
+ if (virAsprintf(&graphics->data.vnc.socket, "%s/%s.sock",
+ priv->libDir, type) < 0)
+ return -1;
+ graphics->data.vnc.socketFromConfig = true;
+ } else if (listenAddr) {
+ if (VIR_STRDUP(glisten->address, listenAddr) < 0)
+ return -1;
+ glisten->fromConfig = true;
+ }
+ }
break;
case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
break;
}
- if (qemuProcessGraphicsSetupListen(cfg, graphics) < 0)
+ if (qemuProcessGraphicsSetupListen(cfg, graphics, vm) < 0)
goto cleanup;
}