From nobody Thu May 15 07:00:51 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1514913165528370.8433746057724; Tue, 2 Jan 2018 09:12:45 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 51055C05FFEE; Tue, 2 Jan 2018 17:12:44 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2CEF760C94; Tue, 2 Jan 2018 17:12:44 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id E9A963D381; Tue, 2 Jan 2018 17:12:43 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w02HCgU7003182 for ; Tue, 2 Jan 2018 12:12:42 -0500 Received: by smtp.corp.redhat.com (Postfix) id 626585C888; Tue, 2 Jan 2018 17:12:42 +0000 (UTC) Received: from localhost.localdomain (ovpn-204-45.brq.redhat.com [10.40.204.45]) by smtp.corp.redhat.com (Postfix) with ESMTP id C9A785C890 for ; Tue, 2 Jan 2018 17:12:41 +0000 (UTC) From: Michal Privoznik To: libvir-list@redhat.com Date: Tue, 2 Jan 2018 18:12:05 +0100 Message-Id: <508b51052f1d095880382ad37d5b80c1b16319d1.1514911024.git.mprivozn@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 12/18] vsh: Prune string list returned by completer X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 02 Jan 2018 17:12:44 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Instead of having completers prune returned string list based on user's input we can do that right after the callback is called. Only strings matching the prefix will be presented to the user then. Signed-off-by: Michal Privoznik --- tools/vsh.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/tools/vsh.c b/tools/vsh.c index 10a4ef69c..49e8033bd 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -2735,6 +2735,40 @@ vshReadlineCommandFindOpt(const vshCmd *partial, } =20 =20 +static int +vshCompleterFilter(char ***list, + const char *text) +{ + char **newList =3D NULL; + size_t newList_len =3D 0; + size_t list_len; + size_t i; + + if (!list || !*list) + return -1; + + list_len =3D virStringListLength((const char **) *list); + + if (VIR_ALLOC_N(newList, list_len + 1) < 0) + return -1; + + for (i =3D 0; i < list_len; i++) { + if (!STRPREFIX((*list)[i], text)) { + VIR_FREE((*list)[i]); + continue; + } + + VIR_STEAL_PTR(newList[newList_len], (*list)[i]); + newList_len++; + } + + ignore_value(VIR_REALLOC_N_QUIET(newList, newList_len + 1)); + VIR_FREE(*list); + *list =3D newList; + return 0; +} + + static char * vshReadlineParse(const char *text, int state) { @@ -2790,7 +2824,14 @@ vshReadlineParse(const char *text, int state) char **completer_list =3D opt->completer(autoCompleteOpaqu= e, partial, opt->completer_flag= s); - if (virStringListMerge(&list, &completer_list) < 0) { + + /* For string list returned by completer we have to do + * filtering based on @text because completer returns all + * possible strings. */ + + if (completer_list && + (vshCompleterFilter(&completer_list, text) < 0 || + virStringListMerge(&list, &completer_list) < 0)) { virStringListFree(completer_list); goto cleanup; } --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list