@samitouri / QOSamiQemu / commits / bbd8cb0ed7

ui/vnc: merge vnc_display_init() and vnc_display_open()

Combine the two-step vnc_display_init()/vnc_display_open() sequence into a single vnc_display_new() function that returns VncDisplay*. This simplifies the API by making vnc_display_open() an internal detail and will allow further code simplification. vnc_display_new() is moved to vnc.h, since it returns VncDisplay* now. Add vnc_display_free() for consistency, and it will be later used. Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Marc-André Lureau committed Feb 24, 2026 at 16:22 UTC bbd8cb0ed7c36e60d5f1858a0fe84026b3d3712f
3 files changed +36 -48
include/ui/console.h
-2
@@ -438,8 +438,6 @@ const char *qemu_display_get_vc(DisplayOptions *opts);
438 void qemu_display_help(void);
439
440 /* vnc.c */
441 -bool vnc_display_init(const char *id, Error **errp);
442 -bool vnc_display_open(const char *id, Error **errp);
441 void vnc_display_add_client(const char *id, int csock, bool skipauth);
442 int vnc_display_password(const char *id, const char *password, Error **errp);
443 int vnc_display_pw_expire(const char *id, time_t expires);
ui/vnc.c
+33 -46
@@ -3423,17 +3423,15 @@ static void vmstate_change_handler(void *opaque, bool running, RunState state)
3423 update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
3424 }
3425
3426 -static void vnc_display_free(VncDisplay *vd);
3426 +static bool vnc_display_open(VncDisplay *vd, Error **errp);
3427
3428 -bool vnc_display_init(const char *id, Error **errp)
3428 +VncDisplay *vnc_display_new(const char *id, Error **errp)
3429 {
3430 VncDisplay *vd;
3431
3432 - if (vnc_display_find(id) != NULL) {
3433 - return true;
3434 - }
3435 - vd = g_malloc0(sizeof(*vd));
3432 + assert(!vnc_display_find(id));
3433
3434 + vd = g_new0(VncDisplay, 1);
3435 qemu_mutex_init(&vd->mutex);
3436 vd->id = g_strdup(id);
3437 vd->dcl.ops = &dcl_ops;
@@ -3451,7 +3449,7 @@ bool vnc_display_init(const char *id, Error **errp)
3449
3450 if (!vd->kbd_layout) {
3451 vnc_display_free(vd);
3454 - return false;
3452 + return NULL;
3453 }
3454
3455 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
@@ -3464,8 +3462,13 @@ bool vnc_display_init(const char *id, Error **errp)
3462 vd->vmstate_handler_entry = qemu_add_vm_change_state_handler(
3463 &vmstate_change_handler, vd);
3464
3465 + if (!vnc_display_open(vd, errp)) {
3466 + vnc_display_free(vd);
3467 + return NULL;
3468 + }
3469 +
3470 QTAILQ_INSERT_TAIL(&vnc_displays, vd, next);
3468 - return true;
3471 + return vd;
3472 }
3473
3474 static void vnc_display_close(VncDisplay *vd)
@@ -3506,7 +3509,7 @@ static void vnc_display_close(VncDisplay *vd)
3509 #endif
3510 }
3511
3509 -static void vnc_display_free(VncDisplay *vd)
3512 +void vnc_display_free(VncDisplay *vd)
3513 {
3514 if (!vd) {
3515 return;
@@ -3528,7 +3531,6 @@ static void vnc_display_free(VncDisplay *vd)
3531 g_free(vd);
3532 }
3533
3531 -
3534 int vnc_display_password(const char *id, const char *password, Error **errp)
3535 {
3536 VncDisplay *vd = vnc_display_find(id);
@@ -4071,10 +4073,9 @@ bool vnc_display_update(DisplayUpdateOptionsVNC *arg, Error **errp)
4073 return true;
4074 }
4075
4074 -bool vnc_display_open(const char *id, Error **errp)
4076 +static bool vnc_display_open(VncDisplay *vd, Error **errp)
4077 {
4076 - VncDisplay *vd = vnc_display_find(id);
4077 - QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
4078 + QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, vd->id);
4079 g_autoptr(SocketAddressList) saddr_list = NULL;
4080 g_autoptr(SocketAddressList) wsaddr_list = NULL;
4081 const char *share, *device_id;
@@ -4093,26 +4094,23 @@ bool vnc_display_open(const char *id, Error **errp)
4094 assert(vd);
4095 assert(opts);
4096
4096 - vnc_display_close(vd);
4097 -
4097 reverse = qemu_opt_get_bool(opts, "reverse", false);
4098 if (vnc_display_get_addresses(opts, reverse, &saddr_list, &wsaddr_list,
4099 errp) < 0) {
4101 - goto fail;
4100 + return false;
4101 }
4102
4104 -
4103 passwordSecret = qemu_opt_get(opts, "password-secret");
4104 if (passwordSecret) {
4105 if (qemu_opt_get(opts, "password")) {
4106 error_setg(errp,
4107 "'password' flag is redundant with 'password-secret'");
4110 - goto fail;
4108 + return false;
4109 }
4110 vd->password = qcrypto_secret_lookup_as_utf8(passwordSecret,
4111 errp);
4112 if (!vd->password) {
4115 - goto fail;
4113 + return false;
4114 }
4115 password = true;
4116 } else {
@@ -4123,7 +4121,7 @@ bool vnc_display_open(const char *id, Error **errp)
4121 QCRYPTO_CIPHER_ALGO_DES, QCRYPTO_CIPHER_MODE_ECB)) {
4122 error_setg(errp,
4123 "Cipher backend does not support DES algorithm");
4126 - goto fail;
4124 + return false;
4125 }
4126 }
4127
@@ -4133,7 +4131,7 @@ bool vnc_display_open(const char *id, Error **errp)
4131 #ifndef CONFIG_VNC_SASL
4132 if (sasl) {
4133 error_setg(errp, "VNC SASL auth requires cyrus-sasl support");
4136 - goto fail;
4134 + return false;
4135 }
4136 #endif /* CONFIG_VNC_SASL */
4137 credid = qemu_opt_get(opts, "tls-creds");
@@ -4144,7 +4142,7 @@ bool vnc_display_open(const char *id, Error **errp)
4142 if (!creds) {
4143 error_setg(errp, "No TLS credentials with id '%s'",
4144 credid);
4147 - goto fail;
4145 + return false;
4146 }
4147 vd->tlscreds = (QCryptoTLSCreds *)
4148 object_dynamic_cast(creds,
@@ -4152,26 +4150,26 @@ bool vnc_display_open(const char *id, Error **errp)
4150 if (!vd->tlscreds) {
4151 error_setg(errp, "Object with id '%s' is not TLS credentials",
4152 credid);
4155 - goto fail;
4153 + return false;
4154 }
4155 object_ref(OBJECT(vd->tlscreds));
4156
4157 if (!qcrypto_tls_creds_check_endpoint(vd->tlscreds,
4158 QCRYPTO_TLS_CREDS_ENDPOINT_SERVER,
4159 errp)) {
4162 - goto fail;
4160 + return false;
4161 }
4162 }
4163 tlsauthz = qemu_opt_get(opts, "tls-authz");
4164 if (tlsauthz && !vd->tlscreds) {
4165 error_setg(errp, "'tls-authz' provided but TLS is not enabled");
4168 - goto fail;
4166 + return false;
4167 }
4168
4169 saslauthz = qemu_opt_get(opts, "sasl-authz");
4170 if (saslauthz && !sasl) {
4171 error_setg(errp, "'sasl-authz' provided but SASL auth is not enabled");
4174 - goto fail;
4172 + return false;
4173 }
4174
4175 share = qemu_opt_get(opts, "share");
@@ -4184,7 +4182,7 @@ bool vnc_display_open(const char *id, Error **errp)
4182 vd->share_policy = VNC_SHARE_POLICY_FORCE_SHARED;
4183 } else {
4184 error_setg(errp, "unknown vnc share= option");
4187 - goto fail;
4185 + return false;
4186 }
4187 } else {
4188 vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
@@ -4218,20 +4216,20 @@ bool vnc_display_open(const char *id, Error **errp)
4216 if (vnc_display_setup_auth(&vd->auth, &vd->subauth,
4217 vd->tlscreds, password,
4218 sasl, false, errp) < 0) {
4221 - goto fail;
4219 + return false;
4220 }
4221 trace_vnc_auth_init(vd, 0, vd->auth, vd->subauth);
4222
4223 if (vnc_display_setup_auth(&vd->ws_auth, &vd->ws_subauth,
4224 vd->tlscreds, password,
4225 sasl, true, errp) < 0) {
4228 - goto fail;
4226 + return false;
4227 }
4228 trace_vnc_auth_init(vd, 1, vd->ws_auth, vd->ws_subauth);
4229
4230 #ifdef CONFIG_VNC_SASL
4231 if (sasl && !vnc_sasl_server_init(errp)) {
4234 - goto fail;
4232 + return false;
4233 }
4234 #endif
4235 vd->lock_key_sync = lock_key_sync;
@@ -4244,7 +4242,7 @@ bool vnc_display_open(const char *id, Error **errp)
4242 if (audiodev) {
4243 vd->audio_be = audio_be_by_name(audiodev, errp);
4244 if (!vd->audio_be) {
4247 - goto fail;
4245 + return false;
4246 }
4247 } else {
4248 vd->audio_be = audio_get_default_audio_be(NULL);
@@ -4258,7 +4256,7 @@ bool vnc_display_open(const char *id, Error **errp)
4256 con = qemu_console_lookup_by_device_name(device_id, head, &err);
4257 if (err) {
4258 error_propagate(errp, err);
4261 - goto fail;
4259 + return false;
4260 }
4261 } else {
4262 con = qemu_console_lookup_default();
@@ -4279,11 +4277,11 @@ bool vnc_display_open(const char *id, Error **errp)
4277
4278 if (reverse) {
4279 if (vnc_display_connect(vd, saddr_list, wsaddr_list, errp) < 0) {
4282 - goto fail;
4280 + return false;
4281 }
4282 } else {
4283 if (vnc_display_listen(vd, saddr_list, wsaddr_list, errp) < 0) {
4286 - goto fail;
4284 + return false;
4285 }
4286 }
4287
@@ -4291,12 +4289,7 @@ bool vnc_display_open(const char *id, Error **errp)
4289 vnc_display_print_local_addr(vd);
4290 }
4291
4294 - /* Success */
4292 return true;
4296 -
4297 -fail:
4298 - vnc_display_close(vd);
4299 - return false;
4293 }
4294
4295 void vnc_display_add_client(const char *id, int csock, bool skipauth)
@@ -4352,13 +4345,7 @@ int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
4345 id = vnc_auto_assign_id(opts);
4346 }
4347
4355 - if (!vnc_display_init(id, errp)) {
4356 - return -1;
4357 - }
4358 - if (!vnc_display_open(id, errp)) {
4359 - return -1;
4360 - }
4361 - return 0;
4348 + return vnc_display_new(id, errp) != NULL ? 0 : -1;
4349 }
4350
4351 static void vnc_register_config(void)
ui/vnc.h
+3
@@ -549,6 +549,9 @@ enum VncFeatures {
549 #define VNC_CLIPBOARD_NOTIFY (1 << 27)
550 #define VNC_CLIPBOARD_PROVIDE (1 << 28)
551
552 +VncDisplay *vnc_display_new(const char *id, Error **errp);
553 +void vnc_display_free(VncDisplay *vd);
554 +
555 /*****************************************************************************
556 *
557 * Internal APIs