From nobody Sat Nov 8 07:53:36 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1549467854545738.2791667872856; Wed, 6 Feb 2019 07:44:14 -0800 (PST) Received: from localhost ([127.0.0.1]:52872 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1grPMu-00036w-G7 for importer@patchew.org; Wed, 06 Feb 2019 10:44:08 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58254) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1grPG3-0006SY-QH for qemu-devel@nongnu.org; Wed, 06 Feb 2019 10:37:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1grPG1-0000NE-MI for qemu-devel@nongnu.org; Wed, 06 Feb 2019 10:37:03 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39010) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1grPFw-0000Ke-0t; Wed, 06 Feb 2019 10:36:57 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8E71159479; Wed, 6 Feb 2019 15:29:25 +0000 (UTC) Received: from localhost (unknown [10.40.205.248]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E056C7C824; Wed, 6 Feb 2019 15:29:23 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Wed, 6 Feb 2019 16:29:18 +0100 Message-Id: <20190206152919.5532-2-mreitz@redhat.com> In-Reply-To: <20190206152919.5532-1-mreitz@redhat.com> References: <20190206152919.5532-1-mreitz@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 06 Feb 2019 15:29:25 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 1/2] block/ssh: Implement .bdrv_refresh_filename() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Richard W . M . Jones" , qemu-devel@nongnu.org, Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Max Reitz --- block/ssh.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/block/ssh.c b/block/ssh.c index 190ef95300..88401bbd31 100644 --- a/block/ssh.c +++ b/block/ssh.c @@ -75,6 +75,14 @@ typedef struct BDRVSSHState { =20 /* Used to warn if 'flush' is not supported. */ bool unsafe_flush_warning; + + /* + * Store the user name for ssh_refresh_filename() because the + * default depends on the system you are on -- therefore, when we + * generate a filename, it should always contain the user name we + * are actually using. + */ + char *user; } BDRVSSHState; =20 static void ssh_state_init(BDRVSSHState *s) @@ -87,6 +95,8 @@ static void ssh_state_init(BDRVSSHState *s) =20 static void ssh_state_free(BDRVSSHState *s) { + g_free(s->user); + if (s->sftp_handle) { libssh2_sftp_close(s->sftp_handle); } @@ -640,14 +650,13 @@ static int connect_to_ssh(BDRVSSHState *s, BlockdevOp= tionsSsh *opts, int ssh_flags, int creat_mode, Error **errp) { int r, ret; - const char *user; long port =3D 0; =20 if (opts->has_user) { - user =3D opts->user; + s->user =3D g_strdup(opts->user); } else { - user =3D g_get_user_name(); - if (!user) { + s->user =3D g_strdup(g_get_user_name()); + if (!s->user) { error_setg_errno(errp, errno, "Can't get user name"); ret =3D -errno; goto err; @@ -697,7 +706,7 @@ static int connect_to_ssh(BDRVSSHState *s, BlockdevOpti= onsSsh *opts, } =20 /* Authenticate. */ - ret =3D authenticate(s, user, errp); + ret =3D authenticate(s, s->user, errp); if (ret < 0) { goto err; } @@ -1254,6 +1263,38 @@ static int coroutine_fn ssh_co_truncate(BlockDriverS= tate *bs, int64_t offset, return ssh_grow_file(s, offset, errp); } =20 +static void ssh_refresh_filename(BlockDriverState *bs) +{ + BDRVSSHState *s =3D bs->opaque; + const char *path, *host_key_check; + int ret; + + /* + * None of these options can be represented in a plain "host:port" + * format, so if any was given, we have to abort. + */ + if (s->inet->has_ipv4 || s->inet->has_ipv6 || s->inet->has_to || + s->inet->has_numeric) + { + return; + } + + path =3D qdict_get_try_str(bs->full_open_options, "path"); + assert(path); /* mandatory option */ + + host_key_check =3D qdict_get_try_str(bs->full_open_options, "host_key_= check"); + + ret =3D snprintf(bs->exact_filename, sizeof(bs->exact_filename), + "ssh://%s@%s:%s%s%s%s", + s->user, s->inet->host, s->inet->port, path, + host_key_check ? "?host_key_check=3D" : "", + host_key_check ?: ""); + if (ret >=3D sizeof(bs->exact_filename)) { + /* An overflow makes the filename unusable, so do not report any */ + bs->exact_filename[0] =3D '\0'; + } +} + static const char *const ssh_strong_runtime_opts[] =3D { "host", "port", @@ -1280,6 +1321,7 @@ static BlockDriver bdrv_ssh =3D { .bdrv_getlength =3D ssh_getlength, .bdrv_co_truncate =3D ssh_co_truncate, .bdrv_co_flush_to_disk =3D ssh_co_flush, + .bdrv_refresh_filename =3D ssh_refresh_filename, .create_opts =3D &ssh_create_opts, .strong_runtime_opts =3D ssh_strong_runtime_opts, }; --=20 2.20.1