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.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
include/ui/console.h | 2 --
ui/vnc.h | 3 +++
ui/vnc.c | 75 ++++++++++++++++++++++------------------------------
3 files changed, 35 insertions(+), 45 deletions(-)
diff --git a/include/ui/console.h b/include/ui/console.h
index f9b4665cb90..1794f1a2cf0 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -448,8 +448,6 @@ const char *qemu_display_get_vc(DisplayOptions *opts);
void qemu_display_help(void);
/* vnc.c */
-bool vnc_display_init(const char *id, Error **errp);
-bool vnc_display_open(const char *id, Error **errp);
void vnc_display_add_client(const char *id, int csock, bool skipauth);
int vnc_display_password(const char *id, const char *password, Error **errp);
int vnc_display_pw_expire(const char *id, time_t expires);
diff --git a/ui/vnc.h b/ui/vnc.h
index 9a09fcdad8b..de41517be48 100644
--- a/ui/vnc.h
+++ b/ui/vnc.h
@@ -550,6 +550,9 @@ enum VncFeatures {
#define VNC_CLIPBOARD_NOTIFY (1 << 27)
#define VNC_CLIPBOARD_PROVIDE (1 << 28)
+VncDisplay *vnc_display_new(const char *id, Error **errp);
+void vnc_display_free(VncDisplay *vd);
+
/*****************************************************************************
*
* Internal APIs
diff --git a/ui/vnc.c b/ui/vnc.c
index 0775417c418..4d5b36a6fa8 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3423,14 +3423,14 @@ static void vmstate_change_handler(void *opaque, bool running, RunState state)
update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
}
-static void vnc_display_free(VncDisplay *vd);
+static bool vnc_display_open(VncDisplay *vd, Error **errp);
-bool vnc_display_init(const char *id, Error **errp)
+VncDisplay *vnc_display_new(const char *id, Error **errp)
{
VncDisplay *vd;
if (vnc_display_find(id) != NULL) {
- return true;
+ return NULL;
}
vd = g_malloc0(sizeof(*vd));
@@ -3451,7 +3451,7 @@ bool vnc_display_init(const char *id, Error **errp)
if (!vd->kbd_layout) {
vnc_display_free(vd);
- return false;
+ return NULL;
}
vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
@@ -3464,8 +3464,13 @@ bool vnc_display_init(const char *id, Error **errp)
vd->vmstate_handler_entry = qemu_add_vm_change_state_handler(
&vmstate_change_handler, vd);
+ if (!vnc_display_open(vd, errp)) {
+ vnc_display_free(vd);
+ return NULL;
+ }
+
QTAILQ_INSERT_TAIL(&vnc_displays, vd, next);
- return true;
+ return vd;
}
static void vnc_display_close(VncDisplay *vd)
@@ -3510,7 +3515,7 @@ static void vnc_display_close(VncDisplay *vd)
#endif
}
-static void vnc_display_free(VncDisplay *vd)
+void vnc_display_free(VncDisplay *vd)
{
if (!vd) {
return;
@@ -3532,7 +3537,6 @@ static void vnc_display_free(VncDisplay *vd)
g_free(vd);
}
-
int vnc_display_password(const char *id, const char *password, Error **errp)
{
VncDisplay *vd = vnc_display_find(id);
@@ -4075,10 +4079,9 @@ bool vnc_display_update(DisplayUpdateOptionsVNC *arg, Error **errp)
return true;
}
-bool vnc_display_open(const char *id, Error **errp)
+static bool vnc_display_open(VncDisplay *vd, Error **errp)
{
- VncDisplay *vd = vnc_display_find(id);
- QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
+ QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, vd->id);
g_autoptr(SocketAddressList) saddr_list = NULL;
g_autoptr(SocketAddressList) wsaddr_list = NULL;
const char *share, *device_id;
@@ -4097,26 +4100,23 @@ bool vnc_display_open(const char *id, Error **errp)
assert(vd);
assert(opts);
- vnc_display_close(vd);
-
reverse = qemu_opt_get_bool(opts, "reverse", false);
if (vnc_display_get_addresses(opts, reverse, &saddr_list, &wsaddr_list,
errp) < 0) {
- goto fail;
+ return false;
}
-
passwordSecret = qemu_opt_get(opts, "password-secret");
if (passwordSecret) {
if (qemu_opt_get(opts, "password")) {
error_setg(errp,
"'password' flag is redundant with 'password-secret'");
- goto fail;
+ return false;
}
vd->password = qcrypto_secret_lookup_as_utf8(passwordSecret,
errp);
if (!vd->password) {
- goto fail;
+ return false;
}
password = true;
} else {
@@ -4127,7 +4127,7 @@ bool vnc_display_open(const char *id, Error **errp)
QCRYPTO_CIPHER_ALGO_DES, QCRYPTO_CIPHER_MODE_ECB)) {
error_setg(errp,
"Cipher backend does not support DES algorithm");
- goto fail;
+ return false;
}
}
@@ -4137,7 +4137,7 @@ bool vnc_display_open(const char *id, Error **errp)
#ifndef CONFIG_VNC_SASL
if (sasl) {
error_setg(errp, "VNC SASL auth requires cyrus-sasl support");
- goto fail;
+ return false;
}
#endif /* CONFIG_VNC_SASL */
credid = qemu_opt_get(opts, "tls-creds");
@@ -4148,7 +4148,7 @@ bool vnc_display_open(const char *id, Error **errp)
if (!creds) {
error_setg(errp, "No TLS credentials with id '%s'",
credid);
- goto fail;
+ return false;
}
vd->tlscreds = (QCryptoTLSCreds *)
object_dynamic_cast(creds,
@@ -4156,26 +4156,26 @@ bool vnc_display_open(const char *id, Error **errp)
if (!vd->tlscreds) {
error_setg(errp, "Object with id '%s' is not TLS credentials",
credid);
- goto fail;
+ return false;
}
object_ref(OBJECT(vd->tlscreds));
if (!qcrypto_tls_creds_check_endpoint(vd->tlscreds,
QCRYPTO_TLS_CREDS_ENDPOINT_SERVER,
errp)) {
- goto fail;
+ return false;
}
}
tlsauthz = qemu_opt_get(opts, "tls-authz");
if (tlsauthz && !vd->tlscreds) {
error_setg(errp, "'tls-authz' provided but TLS is not enabled");
- goto fail;
+ return false;
}
saslauthz = qemu_opt_get(opts, "sasl-authz");
if (saslauthz && !sasl) {
error_setg(errp, "'sasl-authz' provided but SASL auth is not enabled");
- goto fail;
+ return false;
}
share = qemu_opt_get(opts, "share");
@@ -4188,7 +4188,7 @@ bool vnc_display_open(const char *id, Error **errp)
vd->share_policy = VNC_SHARE_POLICY_FORCE_SHARED;
} else {
error_setg(errp, "unknown vnc share= option");
- goto fail;
+ return false;
}
} else {
vd->share_policy = VNC_SHARE_POLICY_ALLOW_EXCLUSIVE;
@@ -4222,20 +4222,20 @@ bool vnc_display_open(const char *id, Error **errp)
if (vnc_display_setup_auth(&vd->auth, &vd->subauth,
vd->tlscreds, password,
sasl, false, errp) < 0) {
- goto fail;
+ return false;
}
trace_vnc_auth_init(vd, 0, vd->auth, vd->subauth);
if (vnc_display_setup_auth(&vd->ws_auth, &vd->ws_subauth,
vd->tlscreds, password,
sasl, true, errp) < 0) {
- goto fail;
+ return false;
}
trace_vnc_auth_init(vd, 1, vd->ws_auth, vd->ws_subauth);
#ifdef CONFIG_VNC_SASL
if (sasl && !vnc_sasl_server_init(errp)) {
- goto fail;
+ return false;
}
#endif
vd->lock_key_sync = lock_key_sync;
@@ -4248,7 +4248,7 @@ bool vnc_display_open(const char *id, Error **errp)
if (audiodev) {
vd->audio_be = audio_be_by_name(audiodev, errp);
if (!vd->audio_be) {
- goto fail;
+ return false;
}
} else {
vd->audio_be = audio_get_default_audio_be(NULL);
@@ -4262,7 +4262,7 @@ bool vnc_display_open(const char *id, Error **errp)
con = qemu_console_lookup_by_device_name(device_id, head, &err);
if (err) {
error_propagate(errp, err);
- goto fail;
+ return false;
}
} else {
con = qemu_console_lookup_default();
@@ -4283,11 +4283,11 @@ bool vnc_display_open(const char *id, Error **errp)
if (reverse) {
if (vnc_display_connect(vd, saddr_list, wsaddr_list, errp) < 0) {
- goto fail;
+ return false;
}
} else {
if (vnc_display_listen(vd, saddr_list, wsaddr_list, errp) < 0) {
- goto fail;
+ return false;
}
}
@@ -4295,12 +4295,7 @@ bool vnc_display_open(const char *id, Error **errp)
vnc_display_print_local_addr(vd);
}
- /* Success */
return true;
-
-fail:
- vnc_display_close(vd);
- return false;
}
void vnc_display_add_client(const char *id, int csock, bool skipauth)
@@ -4356,13 +4351,7 @@ int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
id = vnc_auto_assign_id(opts);
}
- if (!vnc_display_init(id, errp)) {
- return -1;
- }
- if (!vnc_display_open(id, errp)) {
- return -1;
- }
- return 0;
+ return vnc_display_new(id, errp) != NULL ? 0 : -1;
}
static void vnc_register_config(void)
--
2.53.0