| From 1f5e04965db81bea1eac402110166290bfc774db Mon Sep 17 00:00:00 2001 |
| From: Jeffrey Cody <jcody@redhat.com> |
| Date: Sun, 1 Oct 2017 03:55:19 +0200 |
| Subject: [PATCH 4/4] block/ssh: Use QemuOpts for runtime options |
| |
| RH-Author: Jeffrey Cody <jcody@redhat.com> |
| Message-id: <798f4a5f4498382bd5764a5e7889595a36aab78c.1506829990.git.jcody@redhat.com> |
| Patchwork-id: 76786 |
| O-Subject: [RHEL-7.5 1/1] block/ssh: Use QemuOpts for runtime options |
| Bugzilla: 1461672 |
| RH-Acked-by: Thomas Huth <thuth@redhat.com> |
| RH-Acked-by: Markus Armbruster <armbru@redhat.com> |
| RH-Acked-by: Max Reitz <mreitz@redhat.com> |
| |
| From: Max Reitz <mreitz@redhat.com> |
| |
| Using QemuOpts will prevent qemu from crashing if the input options have |
| not been validated (which is the case when they are specified on the |
| command line or in a json: filename) and some have the wrong type. |
| |
| Signed-off-by: Max Reitz <mreitz@redhat.com> |
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> |
| (cherry picked from commit 8a6a80896d6af03b8ee0c17cdf37219eca2588a7) |
| Signed-off-by: Jeff Cody <jcody@redhat.com> |
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> |
| |
| block/ssh.c | 79 ++++++++++++++++++++++++++++++++++++++++++------------------- |
| 1 file changed, 55 insertions(+), 24 deletions(-) |
| |
| diff --git a/block/ssh.c b/block/ssh.c |
| index b00ff7f..a9341b8 100644 |
| |
| |
| @@ -510,36 +510,73 @@ static int authenticate(BDRVSSHState *s, const char *user, Error **errp) |
| return ret; |
| } |
| |
| +static QemuOptsList ssh_runtime_opts = { |
| + .name = "ssh", |
| + .head = QTAILQ_HEAD_INITIALIZER(ssh_runtime_opts.head), |
| + .desc = { |
| + { |
| + .name = "host", |
| + .type = QEMU_OPT_STRING, |
| + .help = "Host to connect to", |
| + }, |
| + { |
| + .name = "port", |
| + .type = QEMU_OPT_NUMBER, |
| + .help = "Port to connect to", |
| + }, |
| + { |
| + .name = "path", |
| + .type = QEMU_OPT_STRING, |
| + .help = "Path of the image on the host", |
| + }, |
| + { |
| + .name = "user", |
| + .type = QEMU_OPT_STRING, |
| + .help = "User as which to connect", |
| + }, |
| + { |
| + .name = "host_key_check", |
| + .type = QEMU_OPT_STRING, |
| + .help = "Defines how and what to check the host key against", |
| + }, |
| + }, |
| +}; |
| + |
| static int connect_to_ssh(BDRVSSHState *s, QDict *options, |
| int ssh_flags, int creat_mode, Error **errp) |
| { |
| int r, ret; |
| + QemuOpts *opts = NULL; |
| + Error *local_err = NULL; |
| const char *host, *user, *path, *host_key_check; |
| int port; |
| |
| - if (!qdict_haskey(options, "host")) { |
| + opts = qemu_opts_create(&ssh_runtime_opts, NULL, 0, &error_abort); |
| + qemu_opts_absorb_qdict(opts, options, &local_err); |
| + if (local_err) { |
| ret = -EINVAL; |
| - error_setg(errp, "No hostname was specified"); |
| + error_propagate(errp, local_err); |
| goto err; |
| } |
| - host = qdict_get_str(options, "host"); |
| |
| - if (qdict_haskey(options, "port")) { |
| - port = qdict_get_int(options, "port"); |
| - } else { |
| - port = 22; |
| + host = qemu_opt_get(opts, "host"); |
| + if (!host) { |
| + ret = -EINVAL; |
| + error_setg(errp, "No hostname was specified"); |
| + goto err; |
| } |
| |
| - if (!qdict_haskey(options, "path")) { |
| + port = qemu_opt_get_number(opts, "port", 22); |
| + |
| + path = qemu_opt_get(opts, "path"); |
| + if (!path) { |
| ret = -EINVAL; |
| error_setg(errp, "No path was specified"); |
| goto err; |
| } |
| - path = qdict_get_str(options, "path"); |
| |
| - if (qdict_haskey(options, "user")) { |
| - user = qdict_get_str(options, "user"); |
| - } else { |
| + user = qemu_opt_get(opts, "user"); |
| + if (!user) { |
| user = g_get_user_name(); |
| if (!user) { |
| error_setg_errno(errp, errno, "Can't get user name"); |
| @@ -548,9 +585,8 @@ static int connect_to_ssh(BDRVSSHState *s, QDict *options, |
| } |
| } |
| |
| - if (qdict_haskey(options, "host_key_check")) { |
| - host_key_check = qdict_get_str(options, "host_key_check"); |
| - } else { |
| + host_key_check = qemu_opt_get(opts, "host_key_check"); |
| + if (!host_key_check) { |
| host_key_check = "yes"; |
| } |
| |
| @@ -614,21 +650,14 @@ static int connect_to_ssh(BDRVSSHState *s, QDict *options, |
| goto err; |
| } |
| |
| + qemu_opts_del(opts); |
| + |
| r = libssh2_sftp_fstat(s->sftp_handle, &s->attrs); |
| if (r < 0) { |
| sftp_error_setg(errp, s, "failed to read file attributes"); |
| return -EINVAL; |
| } |
| |
| - /* Delete the options we've used; any not deleted will cause the |
| - * block layer to give an error about unused options. |
| - */ |
| - qdict_del(options, "host"); |
| - qdict_del(options, "port"); |
| - qdict_del(options, "user"); |
| - qdict_del(options, "path"); |
| - qdict_del(options, "host_key_check"); |
| - |
| return 0; |
| |
| err: |
| @@ -648,6 +677,8 @@ static int connect_to_ssh(BDRVSSHState *s, QDict *options, |
| } |
| s->session = NULL; |
| |
| + qemu_opts_del(opts); |
| + |
| return ret; |
| } |
| |
| -- |
| 1.8.3.1 |
| |