Add possibility to change addresses where VNC server listens for new connections. Prior to 6.0 this functionality was available through 'change' qmp command which was deleted.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- docs/about/removed-features.rst | 3 ++- qapi/ui.json | 6 +++++- include/ui/console.h | 2 +- monitor/qmp-cmds.c | 4 +--- ui/vnc.c | 37 ++++++++++++++++++++++++++------- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/docs/about/removed-features.rst b/docs/about/removed-features.rst index 4c4da20d0f..b92626a74e 100644 --- a/docs/about/removed-features.rst +++ b/docs/about/removed-features.rst @@ -355,7 +355,8 @@ documentation of ``query-hotpluggable-cpus`` for additional details. ``change`` (removed in 6.0) ''''''''''''''''''''''''''' -Use ``blockdev-change-medium`` or ``change-vnc-password`` instead. +Use ``blockdev-change-medium`` or ``change-vnc-password`` or +``display-reload`` instead. ``query-events`` (removed in 6.0) ''''''''''''''''''''''''''''''''' diff --git a/qapi/ui.json b/qapi/ui.json index 9354f4c467..4c4448f378 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -1293,12 +1293,16 @@ # Specify the VNC reload options. # # @tls-certs: reload tls certs or not. +# @addresses: If specified, change set of addresses +# to listen for connections. Addresses configured +# for websockets are not touched. (since 7.0) # # Since: 6.0 # ## { 'struct': 'DisplayReloadOptionsVNC', - 'data': { '*tls-certs': 'bool' } } + 'data': { '*tls-certs': 'bool', + '*addresses': ['SocketAddress'] } } ## # @DisplayReloadOptions: diff --git a/include/ui/console.h b/include/ui/console.h index f590819880..b052027915 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -512,7 +512,7 @@ int vnc_display_password(const char *id, const char *password); int vnc_display_pw_expire(const char *id, time_t expires); void vnc_parse(const char *str); int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp); -bool vnc_display_reload_certs(const char *id, Error **errp); +bool vnc_display_reload(DisplayReloadOptionsVNC *arg, Error **errp); /* input.c */ int index_from_key(const char *key, size_t key_length); diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index 14e3beeaaf..ad45baa12b 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -356,9 +356,7 @@ void qmp_display_reload(DisplayReloadOptions *arg, Error **errp) switch (arg->type) { case DISPLAY_RELOAD_TYPE_VNC: #ifdef CONFIG_VNC - if (arg->u.vnc.has_tls_certs && arg->u.vnc.tls_certs) { - vnc_display_reload_certs(NULL, errp); - } + vnc_display_reload(&arg->u.vnc, errp); #else error_setg(errp, "vnc is invalid, missing 'CONFIG_VNC'"); #endif diff --git a/ui/vnc.c b/ui/vnc.c index fa0fb736d3..a86bd6335e 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -587,16 +587,10 @@ VncInfo2List *qmp_query_vnc_servers(Error **errp) return prev; } -bool vnc_display_reload_certs(const char *id, Error **errp) +static bool vnc_display_reload_certs(VncDisplay *vd, Error **errp) { - VncDisplay *vd = vnc_display_find(id); QCryptoTLSCredsClass *creds = NULL; - if (!vd) { - error_setg(errp, "Can not find vnc display"); - return false; - } - if (!vd->tlscreds) { error_setg(errp, "vnc tls is not enabled"); return false; @@ -3973,6 +3967,35 @@ static int vnc_display_listen(VncDisplay *vd, return 0; } +bool vnc_display_reload(DisplayReloadOptionsVNC *arg, Error **errp) +{ + VncDisplay *vd = vnc_display_find(NULL); + + if (!vd) { + error_setg(errp, "Can not find vnc display"); + return false; + } + + if (arg->has_tls_certs && arg->tls_certs) { + if (!vnc_display_reload_certs(vd, errp)) { + return false; + } + } + + if (arg->has_addresses) { + if (vd->listener) { + qio_net_listener_disconnect(vd->listener); + object_unref(OBJECT(vd->listener)); + vd->listener = NULL; + } + + if (vnc_display_listen(vd, arg->addresses, NULL, errp) < 0) { + return false; + } + } + + return true; +} void vnc_display_open(const char *id, Error **errp) { -- 2.31.1