VIR_ENUM_IMPL(virDomainGraphicsListen, VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST,
"none",
"address",
- "network")
+ "network",
+ "socket")
VIR_ENUM_IMPL(virDomainGraphicsAuthConnected,
VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_LAST,
VIR_FREE(def->address);
VIR_FREE(def->network);
+ VIR_FREE(def->socket);
return;
}
/**
* virDomainGraphicsListenDefParseXML:
* @def: listen def pointer to be filled
+ * @graphics: graphics def pointer
* @node: xml node of <listen/> element
* @parent: xml node of <graphics/> element
* @flags: bit-wise or of VIR_DOMAIN_DEF_PARSE_*
*/
static int
virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def,
+ virDomainGraphicsDefPtr graphics,
xmlNodePtr node,
xmlNodePtr parent,
unsigned int flags)
char *type = virXMLPropString(node, "type");
char *address = virXMLPropString(node, "address");
char *network = virXMLPropString(node, "network");
+ char *socket = virXMLPropString(node, "socket");
char *fromConfig = virXMLPropString(node, "fromConfig");
char *addressCompat = NULL;
+ const char *graphicsType = virDomainGraphicsTypeToString(graphics->type);
int tmp, typeVal;
if (parent)
}
def->type = typeVal;
+ if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("listen type 'socket' is not available for "
+ "graphics type '%s'"), graphicsType);
+ goto error;
+ }
+
if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) {
if (address && addressCompat && STRNEQ(address, addressCompat)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
network = NULL;
}
+ if (socket && socket[0]) {
+ if (def->type != VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("'socket' attribute is valid only for listen "
+ "type 'socket'"));
+ goto error;
+ }
+ def->socket = socket;
+ socket = NULL;
+ }
+
if (fromConfig &&
flags & VIR_DOMAIN_DEF_PARSE_STATUS) {
if (virStrToLong_i(fromConfig, NULL, 10, &tmp) < 0) {
VIR_FREE(type);
VIR_FREE(address);
VIR_FREE(network);
+ VIR_FREE(socket);
VIR_FREE(fromConfig);
VIR_FREE(addressCompat);
return ret;
goto error;
for (i = 0; i < nListens; i++) {
- if (virDomainGraphicsListenDefParseXML(&def->listens[i],
+ if (virDomainGraphicsListenDefParseXML(&def->listens[i], def,
listenNodes[i],
i == 0 ? node : NULL,
flags) < 0)
virBufferEscapeString(buf, " network='%s'", def->network);
}
+ if (def->socket &&
+ def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET &&
+ !(def->autoGenerated &&
+ (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE))) {
+ virBufferEscapeString(buf, " socket='%s'", def->socket);
+ }
+
if (flags & VIR_DOMAIN_DEF_FORMAT_STATUS)
virBufferAsprintf(buf, " fromConfig='%d'", def->fromConfig);
}
+int
+virDomainGraphicsListenAppendSocket(virDomainGraphicsDefPtr def,
+ const char *socket)
+{
+ virDomainGraphicsListenDef listen;
+
+ memset(&listen, 0, sizeof(listen));
+
+ listen.type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET;
+
+ if (VIR_STRDUP(listen.socket, socket) < 0)
+ goto error;
+
+ if (VIR_APPEND_ELEMENT_COPY(def->listens, def->nListens, listen) < 0)
+ goto error;
+
+ return 0;
+
+ error:
+ VIR_FREE(listen.socket);
+ return -1;
+}
+
+
/**
* virDomainNetFind:
* @def: domain's def
VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE = 0,
VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS,
VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK,
+ VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET,
VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST
} virDomainGraphicsListenType;
virDomainGraphicsListenType type;
char *address;
char *network;
+ char *socket;
bool fromConfig; /* true if the @address is config file originated */
+ bool autoGenerated;
};
struct _virDomainGraphicsDef {
int virDomainGraphicsListenAppendAddress(virDomainGraphicsDefPtr def,
const char *address)
ATTRIBUTE_NONNULL(1);
+int virDomainGraphicsListenAppendSocket(virDomainGraphicsDefPtr def,
+ const char *socket)
+ ATTRIBUTE_NONNULL(1);
int virDomainNetGetActualType(virDomainNetDefPtr iface);
const char *virDomainNetGetActualBridgeName(virDomainNetDefPtr iface);
goto cleanup;
for (i = 0; i < ctl->def->ngraphics; i++) {
- if (ctl->def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
- ctl->def->graphics[i]->data.vnc.socket &&
- vah_add_file(&buf, ctl->def->graphics[i]->data.vnc.socket, "w"))
+ virDomainGraphicsDefPtr graphics = ctl->def->graphics[i];
+ size_t n;
+
+ if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+ graphics->data.vnc.socket &&
+ vah_add_file(&buf, graphics->data.vnc.socket, "w"))
goto cleanup;
+
+ for (n = 0; n < graphics->nListens; n++) {
+ virDomainGraphicsListenDef listenObj = graphics->listens[n];
+
+ if (listenObj.type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET &&
+ listenObj.socket &&
+ vah_add_file(&buf, listenObj.socket, "rw"))
+ goto cleanup;
+ }
}
if (ctl->def->ngraphics == 1 &&