Add new query vnc qmp command, for the lack of better ideas just name it "query-vnc2". Changes over query-vnc:
* It returns a list of vnc servers, so multiple vnc server instances are covered. * Each vnc server returns a list of server sockets. Followup patch will use that to also report websockets. In case we add support for multiple server sockets server sockets (to better support ipv4+ipv6 dualstack) we can add them to the list too. Signed-off-by: Gerd Hoffmann <kra...@redhat.com> --- qapi-schema.json | 50 +++++++++++++++++++++++++++++++++++++++++++ qmp-commands.hx | 5 +++++ ui/vnc.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+) diff --git a/qapi-schema.json b/qapi-schema.json index 9ffdcf8..677a762 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -751,6 +751,45 @@ '*service': 'str', '*auth': 'str', '*clients': ['VncClientInfo']} } ## +# @VncInfo2: +# +# Information about a vnc server +# +# @id: vnc server name. +# +# @server: A list of @VncBasincInfo describing all listening sockets. +# The list can be empty (in case the vnc server is disabled). +# It also may have multiple entries: normal + websocket, +# possibly also ipv4 + ipv6 in the future. +# +# @clients: A list of @VncClientInfo of all currently connected clients. +# The list can be empty, for obvious reasons. +# +# @auth: The current authentication type used by the server +# 'none' if no authentication is being used +# 'vnc' if VNC authentication is being used +# 'vencrypt+plain' if VEncrypt is used with plain text authentication +# 'vencrypt+tls+none' if VEncrypt is used with TLS and no authentication +# 'vencrypt+tls+vnc' if VEncrypt is used with TLS and VNC authentication +# 'vencrypt+tls+plain' if VEncrypt is used with TLS and plain text auth +# 'vencrypt+x509+none' if VEncrypt is used with x509 and no auth +# 'vencrypt+x509+vnc' if VEncrypt is used with x509 and VNC auth +# 'vencrypt+x509+plain' if VEncrypt is used with x509 and plain text auth +# 'vencrypt+tls+sasl' if VEncrypt is used with TLS and SASL auth +# 'vencrypt+x509+sasl' if VEncrypt is used with x509 and SASL auth +# +# @display: #optional The display device the vnc server is linked to. +# +# Since: 2.3 +## +{ 'type': 'VncInfo2', + 'data': { 'id' : 'str', + 'server' : ['VncBasicInfo'], + 'clients' : ['VncClientInfo'], + 'auth' : 'str', + '*display' : 'str' } } + +## # @query-vnc: # # Returns information about the current VNC server @@ -762,6 +801,17 @@ { 'command': 'query-vnc', 'returns': 'VncInfo' } ## +# @query-vnc2: +# +# Returns a list of vnc servers. The list can be empty. +# +# Returns: @VncInfo +# +# Since: 2.3 +## +{ 'command': 'query-vnc2', 'returns': ['VncInfo2'] } + +## # @SpiceBasicInfo # # The basic information for SPICE network connection diff --git a/qmp-commands.hx b/qmp-commands.hx index 718dd92..704522e 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -2825,6 +2825,11 @@ EQMP .args_type = "", .mhandler.cmd_new = qmp_marshal_input_query_vnc, }, + { + .name = "query-vnc2", + .args_type = "", + .mhandler.cmd_new = qmp_marshal_input_query_vnc2, + }, SQMP query-spice diff --git a/ui/vnc.c b/ui/vnc.c index d04802c..0574631 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -456,6 +456,70 @@ out_error: return NULL; } +static VncBasicInfoList *qmp_query_server_entry(int socket, + VncBasicInfoList *prev) +{ + VncBasicInfoList *list; + VncBasicInfo *info; + struct sockaddr_storage sa; + socklen_t salen = sizeof(sa); + char host[NI_MAXHOST]; + char serv[NI_MAXSERV]; + + if (getsockname(socket, (struct sockaddr *)&sa, &salen) < 0 || + getnameinfo((struct sockaddr *)&sa, salen, + host, sizeof(host), serv, sizeof(serv), + NI_NUMERICHOST | NI_NUMERICSERV) < 0) { + return prev; + } + + info = g_new0(VncBasicInfo, 1); + info->host = g_strdup(host); + info->service = g_strdup(serv); + info->family = inet_netfamily(sa.ss_family); + + list = g_new0(VncBasicInfoList, 1); + list->value = info; + list->next = prev; + return list; +} + +VncInfo2List *qmp_query_vnc2(Error **errp) +{ + VncInfo2List *item, *prev = NULL; + VncInfo2 *info; + VncDisplay *vd; + DeviceState *dev; + + QTAILQ_FOREACH(vd, &vnc_displays, next) { + info = g_new0(VncInfo2, 1); + info->id = g_strdup(vd->id); + info->auth = g_strdup(vnc_auth_name(vd)); + info->clients = qmp_query_client_list(vd); + if (vd->dcl.con) { + dev = DEVICE(object_property_get_link(OBJECT(vd->dcl.con), + "device", NULL)); + info->has_display = true; + info->display = g_strdup(dev->id); + } + if (vd->lsock != -1) { + info->server = qmp_query_server_entry(vd->lsock, + info->server); + } +#ifdef CONFIG_VNC_WS + if (vd->lwebsock != -1) { + /* TODO */ + } +#endif + + item = g_new0(VncInfo2List, 1); + item->value = info; + item->next = prev; + prev = item; + } + return prev; +} + /* TODO 1) Get the queue working for IO. 2) there is some weirdness when using the -S option (the screen is grey -- 1.8.3.1