From patchwork Thu Nov 12 17:58:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900905 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B19CF139F for ; Thu, 12 Nov 2020 18:01:28 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5984F2068D for ; Thu, 12 Nov 2020 18:01:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="OP2d23t3" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5984F2068D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:50828 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdGuV-0002qV-4e for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:01:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37462) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGsb-0000uV-50 for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:29 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:28362) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGsX-0000fo-Sm for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:28 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203963; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KcUhZsrL+ski9bi9B4iBEMulBP+XCAux3g/xrg6Tyww=; b=OP2d23t3R7XBZdjpzTxCB+WW4ASXV3dQYsAtY/rMkX4ONrkNw9ptwhSsjPpQVWEQh93HZM PUwYl7+rZCgeFrLZRfM2fqup0FjYbGI+8Jx0CITXmfl4y48BIUOkPqA9Hk2E40w/IaSREb y9vOwe5BTlBpi8FFFZ7OVx8nspLZNMA= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-390-kztVKnCKN-CZIOl88b_M8Q-1; Thu, 12 Nov 2020 12:59:22 -0500 X-MC-Unique: kztVKnCKN-CZIOl88b_M8Q-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2BAC3802ED7 for ; Thu, 12 Nov 2020 17:59:21 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7B3AE1002C1B; Thu, 12 Nov 2020 17:59:19 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 01/13] char: Factor out qemu_chr_print_types() Date: Thu, 12 Nov 2020 18:58:53 +0100 Message-Id: <20201112175905.404472-2-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=63.128.21.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 00:52:29 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" We'll want to call the same from a non-QemuOpts code path. Signed-off-by: Kevin Wolf Reviewed-by: Marc-André Lureau Reviewed-by: Markus Armbruster --- include/chardev/char.h | 1 + chardev/char.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/include/chardev/char.h b/include/chardev/char.h index db42f0a8c6..3b91645081 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -212,6 +212,7 @@ void qemu_chr_be_update_read_handlers(Chardev *s, */ void qemu_chr_be_event(Chardev *s, QEMUChrEvent event); +void qemu_chr_print_types(void); int qemu_chr_add_client(Chardev *s, int fd); Chardev *qemu_chr_find(const char *name); diff --git a/chardev/char.c b/chardev/char.c index f9e297185d..de39e2d79b 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -644,6 +644,15 @@ ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, Error **errp) return backend; } +void qemu_chr_print_types(void) +{ + g_autoptr(GString) str = g_string_new(""); + + chardev_name_foreach(help_string_append, str); + + qemu_printf("Available chardev backend types: %s\n", str->str); +} + Chardev *qemu_chr_new_from_opts(QemuOpts *opts, GMainContext *context, Error **errp) { @@ -655,12 +664,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, GMainContext *context, char *bid = NULL; if (name && is_help_option(name)) { - GString *str = g_string_new(""); - - chardev_name_foreach(help_string_append, str); - - qemu_printf("Available chardev backend types: %s\n", str->str); - g_string_free(str, true); + qemu_chr_print_types(); return NULL; } From patchwork Thu Nov 12 17:58:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900911 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C6B70139F for ; Thu, 12 Nov 2020 18:01:33 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 59AEF2068D for ; Thu, 12 Nov 2020 18:01:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="I+p+SuVW" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 59AEF2068D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:51258 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdGua-00031J-87 for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:01:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37516) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGsc-0000x0-JE for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:30 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:45289) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGsY-0000h3-HF for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:30 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203965; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=brrwAzckZKubYRKEL1qFF6eeSMZpOl1mirWTlSRGFgk=; b=I+p+SuVWuLjtrbKwNoYRnSjNZA8fJjfDaIW9Zmm5EBIikUFjxGj6Ap56Gocr0HI/5XVm18 meTagiiHBRErYbY0MWiJGo6OQ/enM/QKEpynaYJfLRjAKWPzeM/HlsYSxNXljMUn2Z3qQ7 KPGZmwztQzFHWnkho1xAy//uTg0XSjY= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-79-LZXVvQMOMt-knHZ4etNm8w-1; Thu, 12 Nov 2020 12:59:23 -0500 X-MC-Unique: LZXVvQMOMt-knHZ4etNm8w-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F059518B9EB8 for ; Thu, 12 Nov 2020 17:59:22 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 76F3D1002C1B; Thu, 12 Nov 2020 17:59:21 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 02/13] char: Add ChardevOptions and qemu_chr_new_cli() Date: Thu, 12 Nov 2020 18:58:54 +0100 Message-Id: <20201112175905.404472-3-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=216.205.24.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 08:00:44 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" This provides an interface to create a chardev from a QAPI representation of the command line. At this point, the only difference between it and QMP chardev-add is that it allows 'backend' to be flattened and returns a Chardev pointer. We'll add support for mux=on and more compatibility glue to support legacy command line syntax later. Signed-off-by: Kevin Wolf --- qapi/char.json | 15 +++++++++++++++ include/chardev/char.h | 9 +++++++++ chardev/char.c | 24 ++++++++++++++++++------ 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/qapi/char.json b/qapi/char.json index 43486d1daa..14ee06a52d 100644 --- a/qapi/char.json +++ b/qapi/char.json @@ -435,6 +435,21 @@ { 'struct' : 'ChardevReturn', 'data': { '*pty': 'str' } } +## +# @ChardevOptions: +# +# Command line options for creating a character device backend +# +# @id: the chardev's ID, must be unique +# @backend: backend type and parameters +# +# Since: 6.0 +## +{ 'struct': 'ChardevOptions', + 'data': { 'id': 'str', + 'backend': 'ChardevBackend' }, + 'aliases': [ { 'source': ['backend'] } ] } + ## # @chardev-add: # diff --git a/include/chardev/char.h b/include/chardev/char.h index 3b91645081..54fa2ed8e2 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -85,6 +85,15 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, GMainContext *context, Error **errp); +/** + * qemu_chr_new_cli: + * @options: Character device creation options as defined in QAPI + * + * Returns: on success: a new character backend + * otherwise: NULL; @errp specifies the error + */ +Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp); + /** * qemu_chr_parse_common: * @opts: the options that still need parsing diff --git a/chardev/char.c b/chardev/char.c index de39e2d79b..9f00e475d4 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -1037,20 +1037,27 @@ Chardev *qemu_chardev_new(const char *id, const char *typename, return chardev_new(id, typename, backend, gcontext, errp); } -ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, - Error **errp) +static Chardev *chardev_new_qapi(const char *id, ChardevBackend *backend, + Error **errp) { const ChardevClass *cc; - ChardevReturn *ret; - Chardev *chr; cc = char_get_class(ChardevBackendKind_str(backend->type), errp); if (!cc) { return NULL; } - chr = chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)), - backend, NULL, errp); + return chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)), + backend, NULL, errp); +} + +ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, + Error **errp) +{ + ChardevReturn *ret; + Chardev *chr; + + chr = chardev_new_qapi(id, backend, errp); if (!chr) { return NULL; } @@ -1064,6 +1071,11 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, return ret; } +Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp) +{ + return chardev_new_qapi(options->id, options->backend, errp); +} + ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend, Error **errp) { From patchwork Thu Nov 12 17:58:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900909 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 15D96139F for ; Thu, 12 Nov 2020 18:01:32 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A4CDD2068D for ; Thu, 12 Nov 2020 18:01:31 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="D9Rc0jTn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A4CDD2068D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:51124 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdGuY-0002xr-EG for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:01:30 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37512) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGsc-0000w4-1S for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:30 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:37155) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGsa-0000hC-7c for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:29 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203967; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=J7O4/C63N+lM0owXek/SW3yejcRRJjOniSEc/vUtMRQ=; b=D9Rc0jTnHeQzvJJiIiGlzOtlx2LnHIcGm645GC/DhuDSflVDzx5vHowfVptCLIipmm55eA nvrjEC/VBhmlI0tEqUpswswhnOaxqFOJ3WsEA/ys7jHMUWBw/iRmNbicCOvPLrjYXswu8n XZcawRTSWtlDN62wtG0s//x6P6rJ/NA= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-10-9iK_nbz4O4mgYavr501b5g-1; Thu, 12 Nov 2020 12:59:25 -0500 X-MC-Unique: 9iK_nbz4O4mgYavr501b5g-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C84FB108597E for ; Thu, 12 Nov 2020 17:59:24 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4FA591002C25; Thu, 12 Nov 2020 17:59:23 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 03/13] char: Some QAPI aliases for CLI compatibility Date: Thu, 12 Nov 2020 18:58:55 +0100 Message-Id: <20201112175905.404472-4-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=63.128.21.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 00:52:29 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" For all chardev backend types where this is enough to achieve compatibility with the old QemuOpts based command line parser, add aliases to the QAPI schema. Signed-off-by: Kevin Wolf --- qapi/char.json | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/qapi/char.json b/qapi/char.json index 14ee06a52d..91c0dbfa1e 100644 --- a/qapi/char.json +++ b/qapi/char.json @@ -227,7 +227,8 @@ 'data': { '*in': 'str', 'out': 'str', '*append': 'bool' }, - 'base': 'ChardevCommon' } + 'base': 'ChardevCommon', + 'aliases': [ {'alias': 'path', 'source': ['out'] } ] } ## # @ChardevHostdev: @@ -241,7 +242,8 @@ ## { 'struct': 'ChardevHostdev', 'data': { 'device': 'str' }, - 'base': 'ChardevCommon' } + 'base': 'ChardevCommon', + 'aliases': [ {'alias': 'path', 'source': ['device'] } ] } ## # @ChardevSocket: @@ -342,7 +344,8 @@ { 'struct': 'ChardevSpiceChannel', 'data': { 'type': 'str' }, 'base': 'ChardevCommon', - 'if': 'defined(CONFIG_SPICE)' } + 'if': 'defined(CONFIG_SPICE)', + 'aliases': [ {'alias': 'name', 'source': ['type'] } ] } ## # @ChardevSpicePort: @@ -356,7 +359,8 @@ { 'struct': 'ChardevSpicePort', 'data': { 'fqdn': 'str' }, 'base': 'ChardevCommon', - 'if': 'defined(CONFIG_SPICE)' } + 'if': 'defined(CONFIG_SPICE)', + 'aliases': [ {'alias': 'name', 'source': ['fqdn'] } ] } ## # @ChardevVC: @@ -420,7 +424,8 @@ 'vc': 'ChardevVC', 'ringbuf': 'ChardevRingbuf', # next one is just for compatibility - 'memory': 'ChardevRingbuf' } } + 'memory': 'ChardevRingbuf' }, + 'aliases': [ { 'source': ['data'] } ] } ## # @ChardevReturn: From patchwork Thu Nov 12 17:58:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900921 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4CA7B15E6 for ; Thu, 12 Nov 2020 18:04:06 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id EB23A22201 for ; Thu, 12 Nov 2020 18:04:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="BE2bCKi4" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EB23A22201 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:59582 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdGx2-0006Rt-S3 for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:04:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37538) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGse-0000zw-39 for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:32 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:20260) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGsc-0000id-5i for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:31 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203969; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PwGmz9tmglOIJ2F0kmo9wDUc9dyIypq6pHdcqyM+wpA=; b=BE2bCKi4Iy8385wEN25gtrBX2ZAiDfXMBdCe0Bc0ykO7DgrjBVRXCIHFuxBDcvchtcN1Up doFFsGkYXdK2qm8gc5XLgJQh+QOC0Wbf5XKdsa3C8frK8/Yb09OLcW7SH2ITfCdncQIBUa pI8Lafj38ZJWftkNCkgEqhEFnCVYDdk= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-385-VU45RMZvMXGzeGCmloKV3Q-1; Thu, 12 Nov 2020 12:59:27 -0500 X-MC-Unique: VU45RMZvMXGzeGCmloKV3Q-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9AEC080474A for ; Thu, 12 Nov 2020 17:59:26 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2059A1002C1B; Thu, 12 Nov 2020 17:59:24 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 04/13] char: Add qemu_chr_translate_legacy_options() Date: Thu, 12 Nov 2020 18:58:56 +0100 Message-Id: <20201112175905.404472-5-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=216.205.24.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 08:00:44 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" This translates legacy command line options that can't be made compatible with QAPI just by using aliases from the traditional command line structure into the structure of ChardevOptions. As a first step, add support for backend name aliases if 'backend' is given instead of 'type'. Also add a todo comment for everything that is still incompatible between the QemuOpts based -chardev and chardev creation by going through a keyval parser, qemu_chr_translate_legacy_options() and qemu_chr_new_cli(). Signed-off-by: Kevin Wolf --- include/chardev/char.h | 13 +++++++++++++ chardev/char.c | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/chardev/char.h b/include/chardev/char.h index 54fa2ed8e2..7795e17ca5 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -94,6 +94,19 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, */ Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp); +/** + * qemu_chr_translate_legacy_options: + * @args: Character device creation options as returned by the keyval parser + * + * Change @args so that the legacy command line options in it are translated + * and @args can be used as the input for a ChardevOptions visitor. + * + * If @args was not a valid legacy command line, translation may be partially + * skipped and the visitor may return an error if @args was not already + * suitable for QAPI parsing. + */ +void qemu_chr_translate_legacy_options(QDict *args); + /** * qemu_chr_parse_common: * @opts: the options that still need parsing diff --git a/chardev/char.c b/chardev/char.c index 9f00e475d4..40c3f02ec9 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -32,6 +32,7 @@ #include "chardev/char.h" #include "qapi/error.h" #include "qapi/qapi-commands-char.h" +#include "qapi/qmp/qdict.h" #include "qapi/qmp/qerror.h" #include "sysemu/replay.h" #include "qemu/help_option.h" @@ -717,6 +718,28 @@ out: return chr; } +void qemu_chr_translate_legacy_options(QDict *args) +{ + const char *name; + + /* "backend" instead of "type" enables legacy CLI compatibility */ + name = qdict_get_try_str(args, "backend"); + if (!name || qdict_haskey(args, "type")) { + return; + } + + name = chardev_alias_translate(name); + qdict_put_str(args, "type", name); + qdict_del(args, "backend"); + + /* + * TODO: + * All backend types: "mux" + * socket: "addr.type", "delay", "server", "wait", "fd" + * udp: defaults for "host"/"localaddr"/"localport" + */ +} + Chardev *qemu_chr_new_noreplay(const char *label, const char *filename, bool permit_mux_mon, GMainContext *context) { From patchwork Thu Nov 12 17:58:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900927 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E7D51139F for ; Thu, 12 Nov 2020 18:05:15 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9251322201 for ; Thu, 12 Nov 2020 18:05:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="LfDTufrx" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9251322201 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:34670 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdGyA-0007qp-H6 for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:05:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37560) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGsf-00012j-NF for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:33 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:56707) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGsd-0000iz-Of for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:33 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203971; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LFTDr825FMzPBU3tjZJr268wIpQ/iffr0DrtR876y14=; b=LfDTufrxpOhi5ZO21jkHMp16pIoNswSCVST2d8JCXnYi+y7KRkf4nnFTXEZO6OQEj2AJuw WdhIYfwgXP889DJMQ6K+IzyBViSzi2QYq6OJ/vis2oWe2PLUJM8dsSZP1S1yQ+CHOlHXI4 ifmvquqUvcm3pbqZ3S6HcX4t29FQdXk= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-109-Jpjv-h99N_y4LqsUvqIGww-1; Thu, 12 Nov 2020 12:59:29 -0500 X-MC-Unique: Jpjv-h99N_y4LqsUvqIGww-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6FB6210199A8 for ; Thu, 12 Nov 2020 17:59:28 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id E781A1002C1B; Thu, 12 Nov 2020 17:59:26 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 05/13] char-socket: Implement compat code for CLI QAPIfication Date: Thu, 12 Nov 2020 18:58:57 +0100 Message-Id: <20201112175905.404472-6-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=216.205.24.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 08:00:44 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Socket backends have a few differences between CLI and QMP. This adds QAPI aliases and a .translate_legacy_options() implementation that converts CLI inputs to a form that's usable for a QAPIfied --chardev. Signed-off-by: Kevin Wolf --- qapi/char.json | 3 ++- qapi/sockets.json | 6 ++++- include/chardev/char.h | 1 + chardev/char-socket.c | 53 ++++++++++++++++++++++++++++++++++++++++++ chardev/char.c | 10 +++++++- 5 files changed, 70 insertions(+), 3 deletions(-) diff --git a/qapi/char.json b/qapi/char.json index 91c0dbfa1e..1930e90e95 100644 --- a/qapi/char.json +++ b/qapi/char.json @@ -287,7 +287,8 @@ '*tn3270': 'bool', '*websocket': 'bool', '*reconnect': 'int' }, - 'base': 'ChardevCommon' } + 'base': 'ChardevCommon', + 'aliases': [ { 'source': ['addr'] } ] } ## # @ChardevUdp: diff --git a/qapi/sockets.json b/qapi/sockets.json index 2e83452797..8c61787311 100644 --- a/qapi/sockets.json +++ b/qapi/sockets.json @@ -125,7 +125,11 @@ 'inet': 'InetSocketAddress', 'unix': 'UnixSocketAddress', 'vsock': 'VsockSocketAddress', - 'fd': 'String' } } + 'fd': 'String' }, + 'aliases': [ + {'source': ['data']}, + {'alias': 'fd', 'source': ['data', 'str']} + ]} ## # @SocketAddressType: diff --git a/include/chardev/char.h b/include/chardev/char.h index 7795e17ca5..c0944f5828 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -275,6 +275,7 @@ struct ChardevClass { bool internal; /* TODO: eventually use TYPE_USER_CREATABLE */ void (*parse)(QemuOpts *opts, ChardevBackend *backend, Error **errp); + void (*translate_legacy_options)(QDict *args); void (*open)(Chardev *chr, ChardevBackend *backend, bool *be_opened, Error **errp); diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 213a4c8dd0..6bf916a3e4 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -34,6 +34,7 @@ #include "qapi/error.h" #include "qapi/clone-visitor.h" #include "qapi/qapi-visit-sockets.h" +#include "qapi/qmp/qdict.h" #include "chardev/char-io.h" #include "qom/object.h" @@ -1484,6 +1485,57 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend, sock->addr = addr; } +static void qemu_chr_translate_socket(QDict *args) +{ + const char *path = qdict_get_try_str(args, "path"); + const char *host = qdict_get_try_str(args, "host"); + const char *fd = qdict_get_try_str(args, "fd"); + const char *delay = qdict_get_try_str(args, "delay"); + const char *server = qdict_get_try_str(args, "server"); + const char *wait = qdict_get_try_str(args, "wait"); + QDict *addr; + + if ((!!path + !!fd + !!host) != 1) { + return; + } + + /* If "addr" is not present, automatically set the type */ + if (!qdict_haskey(args, "addr")) { + addr = qdict_new(); + qdict_put(args, "addr", addr); + + if (path) { + qdict_put_str(addr, "type", "unix"); + } else if (host) { + qdict_put_str(addr, "type", "inet"); + } else if (fd) { + qdict_put_str(addr, "type", "fd"); + } + } + + /* "delay" is translated into "nodelay" */ + if (delay && !qdict_haskey(args, "nodelay")) { + if (!strcmp(delay, "on")) { + qdict_put_str(args, "nodelay", "off"); + qdict_del(args, "delay"); + } else if (!strcmp(delay, "off")) { + qdict_put_str(args, "nodelay", "on"); + qdict_del(args, "delay"); + } + } + + /* "server=off" is the CLI default */ + if (!server) { + server = "off"; + qdict_put_str(args, "server", server); + } + + /* "wait=on" is the default if "server=on" */ + if (!wait && !strcmp(server, "on")) { + qdict_put_str(args, "wait", "on"); + } +} + static void char_socket_get_addr(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) @@ -1506,6 +1558,7 @@ static void char_socket_class_init(ObjectClass *oc, void *data) ChardevClass *cc = CHARDEV_CLASS(oc); cc->parse = qemu_chr_parse_socket; + cc->translate_legacy_options = qemu_chr_translate_socket; cc->open = qmp_chardev_open_socket; cc->chr_wait_connected = tcp_chr_wait_connected; cc->chr_write = tcp_chr_write; diff --git a/chardev/char.c b/chardev/char.c index 40c3f02ec9..91b44e53b6 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -720,6 +720,7 @@ out: void qemu_chr_translate_legacy_options(QDict *args) { + const ChardevClass *cc; const char *name; /* "backend" instead of "type" enables legacy CLI compatibility */ @@ -730,12 +731,19 @@ void qemu_chr_translate_legacy_options(QDict *args) name = chardev_alias_translate(name); qdict_put_str(args, "type", name); + + cc = char_get_class(name, NULL); + if (cc != NULL && cc->translate_legacy_options) { + QDict *backend_data = qdict_get_qdict(args, "data") ?: args; + cc->translate_legacy_options(backend_data); + } + + /* name may refer to a QDict entry, so delete it only now */ qdict_del(args, "backend"); /* * TODO: * All backend types: "mux" - * socket: "addr.type", "delay", "server", "wait", "fd" * udp: defaults for "host"/"localaddr"/"localport" */ } From patchwork Thu Nov 12 17:58:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900919 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CE763139F for ; Thu, 12 Nov 2020 18:03:57 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7127D22201 for ; Thu, 12 Nov 2020 18:03:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="JrusxmJU" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7127D22201 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:59296 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdGwu-0006KZ-8V for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:03:56 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37572) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGsh-00016d-TA for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:36 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:49835) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGsg-0000k7-4k for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:35 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203973; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XfBtdCrHrY0GE11uvQp4B1YBBuunGOE6QdtyUEXq38k=; b=JrusxmJUZL4wizIwQE5irNQImrWjmBgx0/BsGE1+wpuab7lnP3Lkj+ZeVlYO7Gt7XSLW5U r8N+bKfqeadxDD340eb8gcaSOsB8uN90sRu/Hx8/ynhKQsCB57theN2mnB+iOlFqEWR6iR kHZiFBh7LjldJPbfE4d5Ru0LKyH9g84= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-358--D5bhXLJPvOrGr-otlQhmg-1; Thu, 12 Nov 2020 12:59:31 -0500 X-MC-Unique: -D5bhXLJPvOrGr-otlQhmg-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6B9ACAF061 for ; Thu, 12 Nov 2020 17:59:30 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id BC0BE1002C1B; Thu, 12 Nov 2020 17:59:28 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 06/13] char-udp: Implement compat code for CLI QAPIfication Date: Thu, 12 Nov 2020 18:58:58 +0100 Message-Id: <20201112175905.404472-7-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=63.128.21.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 00:52:29 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" UDP backends have a few differences between CLI and QMP. This adds QAPI aliases and a .translate_legacy_options() implementation that converts CLI inputs to a form that's usable for a QAPIfied --chardev. Signed-off-by: Kevin Wolf --- qapi/char.json | 7 ++++++- chardev/char-udp.c | 33 +++++++++++++++++++++++++++++++++ chardev/char.c | 1 - 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/qapi/char.json b/qapi/char.json index 1930e90e95..e1f9347044 100644 --- a/qapi/char.json +++ b/qapi/char.json @@ -303,7 +303,12 @@ { 'struct': 'ChardevUdp', 'data': { 'remote': 'SocketAddressLegacy', '*local': 'SocketAddressLegacy' }, - 'base': 'ChardevCommon' } + 'base': 'ChardevCommon', + 'aliases': [ + { 'source': ['remote'] }, + { 'alias': 'localaddr', 'source': ['local', 'host'] }, + { 'alias': 'localport', 'source': ['local', 'port'] } + ]} ## # @ChardevMux: diff --git a/chardev/char-udp.c b/chardev/char-udp.c index 16b5dbce58..61752b1c51 100644 --- a/chardev/char-udp.c +++ b/chardev/char-udp.c @@ -23,9 +23,11 @@ */ #include "qemu/osdep.h" +#include "block/qdict.h" #include "chardev/char.h" #include "io/channel-socket.h" #include "qapi/error.h" +#include "qapi/qmp/qdict.h" #include "qemu/module.h" #include "qemu/option.h" @@ -190,6 +192,36 @@ static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend, } } +static void qemu_chr_translate_udp(QDict *args) +{ + QDict *remote; + QDict *local; + + /* + * If "local" or "remote" are given, it's not a legacy command line. + * Not translating in this case saves us checking whether an alias is + * already given before applying defaults. + */ + if (qdict_haskey(args, "local") || qdict_haskey(args, "remote")) { + return; + } + + remote = qdict_new(); + qdict_put_str(remote, "type", "inet"); + qdict_put(args, "remote", remote); + + qdict_set_default_str(args, "host", "localhost"); + + if (qdict_haskey(args, "localaddr") || qdict_haskey(args, "localport")) { + local = qdict_new(); + qdict_put_str(local, "type", "inet"); + qdict_put(args, "local", local); + + qdict_set_default_str(args, "localaddr", ""); + qdict_set_default_str(args, "localport", "0"); + } +} + static void qmp_chardev_open_udp(Chardev *chr, ChardevBackend *backend, bool *be_opened, @@ -225,6 +257,7 @@ static void char_udp_class_init(ObjectClass *oc, void *data) ChardevClass *cc = CHARDEV_CLASS(oc); cc->parse = qemu_chr_parse_udp; + cc->translate_legacy_options = qemu_chr_translate_udp; cc->open = qmp_chardev_open_udp; cc->chr_write = udp_chr_write; cc->chr_update_read_handler = udp_chr_update_read_handler; diff --git a/chardev/char.c b/chardev/char.c index 91b44e53b6..99feaae275 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -744,7 +744,6 @@ void qemu_chr_translate_legacy_options(QDict *args) /* * TODO: * All backend types: "mux" - * udp: defaults for "host"/"localaddr"/"localport" */ } From patchwork Thu Nov 12 17:58:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900923 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E239115E6 for ; Thu, 12 Nov 2020 18:04:30 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 58B1E22201 for ; Thu, 12 Nov 2020 18:04:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="jGuHpKgb" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 58B1E22201 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:60508 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdGxR-0006qu-3x for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:04:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37594) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGsq-00018z-0m for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:45 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:23437) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGsi-0000l8-Ru for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:41 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203976; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=y/YfDeWEKfxnOfqzTNmbt0iCSJjBpcio8N+uDvPxTDI=; b=jGuHpKgbCb7gsZ3MJNj3EOELP7OVAch/0ZsJz2PI7v6eEcEp/PXA2BgryZuaH/Rc5zcClx 13zGGHFe+ovyV9l1I9esl9VRrA1/c3TUxyvDXivWmwqGtoU9E+yS5I+SZ/A5gn4SFxE3OS qx95qjo7j4Mn0PaJ0lvYubfA51zWIy4= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-417-zt1085Q2Mqec9s4cJfFfxw-1; Thu, 12 Nov 2020 12:59:34 -0500 X-MC-Unique: zt1085Q2Mqec9s4cJfFfxw-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 457AB8031F9 for ; Thu, 12 Nov 2020 17:59:32 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id B5E611002C1A; Thu, 12 Nov 2020 17:59:30 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 07/13] char: Add qemu_chr_parse_cli_dict/str() Date: Thu, 12 Nov 2020 18:58:59 +0100 Message-Id: <20201112175905.404472-8-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=216.205.24.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 08:00:44 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" This adds a function that parses a command line definition of a character device into ChardevOptions, which can then be passed to qemu_chr_new_cli(). You can start both from a string (for actual CLI) or from a QDict, which is not only the intermediate representation after calling the keyval parser, but also what HMP handlers receive. Signed-off-by: Kevin Wolf --- include/chardev/char.h | 30 ++++++++++++++++++++++++++++ chardev/char.c | 45 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/include/chardev/char.h b/include/chardev/char.h index c0944f5828..5cd46207f6 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -94,6 +94,36 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, */ Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp); +/** + * qemu_chr_parse_cli_dict: + * @args: Options defining a new character device + * @help: true if help should be printed instead of returning ChardevOptions + * + * Parses the given command line option QDict into ChardevOptions, using + * qemu_chr_translate_legacy_options() to maintain compatibility with + * legacy command line syntax. + * + * Returns: On successful conversion, a ChardevOptions object containing the + * requested options. NULL and @errp is unchanged if help was requested and + * printed. NULL and @errp is set in error cases. + */ +ChardevOptions *qemu_chr_parse_cli_dict(QDict *args, bool help, + Error **errp); + +/** + * qemu_chr_parse_cli_str: + * @optarg: Command line argument defining a new character device + * + * Parses the given command line option into ChardevOptions, using + * qemu_chr_translate_legacy_options() to maintain compatibility with + * legacy command line syntax. + * + * Returns: On successful conversion, a ChardevOptions object containing the + * requested options. NULL and @errp is unchanged if help was requested and + * printed. NULL and @errp is set in error cases. + */ +ChardevOptions *qemu_chr_parse_cli_str(const char *optarg, Error **errp); + /** * qemu_chr_translate_legacy_options: * @args: Character device creation options as returned by the keyval parser diff --git a/chardev/char.c b/chardev/char.c index 99feaae275..a5d6be9dc8 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -32,8 +32,10 @@ #include "chardev/char.h" #include "qapi/error.h" #include "qapi/qapi-commands-char.h" +#include "qapi/qapi-visit-char.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qerror.h" +#include "qapi/qobject-input-visitor.h" #include "sysemu/replay.h" #include "qemu/help_option.h" #include "qemu/module.h" @@ -1106,6 +1108,49 @@ Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp) return chardev_new_qapi(options->id, options->backend, errp); } +ChardevOptions *qemu_chr_parse_cli_dict(QDict *args, bool help, + Error **errp) +{ + Visitor *v; + ChardevOptions *chr_options; + + qemu_chr_translate_legacy_options(args); + + if (help) { + if (qdict_haskey(args, "type")) { + /* TODO Print help based on the QAPI schema */ + qemu_opts_print_help(&qemu_chardev_opts, true); + } else { + qemu_chr_print_types(); + } + return NULL; + } + + v = qobject_input_visitor_new_keyval(QOBJECT(args)); + visit_type_ChardevOptions(v, NULL, &chr_options, errp); + visit_free(v); + + return chr_options; +} + +ChardevOptions *qemu_chr_parse_cli_str(const char *optarg, Error **errp) +{ + ERRP_GUARD(); + QDict *args; + ChardevOptions *chr_options; + bool help; + + args = keyval_parse(optarg, "backend", &help, errp); + if (!args) { + return NULL; + } + + chr_options = qemu_chr_parse_cli_dict(args, help, errp); + qobject_unref(args); + + return chr_options; +} + ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend, Error **errp) { From patchwork Thu Nov 12 17:59:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900929 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B943615E6 for ; Thu, 12 Nov 2020 18:07:10 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 50C5722201 for ; Thu, 12 Nov 2020 18:07:10 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="XuSlxmgI" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 50C5722201 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:39448 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdH01-0001Wq-1Z for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:07:09 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37676) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGt3-0001BM-Ke for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:57 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:33160) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGsp-0000m9-Qg for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:51 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203980; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NmA3MmZqTxiwtBEfqDIKt2m4ARbVg0BIQ6mvwBFM2S4=; b=XuSlxmgILIxEV53n9uTLn5/Tv/3hNq31mnDnRG3BQfr/esfrhSqsgH78neOAPozurmpIZO cUSmIxOlBePBp75OjpkFUrZyH9nQDW05IGw8ogKQLl0KQn9H0JSWytLggzCyuYSysqWF5T nlmcYzmxkKJPctglPbFjfHHI/g3sw2Y= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-247-R1AmfjQXNpC5rU9H6cSqRg-1; Thu, 12 Nov 2020 12:59:35 -0500 X-MC-Unique: R1AmfjQXNpC5rU9H6cSqRg-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 3C4D3801817 for ; Thu, 12 Nov 2020 17:59:34 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 94DAB1002C13; Thu, 12 Nov 2020 17:59:32 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 08/13] char: Add mux option to ChardevOptions Date: Thu, 12 Nov 2020 18:59:00 +0100 Message-Id: <20201112175905.404472-9-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=216.205.24.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 08:00:44 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" The final missing piece to achieve compatibility between qemu_chr_parse_cli_str()/qemu_chr_new_cli() and the legacy command line is support for the 'mux' option. Implement it. Signed-off-by: Kevin Wolf --- qapi/char.json | 4 +++- chardev/char.c | 41 +++++++++++++++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/qapi/char.json b/qapi/char.json index e1f9347044..d6733a5473 100644 --- a/qapi/char.json +++ b/qapi/char.json @@ -453,12 +453,14 @@ # # @id: the chardev's ID, must be unique # @backend: backend type and parameters +# @mux: enable multiplexing mode (default: false) # # Since: 6.0 ## { 'struct': 'ChardevOptions', 'data': { 'id': 'str', - 'backend': 'ChardevBackend' }, + 'backend': 'ChardevBackend', + '*mux': 'bool' }, 'aliases': [ { 'source': ['backend'] } ] } ## diff --git a/chardev/char.c b/chardev/char.c index a5d6be9dc8..3bb6a743f7 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -742,11 +742,6 @@ void qemu_chr_translate_legacy_options(QDict *args) /* name may refer to a QDict entry, so delete it only now */ qdict_del(args, "backend"); - - /* - * TODO: - * All backend types: "mux" - */ } Chardev *qemu_chr_new_noreplay(const char *label, const char *filename, @@ -1105,7 +1100,41 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp) { - return chardev_new_qapi(options->id, options->backend, errp); + Chardev *chr; + char *bid = NULL; + + if (options->mux) { + bid = g_strdup_printf("%s-base", options->id); + } + + chr = chardev_new_qapi(bid ?: options->id, options->backend, errp); + if (!chr) { + goto out; + } + + if (options->mux) { + Chardev *mux; + ChardevMux mux_data = { + .chardev = bid, + }; + ChardevBackend backend = { + .type = CHARDEV_BACKEND_KIND_MUX, + .u.mux.data = &mux_data, + }; + + mux = qemu_chardev_new(options->id, TYPE_CHARDEV_MUX, &backend, NULL, + errp); + if (mux == NULL) { + object_unparent(OBJECT(chr)); + chr = NULL; + goto out; + } + chr = mux; + } + +out: + g_free(bid); + return chr; } ChardevOptions *qemu_chr_parse_cli_dict(QDict *args, bool help, From patchwork Thu Nov 12 17:59:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900933 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BC17D15E6 for ; Thu, 12 Nov 2020 18:07:26 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 18D9422201 for ; Thu, 12 Nov 2020 18:07:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="CBmKUEs5" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 18D9422201 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:40746 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdH0G-00023C-GN for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:07:24 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37696) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGt4-0001DA-6Z for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:58 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:38299) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGsp-0000mG-Q3 for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203981; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IqXnhdcvtX4p12iBkfena14urLce3IoFtPM5/yBK+XM=; b=CBmKUEs5ET8I8APXh3DWmtIKS5/FgoEV+g+yuwilhJXdI0l39oOiYG3cnBXOnjbggHbxTY EyW95AqAWuUyygJWPR+ynfj9WfwyuCdyMU0fzU6+FtQp2EUUnjsWUqRBxpQuUg3Au//XIg 9s+MC/kgBrm/0/lQAdIMRWfk+3uB8bs= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-41-2uGxDk7MOcStp3cIPbhaBA-1; Thu, 12 Nov 2020 12:59:40 -0500 X-MC-Unique: 2uGxDk7MOcStp3cIPbhaBA-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1062BAF061 for ; Thu, 12 Nov 2020 17:59:39 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 879021002C13; Thu, 12 Nov 2020 17:59:34 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 09/13] qemu-storage-daemon: QAPIfy --chardev Date: Thu, 12 Nov 2020 18:59:01 +0100 Message-Id: <20201112175905.404472-10-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=216.205.24.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 08:00:44 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Make use of the QAPIfied command line interface of the chardev subsystem. With this, --chardev supports QMP-like syntax (i.e. chardev-add mapped to the command line) as well as the legacy syntax that it already supported and which is shared with the system emulator. Signed-off-by: Kevin Wolf --- storage-daemon/qemu-storage-daemon.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/storage-daemon/qemu-storage-daemon.c b/storage-daemon/qemu-storage-daemon.c index e419ba9f19..149d08ad6d 100644 --- a/storage-daemon/qemu-storage-daemon.c +++ b/storage-daemon/qemu-storage-daemon.c @@ -128,8 +128,6 @@ enum { OPTION_OBJECT, }; -extern QemuOptsList qemu_chardev_opts; - static QemuOptsList qemu_object_opts = { .name = "object", .implied_opt_name = "qom-type", @@ -207,18 +205,15 @@ static void process_options(int argc, char *argv[]) } case OPTION_CHARDEV: { - /* TODO This interface is not stable until we QAPIfy it */ - QemuOpts *opts = qemu_opts_parse_noisily(&qemu_chardev_opts, - optarg, true); - if (opts == NULL) { - exit(EXIT_FAILURE); - } + ChardevOptions *options; - if (!qemu_chr_new_from_opts(opts, NULL, &error_fatal)) { - /* No error, but NULL returned means help was printed */ + options = qemu_chr_parse_cli_str(optarg, &error_fatal); + if (!options) { + /* Help was printed */ exit(EXIT_SUCCESS); } - qemu_opts_del(opts); + qemu_chr_new_cli(options, &error_fatal); + qapi_free_ChardevOptions(options); break; } case OPTION_EXPORT: From patchwork Thu Nov 12 17:59:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900931 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 079FA139F for ; Thu, 12 Nov 2020 18:07:14 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9E2B922201 for ; Thu, 12 Nov 2020 18:07:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="WWOXcIrP" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9E2B922201 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:39726 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdH04-0001dk-CI for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:07:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37680) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGt3-0001BY-Me for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:57 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:38298) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGst-0000mO-Ni for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203984; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AfPFaqFUVUEWfzka3wzZsBUp7OzkQfoFN0Ix1Zsu5EM=; b=WWOXcIrPtsw7mqpCnX89X6DkJWnec0J1J4Maz2XIGDTeXUag3EOU0W3WEAGnGPxkzOE2/Q x5pxSXLwj9vmar4NQKwiryjJOj5aOZQCRheTnWWYUPTyqf8+SbBERgCbDTEde0JD4ZCf3t tQESi5AoHlqtyRzWkvYWxUzRSGJJxoY= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-490-gT5xtreaNOqiEw9v34wd2A-1; Thu, 12 Nov 2020 12:59:41 -0500 X-MC-Unique: gT5xtreaNOqiEw9v34wd2A-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F1FE3108597D for ; Thu, 12 Nov 2020 17:59:40 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 724561002C13; Thu, 12 Nov 2020 17:59:39 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 10/13] char: Implement qemu_chr_new_from_opts() in terms of QAPI Date: Thu, 12 Nov 2020 18:59:02 +0100 Message-Id: <20201112175905.404472-11-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=63.128.21.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 00:52:29 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Instead of having a second parser, qemu_chr_new_from_opts() uses qemu_chr_translate_legacy_options() and qemu_chr_new_cli() now. This switches -chardev of the system emulator to use the QAPI generated parser rather than the hand-written QemuOpts based parser. All existing command line options should keep working, but it gains support for anything that was previously only supported in QMP (e.g. vsock socket addresses). Signed-off-by: Kevin Wolf --- chardev/char.c | 116 +++++++++++++++++++------------------------------ 1 file changed, 45 insertions(+), 71 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index 3bb6a743f7..4a444a0353 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -656,70 +656,6 @@ void qemu_chr_print_types(void) qemu_printf("Available chardev backend types: %s\n", str->str); } -Chardev *qemu_chr_new_from_opts(QemuOpts *opts, GMainContext *context, - Error **errp) -{ - const ChardevClass *cc; - Chardev *chr = NULL; - ChardevBackend *backend = NULL; - const char *name = chardev_alias_translate(qemu_opt_get(opts, "backend")); - const char *id = qemu_opts_id(opts); - char *bid = NULL; - - if (name && is_help_option(name)) { - qemu_chr_print_types(); - return NULL; - } - - if (id == NULL) { - error_setg(errp, "chardev: no id specified"); - return NULL; - } - - backend = qemu_chr_parse_opts(opts, errp); - if (backend == NULL) { - return NULL; - } - - cc = char_get_class(name, errp); - if (cc == NULL) { - goto out; - } - - if (qemu_opt_get_bool(opts, "mux", 0)) { - bid = g_strdup_printf("%s-base", id); - } - - chr = qemu_chardev_new(bid ? bid : id, - object_class_get_name(OBJECT_CLASS(cc)), - backend, context, errp); - - if (chr == NULL) { - goto out; - } - - if (bid) { - Chardev *mux; - qapi_free_ChardevBackend(backend); - backend = g_new0(ChardevBackend, 1); - backend->type = CHARDEV_BACKEND_KIND_MUX; - backend->u.mux.data = g_new0(ChardevMux, 1); - backend->u.mux.data->chardev = g_strdup(bid); - mux = qemu_chardev_new(id, TYPE_CHARDEV_MUX, backend, context, errp); - if (mux == NULL) { - object_unparent(OBJECT(chr)); - chr = NULL; - goto out; - } - chr = mux; - } - -out: - qapi_free_ChardevBackend(backend); - g_free(bid); - return chr; -} - void qemu_chr_translate_legacy_options(QDict *args) { const ChardevClass *cc; @@ -1065,7 +1001,7 @@ Chardev *qemu_chardev_new(const char *id, const char *typename, } static Chardev *chardev_new_qapi(const char *id, ChardevBackend *backend, - Error **errp) + GMainContext *context, Error **errp) { const ChardevClass *cc; @@ -1075,7 +1011,7 @@ static Chardev *chardev_new_qapi(const char *id, ChardevBackend *backend, } return chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)), - backend, NULL, errp); + backend, context, errp); } ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, @@ -1084,7 +1020,7 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, ChardevReturn *ret; Chardev *chr; - chr = chardev_new_qapi(id, backend, errp); + chr = chardev_new_qapi(id, backend, NULL, errp); if (!chr) { return NULL; } @@ -1098,7 +1034,9 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, return ret; } -Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp) +static Chardev *qemu_chr_new_cli_gcontext(ChardevOptions *options, + GMainContext *context, + Error **errp) { Chardev *chr; char *bid = NULL; @@ -1107,7 +1045,7 @@ Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp) bid = g_strdup_printf("%s-base", options->id); } - chr = chardev_new_qapi(bid ?: options->id, options->backend, errp); + chr = chardev_new_qapi(bid ?: options->id, options->backend, context, errp); if (!chr) { goto out; } @@ -1122,8 +1060,8 @@ Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp) .u.mux.data = &mux_data, }; - mux = qemu_chardev_new(options->id, TYPE_CHARDEV_MUX, &backend, NULL, - errp); + mux = qemu_chardev_new(options->id, TYPE_CHARDEV_MUX, &backend, + context, errp); if (mux == NULL) { object_unparent(OBJECT(chr)); chr = NULL; @@ -1137,6 +1075,11 @@ out: return chr; } +Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp) +{ + return qemu_chr_new_cli_gcontext(options, NULL, errp); +} + ChardevOptions *qemu_chr_parse_cli_dict(QDict *args, bool help, Error **errp) { @@ -1180,6 +1123,37 @@ ChardevOptions *qemu_chr_parse_cli_str(const char *optarg, Error **errp) return chr_options; } +Chardev *qemu_chr_new_from_opts(QemuOpts *opts, GMainContext *context, + Error **errp) +{ + ChardevOptions *chr_options; + Chardev *chr; + QDict *args; + const char *name = qemu_opt_get(opts, "backend"); + bool help; + + args = qemu_opts_to_qdict(opts, NULL); + + if (name && is_help_option(name)) { + qdict_del(args, "backend"); + qdict_del(args, "type"); + help = true; + } else { + help = qemu_opt_has_help_opt(opts); + } + + chr_options = qemu_chr_parse_cli_dict(args, help, errp); + qobject_unref(args); + + if (!chr_options) { + return NULL; + } + + chr = qemu_chr_new_cli_gcontext(chr_options, context, errp); + qapi_free_ChardevOptions(chr_options); + return chr; +} + ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend, Error **errp) { From patchwork Thu Nov 12 17:59:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900947 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 83EAE15E6 for ; Thu, 12 Nov 2020 18:08:00 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D95BC22227 for ; Thu, 12 Nov 2020 18:07:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="WUvyrzER" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D95BC22227 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:43052 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdH0o-0002zq-QS for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:07:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37704) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGt4-0001EI-KC for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:58 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:26262) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGst-0000mU-NX for qemu-devel@nongnu.org; Thu, 12 Nov 2020 12:59:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203985; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tbXhAvTDC3ngvTRF4fxcFWl9aUU/7PWKDGgGq4/e7c4=; b=WUvyrzERsNKt95t8ytHZ9He3QKKL5w/tK20Y1jI53NOD7wUmPe9MQYCsbbgqGIoDPp8+m8 OApLF54JwVGtmKjg0WCfBKvUbewpl5Y/8/M42D+4K8B5D7TmnmQUanImg4UkxGitDRhVJ6 D/VB1iZvXlIM1UEgkuCOW/rvu5Y7cJk= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-511--Gge9Gx-MhqCnygezJMKlw-1; Thu, 12 Nov 2020 12:59:43 -0500 X-MC-Unique: -Gge9Gx-MhqCnygezJMKlw-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C9DE0AF060 for ; Thu, 12 Nov 2020 17:59:42 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4E4BA1002C13; Thu, 12 Nov 2020 17:59:41 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 11/13] hmp/char: Use qemu_chr_parse_cli_str() for chardev-change Date: Thu, 12 Nov 2020 18:59:03 +0100 Message-Id: <20201112175905.404472-12-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=216.205.24.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 08:00:44 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Instead of going through the QemuOpts-based parser, go directly from the given option string to ChardevOptions. This doesn't only avoid legacy code, but it also simplifies the implementation. Signed-off-by: Kevin Wolf Acked-by: Dr. David Alan Gilbert --- monitor/hmp-cmds.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index a6a6684df1..0244068de8 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1793,34 +1793,25 @@ void hmp_chardev_add(Monitor *mon, const QDict *qdict) void hmp_chardev_change(Monitor *mon, const QDict *qdict) { const char *args = qdict_get_str(qdict, "args"); - const char *id; + const char *id = qdict_get_str(qdict, "id"); + char *optstr; Error *err = NULL; - ChardevBackend *backend = NULL; + ChardevOptions *options = NULL; ChardevReturn *ret = NULL; - QemuOpts *opts = qemu_opts_parse_noisily(qemu_find_opts("chardev"), args, - true); - if (!opts) { - error_setg(&err, "Parsing chardev args failed"); - goto end; - } - id = qdict_get_str(qdict, "id"); - if (qemu_opts_id(opts)) { - error_setg(&err, "Unexpected 'id' parameter"); - goto end; - } + optstr = g_strdup_printf("%s,id=%s", args, id); - backend = qemu_chr_parse_opts(opts, &err); - if (!backend) { + options = qemu_chr_parse_cli_str(optstr, &err); + if (!options) { goto end; } - ret = qmp_chardev_change(id, backend, &err); + ret = qmp_chardev_change(options->id, options->backend, &err); end: + g_free(optstr); qapi_free_ChardevReturn(ret); - qapi_free_ChardevBackend(backend); - qemu_opts_del(opts); + qapi_free_ChardevOptions(options); hmp_handle_error(mon, err); } From patchwork Thu Nov 12 17:59:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900951 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9FF51921 for ; Thu, 12 Nov 2020 18:10:38 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4CB1E22201 for ; Thu, 12 Nov 2020 18:10:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="gky3EOks" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4CB1E22201 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:50032 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdH3N-00062b-5D for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:10:37 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37740) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGt6-0001JO-JX for qemu-devel@nongnu.org; Thu, 12 Nov 2020 13:00:00 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:30795) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGt3-0000nY-9F for qemu-devel@nongnu.org; Thu, 12 Nov 2020 13:00:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203990; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=l6yCkydgfIDA8tx/k5dlAWhfUPdQSZs1lMGYS3SF75c=; b=gky3EOksrKa8l5tQJBu6+Yh1U79DOT0RNlvvGeNMtbCAeC79TQYlIBOIcTgR5/e0LsOQgE VB3pFIFG22yfrA7m5l9pjap/fxDulvdGK0HR7Z2Xfh5L4543l/NVA0psITWbFwAd0Zg/4U voLyZE8sQOSqOnGP2mZoaMr6v5XGP1Y= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-590-tMxNVmDDMvGEMtQdtB5qPA-1; Thu, 12 Nov 2020 12:59:45 -0500 X-MC-Unique: tMxNVmDDMvGEMtQdtB5qPA-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 98FE280475A for ; Thu, 12 Nov 2020 17:59:44 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1F57E1002C13; Thu, 12 Nov 2020 17:59:42 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 12/13] char: Remove qemu_chr_parse_opts() Date: Thu, 12 Nov 2020 18:59:04 +0100 Message-Id: <20201112175905.404472-13-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=63.128.21.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 00:52:29 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" The function is unused now, remove it. Signed-off-by: Kevin Wolf --- include/chardev/char.h | 10 ---------- chardev/char.c | 37 ------------------------------------- 2 files changed, 47 deletions(-) diff --git a/include/chardev/char.h b/include/chardev/char.h index 5cd46207f6..761c521bd8 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -146,16 +146,6 @@ void qemu_chr_translate_legacy_options(QDict *args); */ void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon *backend); -/** - * qemu_chr_parse_opts: - * - * Parse the options to the ChardevBackend struct. - * - * Returns: a new backend or NULL on error - */ -ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, - Error **errp); - /** * qemu_chr_new: * @label: the name of the backend diff --git a/chardev/char.c b/chardev/char.c index 4a444a0353..c3cfd473b4 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -610,43 +610,6 @@ static const char *chardev_alias_translate(const char *name) return name; } -ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, Error **errp) -{ - Error *local_err = NULL; - const ChardevClass *cc; - ChardevBackend *backend = NULL; - const char *name = chardev_alias_translate(qemu_opt_get(opts, "backend")); - - if (name == NULL) { - error_setg(errp, "chardev: \"%s\" missing backend", - qemu_opts_id(opts)); - return NULL; - } - - cc = char_get_class(name, errp); - if (cc == NULL) { - return NULL; - } - - backend = g_new0(ChardevBackend, 1); - backend->type = CHARDEV_BACKEND_KIND_NULL; - - if (cc->parse) { - cc->parse(opts, backend, &local_err); - if (local_err) { - error_propagate(errp, local_err); - qapi_free_ChardevBackend(backend); - return NULL; - } - } else { - ChardevCommon *ccom = g_new0(ChardevCommon, 1); - qemu_chr_parse_common(opts, ccom); - backend->u.null.data = ccom; /* Any ChardevCommon member would work */ - } - - return backend; -} - void qemu_chr_print_types(void) { g_autoptr(GString) str = g_string_new(""); From patchwork Thu Nov 12 17:59:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 11900949 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1B9AA138B for ; Thu, 12 Nov 2020 18:10:01 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 96AEA22201 for ; Thu, 12 Nov 2020 18:10:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="T1FQiskB" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 96AEA22201 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:47950 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kdH2l-00056P-Ix for patchwork-qemu-devel@patchwork.kernel.org; Thu, 12 Nov 2020 13:09:59 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37756) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kdGt7-0001L6-4q for qemu-devel@nongnu.org; Thu, 12 Nov 2020 13:00:01 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:30711) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kdGt3-0000ni-9p for qemu-devel@nongnu.org; Thu, 12 Nov 2020 13:00:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1605203992; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VQPi4yy940Ey6avasAaK49Dq3ioMsgywOo60wT0Si4I=; b=T1FQiskBCGQZqF+vZ9RQjJWbZV5t0YDN346hmD/kiBqteNDSpVCV0bf42WNBZpGxlhkrQC 9Lz+idzop+jfYQaylImFTAN7LO447e11hlQYDbMrammFQe5YhgyoPBMYutZ8q/VmvxF1+P CyzLou6WgN2cjJTlsp7tP8jEX29RPNk= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-457-O-dKilhGMjqtaPKatleCbg-1; Thu, 12 Nov 2020 12:59:47 -0500 X-MC-Unique: O-dKilhGMjqtaPKatleCbg-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 93C3D802B51 for ; Thu, 12 Nov 2020 17:59:46 +0000 (UTC) Received: from merkur.fritz.box (ovpn-115-57.ams2.redhat.com [10.36.115.57]) by smtp.corp.redhat.com (Postfix) with ESMTP id E417E1002C1A; Thu, 12 Nov 2020 17:59:44 +0000 (UTC) From: Kevin Wolf To: qemu-devel@nongnu.org Subject: [PATCH 13/13] char: Remove ChardevClass.parse Date: Thu, 12 Nov 2020 18:59:05 +0100 Message-Id: <20201112175905.404472-14-kwolf@redhat.com> In-Reply-To: <20201112175905.404472-1-kwolf@redhat.com> References: <20201112175905.404472-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kwolf@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=216.205.24.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/12 08:00:44 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, armbru@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com, marcandre.lureau@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" The QemuOpts based ChardevClass.parse has been replaced by the QAPI parser and is unused now, remove it. After removing all .parse implementations, qemu_chr_parse_common() is unused, too, so remove that one as well. Signed-off-by: Kevin Wolf --- include/chardev/char.h | 10 ----- chardev/char-file.c | 20 --------- chardev/char-mux.c | 17 -------- chardev/char-parallel.c | 17 -------- chardev/char-pipe.c | 17 -------- chardev/char-ringbuf.c | 18 -------- chardev/char-serial.c | 17 -------- chardev/char-socket.c | 92 ----------------------------------------- chardev/char-stdio.c | 13 ------ chardev/char-udp.c | 60 --------------------------- chardev/char.c | 11 ----- chardev/spice.c | 34 --------------- ui/console.c | 35 ---------------- ui/gtk.c | 1 - ui/spice-app.c | 1 - 15 files changed, 363 deletions(-) diff --git a/include/chardev/char.h b/include/chardev/char.h index 761c521bd8..ea095dd998 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -137,15 +137,6 @@ ChardevOptions *qemu_chr_parse_cli_str(const char *optarg, Error **errp); */ void qemu_chr_translate_legacy_options(QDict *args); -/** - * qemu_chr_parse_common: - * @opts: the options that still need parsing - * @backend: a new backend - * - * Parse the common options available to all character backends. - */ -void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon *backend); - /** * qemu_chr_new: * @label: the name of the backend @@ -294,7 +285,6 @@ struct ChardevClass { ObjectClass parent_class; bool internal; /* TODO: eventually use TYPE_USER_CREATABLE */ - void (*parse)(QemuOpts *opts, ChardevBackend *backend, Error **errp); void (*translate_legacy_options)(QDict *args); void (*open)(Chardev *chr, ChardevBackend *backend, diff --git a/chardev/char-file.c b/chardev/char-file.c index 2fd80707e5..5684bfb9b1 100644 --- a/chardev/char-file.c +++ b/chardev/char-file.c @@ -96,30 +96,10 @@ static void qmp_chardev_open_file(Chardev *chr, #endif } -static void qemu_chr_parse_file_out(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - const char *path = qemu_opt_get(opts, "path"); - ChardevFile *file; - - backend->type = CHARDEV_BACKEND_KIND_FILE; - if (path == NULL) { - error_setg(errp, "chardev: file: no filename given"); - return; - } - file = backend->u.file.data = g_new0(ChardevFile, 1); - qemu_chr_parse_common(opts, qapi_ChardevFile_base(file)); - file->out = g_strdup(path); - - file->has_append = true; - file->append = qemu_opt_get_bool(opts, "append", false); -} - static void char_file_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_file_out; cc->open = qmp_chardev_open_file; } diff --git a/chardev/char-mux.c b/chardev/char-mux.c index 6f980bb836..91542bb3e3 100644 --- a/chardev/char-mux.c +++ b/chardev/char-mux.c @@ -332,22 +332,6 @@ static void qemu_chr_open_mux(Chardev *chr, qemu_chr_fe_init(&d->chr, drv, errp); } -static void qemu_chr_parse_mux(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - const char *chardev = qemu_opt_get(opts, "chardev"); - ChardevMux *mux; - - if (chardev == NULL) { - error_setg(errp, "chardev: mux: no chardev given"); - return; - } - backend->type = CHARDEV_BACKEND_KIND_MUX; - mux = backend->u.mux.data = g_new0(ChardevMux, 1); - qemu_chr_parse_common(opts, qapi_ChardevMux_base(mux)); - mux->chardev = g_strdup(chardev); -} - /** * Called after processing of default and command-line-specified * chardevs to deliver CHR_EVENT_OPENED events to any FEs attached @@ -377,7 +361,6 @@ static void char_mux_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_mux; cc->open = qemu_chr_open_mux; cc->chr_write = mux_chr_write; cc->chr_accept_input = mux_chr_accept_input; diff --git a/chardev/char-parallel.c b/chardev/char-parallel.c index 05e7efbd6c..066f1fc7ba 100644 --- a/chardev/char-parallel.c +++ b/chardev/char-parallel.c @@ -254,27 +254,10 @@ static void qmp_chardev_open_parallel(Chardev *chr, qemu_chr_open_pp_fd(chr, fd, be_opened, errp); } -static void qemu_chr_parse_parallel(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - const char *device = qemu_opt_get(opts, "path"); - ChardevHostdev *parallel; - - if (device == NULL) { - error_setg(errp, "chardev: parallel: no device path given"); - return; - } - backend->type = CHARDEV_BACKEND_KIND_PARALLEL; - parallel = backend->u.parallel.data = g_new0(ChardevHostdev, 1); - qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(parallel)); - parallel->device = g_strdup(device); -} - static void char_parallel_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_parallel; cc->open = qmp_chardev_open_parallel; #if defined(__linux__) cc->chr_ioctl = pp_ioctl; diff --git a/chardev/char-pipe.c b/chardev/char-pipe.c index 7eca5d9a56..97143c67fc 100644 --- a/chardev/char-pipe.c +++ b/chardev/char-pipe.c @@ -154,27 +154,10 @@ static void qemu_chr_open_pipe(Chardev *chr, #endif /* !_WIN32 */ -static void qemu_chr_parse_pipe(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - const char *device = qemu_opt_get(opts, "path"); - ChardevHostdev *dev; - - if (device == NULL) { - error_setg(errp, "chardev: pipe: no device path given"); - return; - } - backend->type = CHARDEV_BACKEND_KIND_PIPE; - dev = backend->u.pipe.data = g_new0(ChardevHostdev, 1); - qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(dev)); - dev->device = g_strdup(device); -} - static void char_pipe_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_pipe; cc->open = qemu_chr_open_pipe; } diff --git a/chardev/char-ringbuf.c b/chardev/char-ringbuf.c index d40d21d3cf..16eb46e971 100644 --- a/chardev/char-ringbuf.c +++ b/chardev/char-ringbuf.c @@ -206,28 +206,10 @@ char *qmp_ringbuf_read(const char *device, int64_t size, return data; } -static void qemu_chr_parse_ringbuf(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - int val; - ChardevRingbuf *ringbuf; - - backend->type = CHARDEV_BACKEND_KIND_RINGBUF; - ringbuf = backend->u.ringbuf.data = g_new0(ChardevRingbuf, 1); - qemu_chr_parse_common(opts, qapi_ChardevRingbuf_base(ringbuf)); - - val = qemu_opt_get_size(opts, "size", 0); - if (val != 0) { - ringbuf->has_size = true; - ringbuf->size = val; - } -} - static void char_ringbuf_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_ringbuf; cc->open = qemu_chr_open_ringbuf; cc->chr_write = ringbuf_chr_write; } diff --git a/chardev/char-serial.c b/chardev/char-serial.c index 7c3d84ae24..7e207339dc 100644 --- a/chardev/char-serial.c +++ b/chardev/char-serial.c @@ -279,27 +279,10 @@ static void qmp_chardev_open_serial(Chardev *chr, #endif /* __linux__ || __sun__ */ #ifdef HAVE_CHARDEV_SERIAL -static void qemu_chr_parse_serial(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - const char *device = qemu_opt_get(opts, "path"); - ChardevHostdev *serial; - - if (device == NULL) { - error_setg(errp, "chardev: serial/tty: no device path given"); - return; - } - backend->type = CHARDEV_BACKEND_KIND_SERIAL; - serial = backend->u.serial.data = g_new0(ChardevHostdev, 1); - qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(serial)); - serial->device = g_strdup(device); -} - static void char_serial_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_serial; cc->open = qmp_chardev_open_serial; #ifndef _WIN32 cc->chr_ioctl = tty_serial_ioctl; diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 6bf916a3e4..a38b9d939f 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -1394,97 +1394,6 @@ static void qmp_chardev_open_socket(Chardev *chr, } } -static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - const char *path = qemu_opt_get(opts, "path"); - const char *host = qemu_opt_get(opts, "host"); - const char *port = qemu_opt_get(opts, "port"); - const char *fd = qemu_opt_get(opts, "fd"); -#ifdef CONFIG_LINUX - bool tight = qemu_opt_get_bool(opts, "tight", true); - bool abstract = qemu_opt_get_bool(opts, "abstract", false); -#endif - SocketAddressLegacy *addr; - ChardevSocket *sock; - - if ((!!path + !!fd + !!host) != 1) { - error_setg(errp, - "Exactly one of 'path', 'fd' or 'host' required"); - return; - } - - if (host && !port) { - error_setg(errp, "chardev: socket: no port given"); - return; - } - - backend->type = CHARDEV_BACKEND_KIND_SOCKET; - sock = backend->u.socket.data = g_new0(ChardevSocket, 1); - qemu_chr_parse_common(opts, qapi_ChardevSocket_base(sock)); - - sock->has_nodelay = qemu_opt_get(opts, "delay"); - sock->nodelay = !qemu_opt_get_bool(opts, "delay", true); - /* - * We have different default to QMP for 'server', hence - * we can't just check for existence of 'server' - */ - sock->has_server = true; - sock->server = qemu_opt_get_bool(opts, "server", false); - sock->has_telnet = qemu_opt_get(opts, "telnet"); - sock->telnet = qemu_opt_get_bool(opts, "telnet", false); - sock->has_tn3270 = qemu_opt_get(opts, "tn3270"); - sock->tn3270 = qemu_opt_get_bool(opts, "tn3270", false); - sock->has_websocket = qemu_opt_get(opts, "websocket"); - sock->websocket = qemu_opt_get_bool(opts, "websocket", false); - /* - * We have different default to QMP for 'wait' when 'server' - * is set, hence we can't just check for existence of 'wait' - */ - sock->has_wait = qemu_opt_find(opts, "wait") || sock->server; - sock->wait = qemu_opt_get_bool(opts, "wait", true); - sock->has_reconnect = qemu_opt_find(opts, "reconnect"); - sock->reconnect = qemu_opt_get_number(opts, "reconnect", 0); - sock->has_tls_creds = qemu_opt_get(opts, "tls-creds"); - sock->tls_creds = g_strdup(qemu_opt_get(opts, "tls-creds")); - sock->has_tls_authz = qemu_opt_get(opts, "tls-authz"); - sock->tls_authz = g_strdup(qemu_opt_get(opts, "tls-authz")); - - addr = g_new0(SocketAddressLegacy, 1); - if (path) { - UnixSocketAddress *q_unix; - addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX; - q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1); - q_unix->path = g_strdup(path); -#ifdef CONFIG_LINUX - q_unix->has_tight = true; - q_unix->tight = tight; - q_unix->has_abstract = true; - q_unix->abstract = abstract; -#endif - } else if (host) { - addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET; - addr->u.inet.data = g_new(InetSocketAddress, 1); - *addr->u.inet.data = (InetSocketAddress) { - .host = g_strdup(host), - .port = g_strdup(port), - .has_to = qemu_opt_get(opts, "to"), - .to = qemu_opt_get_number(opts, "to", 0), - .has_ipv4 = qemu_opt_get(opts, "ipv4"), - .ipv4 = qemu_opt_get_bool(opts, "ipv4", 0), - .has_ipv6 = qemu_opt_get(opts, "ipv6"), - .ipv6 = qemu_opt_get_bool(opts, "ipv6", 0), - }; - } else if (fd) { - addr->type = SOCKET_ADDRESS_LEGACY_KIND_FD; - addr->u.fd.data = g_new(String, 1); - addr->u.fd.data->str = g_strdup(fd); - } else { - g_assert_not_reached(); - } - sock->addr = addr; -} - static void qemu_chr_translate_socket(QDict *args) { const char *path = qdict_get_try_str(args, "path"); @@ -1557,7 +1466,6 @@ static void char_socket_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_socket; cc->translate_legacy_options = qemu_chr_translate_socket; cc->open = qmp_chardev_open_socket; cc->chr_wait_connected = tcp_chr_wait_connected; diff --git a/chardev/char-stdio.c b/chardev/char-stdio.c index 403da308c9..74e2b25e9b 100644 --- a/chardev/char-stdio.c +++ b/chardev/char-stdio.c @@ -117,23 +117,10 @@ static void qemu_chr_open_stdio(Chardev *chr, } #endif -static void qemu_chr_parse_stdio(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - ChardevStdio *stdio; - - backend->type = CHARDEV_BACKEND_KIND_STDIO; - stdio = backend->u.stdio.data = g_new0(ChardevStdio, 1); - qemu_chr_parse_common(opts, qapi_ChardevStdio_base(stdio)); - stdio->has_signal = true; - stdio->signal = qemu_opt_get_bool(opts, "signal", true); -} - static void char_stdio_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_stdio; #ifndef _WIN32 cc->open = qemu_chr_open_stdio; cc->chr_set_echo = qemu_chr_set_echo_stdio; diff --git a/chardev/char-udp.c b/chardev/char-udp.c index 61752b1c51..1543fbca0c 100644 --- a/chardev/char-udp.c +++ b/chardev/char-udp.c @@ -133,65 +133,6 @@ static void char_udp_finalize(Object *obj) qemu_chr_be_event(chr, CHR_EVENT_CLOSED); } -static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - const char *host = qemu_opt_get(opts, "host"); - const char *port = qemu_opt_get(opts, "port"); - const char *localaddr = qemu_opt_get(opts, "localaddr"); - const char *localport = qemu_opt_get(opts, "localport"); - bool has_local = false; - SocketAddressLegacy *addr; - ChardevUdp *udp; - - backend->type = CHARDEV_BACKEND_KIND_UDP; - if (host == NULL || strlen(host) == 0) { - host = "localhost"; - } - if (port == NULL || strlen(port) == 0) { - error_setg(errp, "chardev: udp: remote port not specified"); - return; - } - if (localport == NULL || strlen(localport) == 0) { - localport = "0"; - } else { - has_local = true; - } - if (localaddr == NULL || strlen(localaddr) == 0) { - localaddr = ""; - } else { - has_local = true; - } - - udp = backend->u.udp.data = g_new0(ChardevUdp, 1); - qemu_chr_parse_common(opts, qapi_ChardevUdp_base(udp)); - - addr = g_new0(SocketAddressLegacy, 1); - addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET; - addr->u.inet.data = g_new(InetSocketAddress, 1); - *addr->u.inet.data = (InetSocketAddress) { - .host = g_strdup(host), - .port = g_strdup(port), - .has_ipv4 = qemu_opt_get(opts, "ipv4"), - .ipv4 = qemu_opt_get_bool(opts, "ipv4", 0), - .has_ipv6 = qemu_opt_get(opts, "ipv6"), - .ipv6 = qemu_opt_get_bool(opts, "ipv6", 0), - }; - udp->remote = addr; - - if (has_local) { - udp->has_local = true; - addr = g_new0(SocketAddressLegacy, 1); - addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET; - addr->u.inet.data = g_new(InetSocketAddress, 1); - *addr->u.inet.data = (InetSocketAddress) { - .host = g_strdup(localaddr), - .port = g_strdup(localport), - }; - udp->local = addr; - } -} - static void qemu_chr_translate_udp(QDict *args) { QDict *remote; @@ -256,7 +197,6 @@ static void char_udp_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_udp; cc->translate_legacy_options = qemu_chr_translate_udp; cc->open = qmp_chardev_open_udp; cc->chr_write = udp_chr_write; diff --git a/chardev/char.c b/chardev/char.c index c3cfd473b4..a26fe5555e 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -497,17 +497,6 @@ fail: return NULL; } -void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon *backend) -{ - const char *logfile = qemu_opt_get(opts, "logfile"); - - backend->has_logfile = logfile != NULL; - backend->logfile = g_strdup(logfile); - - backend->has_logappend = true; - backend->logappend = qemu_opt_get_bool(opts, "logappend", false); -} - static const ChardevClass *char_get_class(const char *driver, Error **errp) { ObjectClass *oc; diff --git a/chardev/spice.c b/chardev/spice.c index 1104426e3a..c87bd7e18e 100644 --- a/chardev/spice.c +++ b/chardev/spice.c @@ -317,38 +317,6 @@ static void qemu_chr_open_spice_port(Chardev *chr, vmc_register_interface(s); } -static void qemu_chr_parse_spice_vmc(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - const char *name = qemu_opt_get(opts, "name"); - ChardevSpiceChannel *spicevmc; - - if (name == NULL) { - error_setg(errp, "chardev: spice channel: no name given"); - return; - } - backend->type = CHARDEV_BACKEND_KIND_SPICEVMC; - spicevmc = backend->u.spicevmc.data = g_new0(ChardevSpiceChannel, 1); - qemu_chr_parse_common(opts, qapi_ChardevSpiceChannel_base(spicevmc)); - spicevmc->type = g_strdup(name); -} - -static void qemu_chr_parse_spice_port(QemuOpts *opts, ChardevBackend *backend, - Error **errp) -{ - const char *name = qemu_opt_get(opts, "name"); - ChardevSpicePort *spiceport; - - if (name == NULL) { - error_setg(errp, "chardev: spice port: no name given"); - return; - } - backend->type = CHARDEV_BACKEND_KIND_SPICEPORT; - spiceport = backend->u.spiceport.data = g_new0(ChardevSpicePort, 1); - qemu_chr_parse_common(opts, qapi_ChardevSpicePort_base(spiceport)); - spiceport->fqdn = g_strdup(name); -} - static void char_spice_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); @@ -371,7 +339,6 @@ static void char_spicevmc_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_spice_vmc; cc->open = qemu_chr_open_spice_vmc; cc->chr_set_fe_open = spice_vmc_set_fe_open; } @@ -386,7 +353,6 @@ static void char_spiceport_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_spice_port; cc->open = qemu_chr_open_spice_port; cc->chr_set_fe_open = spice_port_set_fe_open; } diff --git a/ui/console.c b/ui/console.c index e8e59707d3..7d8c1d1306 100644 --- a/ui/console.c +++ b/ui/console.c @@ -2386,40 +2386,6 @@ void qemu_display_help(void) } } -void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend, Error **errp) -{ - int val; - ChardevVC *vc; - - backend->type = CHARDEV_BACKEND_KIND_VC; - vc = backend->u.vc.data = g_new0(ChardevVC, 1); - qemu_chr_parse_common(opts, qapi_ChardevVC_base(vc)); - - val = qemu_opt_get_number(opts, "width", 0); - if (val != 0) { - vc->has_width = true; - vc->width = val; - } - - val = qemu_opt_get_number(opts, "height", 0); - if (val != 0) { - vc->has_height = true; - vc->height = val; - } - - val = qemu_opt_get_number(opts, "cols", 0); - if (val != 0) { - vc->has_cols = true; - vc->cols = val; - } - - val = qemu_opt_get_number(opts, "rows", 0); - if (val != 0) { - vc->has_rows = true; - vc->rows = val; - } -} - static const TypeInfo qemu_console_info = { .name = TYPE_QEMU_CONSOLE, .parent = TYPE_OBJECT, @@ -2431,7 +2397,6 @@ static void char_vc_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_vc; cc->open = vc_chr_open; cc->chr_write = vc_chr_write; cc->chr_set_echo = vc_chr_set_echo; diff --git a/ui/gtk.c b/ui/gtk.c index a752aa22be..7a5702c28b 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -1738,7 +1738,6 @@ static void char_gd_vc_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->parse = qemu_chr_parse_vc; cc->open = gd_vc_open; cc->chr_write = gd_vc_chr_write; cc->chr_set_echo = gd_vc_chr_set_echo; diff --git a/ui/spice-app.c b/ui/spice-app.c index 026124ef56..f3418111fb 100644 --- a/ui/spice-app.c +++ b/ui/spice-app.c @@ -101,7 +101,6 @@ static void char_vc_class_init(ObjectClass *oc, void *data) vc->parent_open = cc->open; - cc->parse = qemu_chr_parse_vc; cc->open = vc_chr_open; cc->chr_set_echo = vc_chr_set_echo; }