mirror of https://github.com/xemu-project/xemu.git
qapi/ui: add 'display-update' command for changing listen address
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 <vsementsov@openvz.org> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Message-Id: <20220401143936.356460-3-vsementsov@openvz.org> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
d708f99d85
commit
abea19468e
|
@ -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-update`` instead.
|
||||
|
||||
``query-events`` (removed in 6.0)
|
||||
'''''''''''''''''''''''''''''''''
|
||||
|
|
|
@ -518,6 +518,7 @@ 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_update(DisplayUpdateOptionsVNC *arg, Error **errp);
|
||||
|
||||
/* input.c */
|
||||
int index_from_key(const char *key, size_t key_length);
|
||||
|
|
|
@ -346,6 +346,21 @@ void qmp_display_reload(DisplayReloadOptions *arg, Error **errp)
|
|||
}
|
||||
}
|
||||
|
||||
void qmp_display_update(DisplayUpdateOptions *arg, Error **errp)
|
||||
{
|
||||
switch (arg->type) {
|
||||
case DISPLAY_UPDATE_TYPE_VNC:
|
||||
#ifdef CONFIG_VNC
|
||||
vnc_display_update(&arg->u.vnc, errp);
|
||||
#else
|
||||
error_setg(errp, "vnc is invalid, missing 'CONFIG_VNC'");
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
static int qmp_x_query_rdma_foreach(Object *obj, void *opaque)
|
||||
{
|
||||
RdmaProvider *rdma;
|
||||
|
|
65
qapi/ui.json
65
qapi/ui.json
|
@ -1468,3 +1468,68 @@
|
|||
{ 'command': 'display-reload',
|
||||
'data': 'DisplayReloadOptions',
|
||||
'boxed' : true }
|
||||
|
||||
##
|
||||
# @DisplayUpdateType:
|
||||
#
|
||||
# Available DisplayUpdate types.
|
||||
#
|
||||
# @vnc: VNC display
|
||||
#
|
||||
# Since: 7.1
|
||||
#
|
||||
##
|
||||
{ 'enum': 'DisplayUpdateType',
|
||||
'data': ['vnc'] }
|
||||
|
||||
##
|
||||
# @DisplayUpdateOptionsVNC:
|
||||
#
|
||||
# Specify the VNC reload options.
|
||||
#
|
||||
# @addresses: If specified, change set of addresses
|
||||
# to listen for connections. Addresses configured
|
||||
# for websockets are not touched.
|
||||
#
|
||||
# Since: 7.1
|
||||
#
|
||||
##
|
||||
{ 'struct': 'DisplayUpdateOptionsVNC',
|
||||
'data': { '*addresses': ['SocketAddress'] } }
|
||||
|
||||
##
|
||||
# @DisplayUpdateOptions:
|
||||
#
|
||||
# Options of the display configuration reload.
|
||||
#
|
||||
# @type: Specify the display type.
|
||||
#
|
||||
# Since: 7.1
|
||||
#
|
||||
##
|
||||
{ 'union': 'DisplayUpdateOptions',
|
||||
'base': {'type': 'DisplayUpdateType'},
|
||||
'discriminator': 'type',
|
||||
'data': { 'vnc': 'DisplayUpdateOptionsVNC' } }
|
||||
|
||||
##
|
||||
# @display-update:
|
||||
#
|
||||
# Update display configuration.
|
||||
#
|
||||
# Returns: Nothing on success.
|
||||
#
|
||||
# Since: 7.1
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# -> { "execute": "display-update",
|
||||
# "arguments": { "type": "vnc", "addresses":
|
||||
# [ { "type": "inet", "host": "0.0.0.0",
|
||||
# "port": "5901" } ] } }
|
||||
# <- { "return": {} }
|
||||
#
|
||||
##
|
||||
{ 'command': 'display-update',
|
||||
'data': 'DisplayUpdateOptions',
|
||||
'boxed' : true }
|
||||
|
|
23
ui/vnc.c
23
ui/vnc.c
|
@ -3981,6 +3981,29 @@ static int vnc_display_listen(VncDisplay *vd,
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool vnc_display_update(DisplayUpdateOptionsVNC *arg, Error **errp)
|
||||
{
|
||||
VncDisplay *vd = vnc_display_find(NULL);
|
||||
|
||||
if (!vd) {
|
||||
error_setg(errp, "Can not find vnc display");
|
||||
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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue