get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2196268/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2196268,
    "url": "http://patchwork.ozlabs.org/api/patches/2196268/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260213094938.4074478-7-marcandre.lureau@redhat.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260213094938.4074478-7-marcandre.lureau@redhat.com>",
    "list_archive_url": null,
    "date": "2026-02-13T09:49:25",
    "name": "[PULL,v2,06/15] chardev: .chr_open(): drop be_opened parameter",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "0879035123a2ebded1b84720a3c0d3357d128ab9",
    "submitter": {
        "id": 66774,
        "url": "http://patchwork.ozlabs.org/api/people/66774/?format=api",
        "name": "Marc-André Lureau",
        "email": "marcandre.lureau@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260213094938.4074478-7-marcandre.lureau@redhat.com/mbox/",
    "series": [
        {
            "id": 492070,
            "url": "http://patchwork.ozlabs.org/api/series/492070/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=492070",
            "date": "2026-02-13T09:49:19",
            "name": "[PULL,v2,01/15] char-udp: Fix initial backend open status",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/492070/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2196268/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2196268/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=iRpGfDus;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fC6rZ5bC1z1xpl\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 13 Feb 2026 20:51:42 +1100 (AEDT)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1vqpop-0007NC-Cl; Fri, 13 Feb 2026 04:50:35 -0500",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1vqpob-000729-6n\n for qemu-devel@nongnu.org; Fri, 13 Feb 2026 04:50:23 -0500",
            "from us-smtp-delivery-124.mimecast.com ([170.10.129.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1vqpoY-0007Hs-1B\n for qemu-devel@nongnu.org; Fri, 13 Feb 2026 04:50:20 -0500",
            "from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-249-ccQBv4M4MaqY0leUR4BYzQ-1; Fri,\n 13 Feb 2026 04:50:14 -0500",
            "from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 1922E18826AB; Fri, 13 Feb 2026 09:50:04 +0000 (UTC)",
            "from localhost (unknown [10.44.22.41])\n by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 41D371800352; Fri, 13 Feb 2026 09:50:01 +0000 (UTC)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1770976216;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=ARe11uBwUQtZK+r/LyMwdLX8qnRbouC5icUkGH7AqSA=;\n b=iRpGfDuss945/1ylz3O+55RINszkX9K5HkS8CtbbqKQI7jjnFzEImEmnS0A3NLfwnmh2iQ\n PO4TqmjX4+iyABIpQmLK9/giwe/HiLQl+s4JVQc61FqUTEYq+3YfLbWcyh3AmHG1AX+ed9\n 4CW5Pknlr1jSUWTJ5iVMlisB8kDxdsA=",
        "X-MC-Unique": "ccQBv4M4MaqY0leUR4BYzQ-1",
        "X-Mimecast-MFC-AGG-ID": "ccQBv4M4MaqY0leUR4BYzQ_1770976212",
        "From": "marcandre.lureau@redhat.com",
        "To": "qemu-devel@nongnu.org",
        "Cc": "=?utf-8?q?Alex_Benn=C3=A9e?= <alex.bennee@linaro.org>,\n \"Edgar E. Iglesias\" <edgar.iglesias@gmail.com>, =?utf-8?q?Daniel_P=2E_Berra?=\n\t=?utf-8?q?ng=C3=A9?= <berrange@redhat.com>, Eric Blake <eblake@redhat.com>,\n Markus Armbruster <armbru@redhat.com>, Paul Durrant <paul@xen.org>,\n Anthony PERARD <anthony@xenproject.org>, =?utf-8?q?Philippe_Mathieu-Daud?=\n\t=?utf-8?q?=C3=A9?= <philmd@linaro.org>,\n Eduardo Habkost <eduardo@habkost.net>, Paolo Bonzini <pbonzini@redhat.com>,\n\t=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n Stefano Stabellini <sstabellini@kernel.org>, xen-devel@lists.xenproject.org,\n Samuel Thibault <samuel.thibault@ens-lyon.org>,\n Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>",
        "Subject": "[PULL v2 06/15] chardev: .chr_open(): drop be_opened parameter",
        "Date": "Fri, 13 Feb 2026 10:49:25 +0100",
        "Message-ID": "<20260213094938.4074478-7-marcandre.lureau@redhat.com>",
        "In-Reply-To": "<20260213094938.4074478-1-marcandre.lureau@redhat.com>",
        "References": "<20260213094938.4074478-1-marcandre.lureau@redhat.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.111",
        "Received-SPF": "pass client-ip=170.10.129.124;\n envelope-from=marcandre.lureau@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com",
        "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,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-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.29",
        "Precedence": "list",
        "List-Id": "qemu development <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "From: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>\n\nThe logic around the parameter is rather tricky. Let's instead\nexplicitly send CHR_EVENT_OPENED in all backends where needed.\n\nSigned-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>\n[ Marc-André - add CHR_EVENT_OPENED in udp_chr_open() ]\nSigned-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\nMessage-Id: <20260115144606.233252-6-vsementsov@yandex-team.ru>\n---\n include/chardev/char.h   |  3 +--\n chardev/baum.c           |  7 +++----\n chardev/char-console.c   |  5 ++---\n chardev/char-file.c      |  7 +++----\n chardev/char-hub.c       | 11 +++++------\n chardev/char-mux.c       | 19 +++++++++++--------\n chardev/char-null.c      |  7 ++-----\n chardev/char-parallel.c  | 15 ++++-----------\n chardev/char-pipe.c      | 14 ++++++--------\n chardev/char-pty.c       |  6 +-----\n chardev/char-ringbuf.c   |  3 ++-\n chardev/char-serial.c    | 18 +++++++++---------\n chardev/char-socket.c    | 10 +++-------\n chardev/char-stdio.c     |  7 +++----\n chardev/char-udp.c       |  6 ++----\n chardev/char-win-stdio.c |  2 +-\n chardev/char.c           | 11 +++--------\n chardev/msmouse.c        |  4 ++--\n chardev/spice.c          | 10 ++--------\n chardev/wctablet.c       |  5 ++---\n gdbstub/system.c         |  5 ++---\n ui/console-vc.c          |  7 ++-----\n ui/dbus-chardev.c        |  6 ++----\n ui/gtk.c                 |  9 +++------\n ui/spice-app.c           | 10 +++-------\n ui/vdagent.c             |  3 +--\n 26 files changed, 80 insertions(+), 130 deletions(-)",
    "diff": "diff --git a/include/chardev/char.h b/include/chardev/char.h\nindex d33833b6c02..aa42e01b8a3 100644\n--- a/include/chardev/char.h\n+++ b/include/chardev/char.h\n@@ -260,8 +260,7 @@ struct ChardevClass {\n     void (*chr_parse)(QemuOpts *opts, ChardevBackend *backend, Error **errp);\n \n     /* called after construction, open/starts the backend */\n-    void (*chr_open)(Chardev *chr, ChardevBackend *backend,\n-                 bool *be_opened, Error **errp);\n+    void (*chr_open)(Chardev *chr, ChardevBackend *backend, Error **errp);\n \n     /* write buf to the backend */\n     int (*chr_write)(Chardev *s, const uint8_t *buf, int len);\ndiff --git a/chardev/baum.c b/chardev/baum.c\nindex 75e41965c11..4b97d630ffb 100644\n--- a/chardev/baum.c\n+++ b/chardev/baum.c\n@@ -642,10 +642,7 @@ static void char_braille_finalize(Object *obj)\n     }\n }\n \n-static void baum_chr_open(Chardev *chr,\n-                          ChardevBackend *backend,\n-                          bool *be_opened,\n-                          Error **errp)\n+static void baum_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     BaumChardev *baum = BAUM_CHARDEV(chr);\n     brlapi_handle_t *handle;\n@@ -670,6 +667,8 @@ static void baum_chr_open(Chardev *chr,\n      * as an integer, but in practice it seems to work\n      */\n     qemu_set_fd_handler(baum->brlapi_fd, baum_chr_read, NULL, baum);\n+\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void char_braille_class_init(ObjectClass *oc, const void *data)\ndiff --git a/chardev/char-console.c b/chardev/char-console.c\nindex f3ef1a7748c..423f0f4cc4e 100644\n--- a/chardev/char-console.c\n+++ b/chardev/char-console.c\n@@ -26,12 +26,11 @@\n #include \"chardev/char-win.h\"\n #include \"qemu/module.h\"\n \n-static void console_chr_open(Chardev *chr,\n-                             ChardevBackend *backend,\n-                             bool *be_opened,\n+static void console_chr_open(Chardev *chr, ChardevBackend *backend,\n                              Error **errp)\n {\n     win_chr_set_file(chr, GetStdHandle(STD_OUTPUT_HANDLE), true);\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void char_console_class_init(ObjectClass *oc, const void *data)\ndiff --git a/chardev/char-file.c b/chardev/char-file.c\nindex 568600bb7c4..34ef386abc5 100644\n--- a/chardev/char-file.c\n+++ b/chardev/char-file.c\n@@ -34,10 +34,7 @@\n #include \"chardev/char-fd.h\"\n #endif\n \n-static void file_chr_open(Chardev *chr,\n-                          ChardevBackend *backend,\n-                          bool *be_opened,\n-                          Error **errp)\n+static void file_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevFile *file = backend->u.file.data;\n #ifdef _WIN32\n@@ -100,6 +97,8 @@ static void file_chr_open(Chardev *chr,\n         return;\n     }\n #endif\n+\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void file_chr_parse(QemuOpts *opts, ChardevBackend *backend,\ndiff --git a/chardev/char-hub.c b/chardev/char-hub.c\nindex 11556dfa72b..aa6058c2f6f 100644\n--- a/chardev/char-hub.c\n+++ b/chardev/char-hub.c\n@@ -203,10 +203,7 @@ static void hub_chr_update_read_handlers(Chardev *chr)\n     }\n }\n \n-static void hub_chr_open(Chardev *chr,\n-                         ChardevBackend *backend,\n-                         bool *be_opened,\n-                         Error **errp)\n+static void hub_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevHub *hub = backend->u.hub.data;\n     HubChardev *d = HUB_CHARDEV(chr);\n@@ -241,8 +238,10 @@ static void hub_chr_open(Chardev *chr,\n         list = list->next;\n     }\n \n-    /* Closed until an explicit event from backend */\n-    *be_opened = false;\n+    /*\n+     * Closed until an explicit event from backend, so we don't\n+     * send CHR_EVENT_OPENED now.\n+     */\n }\n \n static void hub_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\ndiff --git a/chardev/char-mux.c b/chardev/char-mux.c\nindex f38d66b21f1..7210df431fc 100644\n--- a/chardev/char-mux.c\n+++ b/chardev/char-mux.c\n@@ -361,10 +361,7 @@ void mux_set_focus(Chardev *chr, unsigned int focus)\n     mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_IN);\n }\n \n-static void mux_chr_open(Chardev *chr,\n-                         ChardevBackend *backend,\n-                         bool *be_opened,\n-                         Error **errp)\n+static void mux_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevMux *mux = backend->u.mux.data;\n     Chardev *drv;\n@@ -377,11 +374,17 @@ static void mux_chr_open(Chardev *chr,\n     }\n \n     d->focus = -1;\n-    /* only default to opened state if we've realized the initial\n-     * set of muxes\n+    if (!qemu_chr_fe_init(&d->chr, drv, errp)) {\n+        return;\n+    }\n+\n+    /*\n+     * Only move to opened state if we've realized\n+     * the initial set of muxes:\n      */\n-    *be_opened = muxes_opened;\n-    qemu_chr_fe_init(&d->chr, drv, errp);\n+    if (muxes_opened) {\n+        qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n+    }\n }\n \n static void mux_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\ndiff --git a/chardev/char-null.c b/chardev/char-null.c\nindex 674603b3807..900b5febb6c 100644\n--- a/chardev/char-null.c\n+++ b/chardev/char-null.c\n@@ -26,12 +26,9 @@\n #include \"chardev/char.h\"\n #include \"qemu/module.h\"\n \n-static void null_chr_open(Chardev *chr,\n-                          ChardevBackend *backend,\n-                          bool *be_opened,\n-                          Error **errp)\n+static void null_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n-    *be_opened = false;\n+    /* do not send CHR_EVENT_OPENED */\n }\n \n static void char_null_class_init(ObjectClass *oc, const void *data)\ndiff --git a/chardev/char-parallel.c b/chardev/char-parallel.c\nindex 1be1ef46292..359efa3c9c8 100644\n--- a/chardev/char-parallel.c\n+++ b/chardev/char-parallel.c\n@@ -157,10 +157,7 @@ static int parallel_chr_ioctl(Chardev *chr, int cmd, void *arg)\n     return 0;\n }\n \n-static void parallel_chr_open_fd(Chardev *chr,\n-                                int fd,\n-                                bool *be_opened,\n-                                Error **errp)\n+static void parallel_chr_open_fd(Chardev *chr, int fd, Error **errp)\n {\n     ParallelChardev *drv = PARALLEL_CHARDEV(chr);\n \n@@ -172,6 +169,7 @@ static void parallel_chr_open_fd(Chardev *chr,\n     }\n \n     drv->mode = IEEE1284_MODE_COMPAT;\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n #endif /* __linux__ */\n \n@@ -227,21 +225,16 @@ static int parallel_chr_ioctl(Chardev *chr, int cmd, void *arg)\n     return 0;\n }\n \n-static void parallel_chr_open_fd(Chardev *chr,\n-                                int fd,\n-                                bool *be_opened,\n-                                Error **errp)\n+static void parallel_chr_open_fd(Chardev *chr, int fd, Error **errp)\n {\n     ParallelChardev *drv = PARALLEL_CHARDEV(chr);\n     drv->fd = fd;\n-    *be_opened = false;\n }\n #endif\n \n #ifdef HAVE_CHARDEV_PARALLEL\n static void parallel_chr_open(Chardev *chr,\n                               ChardevBackend *backend,\n-                              bool *be_opened,\n                               Error **errp)\n {\n     ChardevHostdev *parallel = backend->u.parallel.data;\n@@ -251,7 +244,7 @@ static void parallel_chr_open(Chardev *chr,\n     if (fd < 0) {\n         return;\n     }\n-    parallel_chr_open_fd(chr, fd, be_opened, errp);\n+    parallel_chr_open_fd(chr, fd, errp);\n }\n \n static void parallel_chr_parse(QemuOpts *opts, ChardevBackend *backend,\ndiff --git a/chardev/char-pipe.c b/chardev/char-pipe.c\nindex e84492d42b6..2f26372dfc9 100644\n--- a/chardev/char-pipe.c\n+++ b/chardev/char-pipe.c\n@@ -103,10 +103,7 @@ static int win_chr_pipe_init(Chardev *chr, const char *filename,\n     return -1;\n }\n \n-static void pipe_chr_open(Chardev *chr,\n-                          ChardevBackend *backend,\n-                          bool *be_opened,\n-                          Error **errp)\n+static void pipe_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevHostdev *opts = backend->u.pipe.data;\n     const char *filename = opts->device;\n@@ -114,14 +111,13 @@ static void pipe_chr_open(Chardev *chr,\n     if (win_chr_pipe_init(chr, filename, errp) < 0) {\n         return;\n     }\n+\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n #else\n \n-static void pipe_chr_open(Chardev *chr,\n-                          ChardevBackend *backend,\n-                          bool *be_opened,\n-                          Error **errp)\n+static void pipe_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevHostdev *opts = backend->u.pipe.data;\n     int fd_in, fd_out;\n@@ -158,6 +154,8 @@ static void pipe_chr_open(Chardev *chr,\n         }\n         return;\n     }\n+\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n #endif /* !_WIN32 */\ndiff --git a/chardev/char-pty.c b/chardev/char-pty.c\nindex 909ab01f5f2..d4d69a29a95 100644\n--- a/chardev/char-pty.c\n+++ b/chardev/char-pty.c\n@@ -331,10 +331,7 @@ static int qemu_openpty_raw(int *aslave, char *pty_name)\n     return amaster;\n }\n \n-static void pty_chr_open(Chardev *chr,\n-                         ChardevBackend *backend,\n-                         bool *be_opened,\n-                         Error **errp)\n+static void pty_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     PtyChardev *s;\n     int master_fd, slave_fd;\n@@ -364,7 +361,6 @@ static void pty_chr_open(Chardev *chr,\n     qio_channel_set_name(s->ioc, name);\n     g_free(name);\n     s->timer_src = NULL;\n-    *be_opened = false;\n \n     /* create symbolic link */\n     if (path) {\ndiff --git a/chardev/char-ringbuf.c b/chardev/char-ringbuf.c\nindex 19652fe2b3a..30b17a96d3a 100644\n--- a/chardev/char-ringbuf.c\n+++ b/chardev/char-ringbuf.c\n@@ -94,7 +94,6 @@ static void char_ringbuf_finalize(Object *obj)\n \n static void ringbuf_chr_open(Chardev *chr,\n                              ChardevBackend *backend,\n-                             bool *be_opened,\n                              Error **errp)\n {\n     ChardevRingbuf *opts = backend->u.ringbuf.data;\n@@ -111,6 +110,8 @@ static void ringbuf_chr_open(Chardev *chr,\n     d->prod = 0;\n     d->cons = 0;\n     d->cbuf = g_malloc0(d->size);\n+\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n void qmp_ringbuf_write(const char *device, const char *data,\ndiff --git a/chardev/char-serial.c b/chardev/char-serial.c\nindex 54c2b3935cf..9995f184258 100644\n--- a/chardev/char-serial.c\n+++ b/chardev/char-serial.c\n@@ -41,14 +41,15 @@\n \n #ifdef _WIN32\n \n-static void serial_chr_open(Chardev *chr,\n-                            ChardevBackend *backend,\n-                            bool *be_opened,\n-                            Error **errp)\n+static void serial_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevHostdev *serial = backend->u.serial.data;\n+    int ret = win_chr_serial_init(chr, serial->device, errp);\n+    if (ret < 0) {\n+        return;\n+    }\n \n-    win_chr_serial_init(chr, serial->device, errp);\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n #elif defined(__linux__) || defined(__sun__) || defined(__FreeBSD__)      \\\n@@ -258,10 +259,7 @@ static int serial_chr_ioctl(Chardev *chr, int cmd, void *arg)\n     return 0;\n }\n \n-static void serial_chr_open(Chardev *chr,\n-                            ChardevBackend *backend,\n-                            bool *be_opened,\n-                            Error **errp)\n+static void serial_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevHostdev *serial = backend->u.serial.data;\n     int fd;\n@@ -281,6 +279,8 @@ static void serial_chr_open(Chardev *chr,\n         close(fd);\n         return;\n     }\n+\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n #endif /* __linux__ || __sun__ */\n \ndiff --git a/chardev/char-socket.c b/chardev/char-socket.c\nindex a3203f2f97b..2951b2ec9be 100644\n--- a/chardev/char-socket.c\n+++ b/chardev/char-socket.c\n@@ -1365,10 +1365,7 @@ static bool qmp_chardev_validate_socket(ChardevSocket *sock,\n }\n \n \n-static void tcp_chr_open(Chardev *chr,\n-                         ChardevBackend *backend,\n-                         bool *be_opened,\n-                         Error **errp)\n+static void tcp_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     SocketChardev *s = SOCKET_CHARDEV(chr);\n     ChardevSocket *sock = backend->u.socket.data;\n@@ -1439,9 +1436,6 @@ static void tcp_chr_open(Chardev *chr,\n     }\n     s->registered_yank = true;\n \n-    /* be isn't opened until we get a connection */\n-    *be_opened = false;\n-\n     update_disconnected_filename(s);\n \n     if (s->is_listen) {\n@@ -1454,6 +1448,8 @@ static void tcp_chr_open(Chardev *chr,\n             return;\n         }\n     }\n+\n+    /* be isn't opened until we get a connection */\n }\n \n static void tcp_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\ndiff --git a/chardev/char-stdio.c b/chardev/char-stdio.c\nindex f0920a23faa..534f6ed5658 100644\n--- a/chardev/char-stdio.c\n+++ b/chardev/char-stdio.c\n@@ -85,10 +85,7 @@ static void term_stdio_handler(int sig)\n     stdio_chr_set_echo(NULL, stdio_echo_state);\n }\n \n-static void stdio_chr_open(Chardev *chr,\n-                           ChardevBackend *backend,\n-                           bool *be_opened,\n-                           Error **errp)\n+static void stdio_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevStdio *opts = backend->u.stdio.data;\n     struct sigaction act;\n@@ -123,6 +120,8 @@ static void stdio_chr_open(Chardev *chr,\n \n     stdio_allow_signal = !opts->has_signal || opts->signal;\n     stdio_chr_set_echo(chr, false);\n+\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n #endif\n \ndiff --git a/chardev/char-udp.c b/chardev/char-udp.c\nindex 18f4322408a..4c81c95e656 100644\n--- a/chardev/char-udp.c\n+++ b/chardev/char-udp.c\n@@ -188,10 +188,7 @@ static void udp_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\n     }\n }\n \n-static void upd_chr_open(Chardev *chr,\n-                         ChardevBackend *backend,\n-                         bool *be_opened,\n-                         Error **errp)\n+static void upd_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevUdp *udp = backend->u.udp.data;\n     SocketAddress *local_addr = socket_address_flatten(udp->local);\n@@ -214,6 +211,7 @@ static void upd_chr_open(Chardev *chr,\n     g_free(name);\n \n     s->ioc = QIO_CHANNEL(sioc);\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void char_udp_class_init(ObjectClass *oc, const void *data)\ndiff --git a/chardev/char-win-stdio.c b/chardev/char-win-stdio.c\nindex 866f3a20398..0535960ff1b 100644\n--- a/chardev/char-win-stdio.c\n+++ b/chardev/char-win-stdio.c\n@@ -144,7 +144,6 @@ static void win_stiod_chr_set_echo(Chardev *chr, bool echo)\n \n static void win_stdio_chr_open(Chardev *chr,\n                                ChardevBackend *backend,\n-                               bool *be_opened,\n                                Error **errp)\n {\n     ChardevStdio *opts = backend->u.stdio.data;\n@@ -208,6 +207,7 @@ static void win_stdio_chr_open(Chardev *chr,\n \n     win_stiod_chr_set_echo(chr, false);\n \n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n     return;\n \n err3:\ndiff --git a/chardev/char.c b/chardev/char.c\nindex df37d1df161..44bfed36272 100644\n--- a/chardev/char.c\n+++ b/chardev/char.c\n@@ -246,8 +246,7 @@ int qemu_chr_add_client(Chardev *s, int fd)\n         CHARDEV_GET_CLASS(s)->chr_add_client(s, fd) : -1;\n }\n \n-static void qemu_char_open(Chardev *chr, ChardevBackend *backend,\n-                           bool *be_opened, Error **errp)\n+static void qemu_char_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevClass *cc = CHARDEV_GET_CLASS(chr);\n     /* Any ChardevCommon member would work */\n@@ -268,7 +267,7 @@ static void qemu_char_open(Chardev *chr, ChardevBackend *backend,\n     }\n \n     if (cc->chr_open) {\n-        cc->chr_open(chr, backend, be_opened, errp);\n+        cc->chr_open(chr, backend, errp);\n     }\n }\n \n@@ -1009,7 +1008,6 @@ static Chardev *chardev_new(const char *id, const char *typename,\n     Object *obj;\n     Chardev *chr = NULL;\n     Error *local_err = NULL;\n-    bool be_opened = true;\n \n     assert(g_str_has_prefix(typename, \"chardev-\"));\n     assert(id);\n@@ -1020,7 +1018,7 @@ static Chardev *chardev_new(const char *id, const char *typename,\n     chr->label = g_strdup(id);\n     chr->gcontext = gcontext;\n \n-    qemu_char_open(chr, backend, &be_opened, &local_err);\n+    qemu_char_open(chr, backend, &local_err);\n     if (local_err) {\n         error_propagate(errp, local_err);\n         object_unref(obj);\n@@ -1030,9 +1028,6 @@ static Chardev *chardev_new(const char *id, const char *typename,\n     if (!chr->filename) {\n         chr->filename = g_strdup(typename + 8);\n     }\n-    if (be_opened) {\n-        qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n-    }\n \n     return chr;\n }\ndiff --git a/chardev/msmouse.c b/chardev/msmouse.c\nindex d07cd998cb5..9dc04e3b3ec 100644\n--- a/chardev/msmouse.c\n+++ b/chardev/msmouse.c\n@@ -255,16 +255,16 @@ static void char_msmouse_finalize(Object *obj)\n \n static void msmouse_chr_open(Chardev *chr,\n                              ChardevBackend *backend,\n-                             bool *be_opened,\n                              Error **errp)\n {\n     MouseChardev *mouse = MOUSE_CHARDEV(chr);\n \n-    *be_opened = false;\n     mouse->hs = qemu_input_handler_register((DeviceState *)mouse,\n                                             &msmouse_handler);\n     mouse->tiocm = 0;\n     fifo8_create(&mouse->outbuf, MSMOUSE_BUF_SZ);\n+\n+    /* Never send CHR_EVENT_OPENED */\n }\n \n static void char_msmouse_class_init(ObjectClass *oc, const void *data)\ndiff --git a/chardev/spice.c b/chardev/spice.c\nindex 3ea25706653..f5b1f585eb1 100644\n--- a/chardev/spice.c\n+++ b/chardev/spice.c\n@@ -251,9 +251,7 @@ static void chr_open(Chardev *chr, const char *subtype)\n     s->sin.subtype = g_strdup(subtype);\n }\n \n-static void spice_vmc_chr_open(Chardev *chr,\n-                               ChardevBackend *backend,\n-                               bool *be_opened,\n+static void spice_vmc_chr_open(Chardev *chr, ChardevBackend *backend,\n                                Error **errp)\n {\n     ChardevSpiceChannel *spicevmc = backend->u.spicevmc.data;\n@@ -277,13 +275,10 @@ static void spice_vmc_chr_open(Chardev *chr,\n         return;\n     }\n \n-    *be_opened = false;\n     chr_open(chr, type);\n }\n \n-static void spice_port_chr_open(Chardev *chr,\n-                                ChardevBackend *backend,\n-                                bool *be_opened,\n+static void spice_port_chr_open(Chardev *chr, ChardevBackend *backend,\n                                 Error **errp)\n {\n     ChardevSpicePort *spiceport = backend->u.spiceport.data;\n@@ -302,7 +297,6 @@ static void spice_port_chr_open(Chardev *chr,\n \n     chr_open(chr, \"port\");\n \n-    *be_opened = false;\n     s = SPICE_CHARDEV(chr);\n     s->sin.portname = g_strdup(name);\n \ndiff --git a/chardev/wctablet.c b/chardev/wctablet.c\nindex 8285a56e7bc..65b2ceb58c9 100644\n--- a/chardev/wctablet.c\n+++ b/chardev/wctablet.c\n@@ -326,13 +326,10 @@ static void wctablet_chr_finalize(Object *obj)\n \n static void wctablet_chr_open(Chardev *chr,\n                               ChardevBackend *backend,\n-                              bool *be_opened,\n                               Error **errp)\n {\n     TabletChardev *tablet = WCTABLET_CHARDEV(chr);\n \n-    *be_opened = true;\n-\n     /* init state machine */\n     memcpy(tablet->outbuf, WC_FULL_CONFIG_STRING, WC_FULL_CONFIG_STRING_LENGTH);\n     tablet->outlen = WC_FULL_CONFIG_STRING_LENGTH;\n@@ -340,6 +337,8 @@ static void wctablet_chr_open(Chardev *chr,\n \n     tablet->hs = qemu_input_handler_register((DeviceState *)tablet,\n                                              &wctablet_handler);\n+\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void wctablet_chr_class_init(ObjectClass *oc, const void *data)\ndiff --git a/gdbstub/system.c b/gdbstub/system.c\nindex e161b14485b..982857f314a 100644\n--- a/gdbstub/system.c\n+++ b/gdbstub/system.c\n@@ -233,10 +233,9 @@ static int gdb_chr_write(Chardev *chr, const uint8_t *buf, int len)\n     return len;\n }\n \n-static void gdb_chr_open(Chardev *chr, ChardevBackend *backend,\n-                             bool *be_opened, Error **errp)\n+static void gdb_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n-    *be_opened = false;\n+    /* Never send CHR_EVENT_OPENED */\n }\n \n static void char_gdb_class_init(ObjectClass *oc, const void *data)\ndiff --git a/ui/console-vc.c b/ui/console-vc.c\nindex 931068d43ab..4c8ea4c1485 100644\n--- a/ui/console-vc.c\n+++ b/ui/console-vc.c\n@@ -1093,10 +1093,7 @@ void qemu_text_console_update_size(QemuTextConsole *c)\n     dpy_text_resize(QEMU_CONSOLE(c), c->width, c->height);\n }\n \n-static void vc_chr_open(Chardev *chr,\n-                        ChardevBackend *backend,\n-                        bool *be_opened,\n-                        Error **errp)\n+static void vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ChardevVC *vc = backend->u.vc.data;\n     VCChardev *drv = VC_CHARDEV(chr);\n@@ -1144,7 +1141,7 @@ static void vc_chr_open(Chardev *chr,\n         drv->t_attrib = TEXT_ATTRIBUTES_DEFAULT;\n     }\n \n-    *be_opened = true;\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void vc_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\ndiff --git a/ui/dbus-chardev.c b/ui/dbus-chardev.c\nindex f6c426e2209..3e471f84cd8 100644\n--- a/ui/dbus-chardev.c\n+++ b/ui/dbus-chardev.c\n@@ -176,9 +176,7 @@ dbus_chr_send_break(\n     return DBUS_METHOD_INVOCATION_HANDLED;\n }\n \n-static void\n-dbus_chr_open(Chardev *chr, ChardevBackend *backend,\n-              bool *be_opened, Error **errp)\n+static void dbus_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     ERRP_GUARD();\n \n@@ -211,7 +209,7 @@ dbus_chr_open(Chardev *chr, ChardevBackend *backend,\n         return;\n     }\n     CHARDEV_CLASS(object_class_by_name(TYPE_CHARDEV_SOCKET))->chr_open(\n-        chr, be, be_opened, errp);\n+        chr, be, errp);\n }\n \n static void\ndiff --git a/ui/gtk.c b/ui/gtk.c\nindex acf55cdfce2..44b2b868ec9 100644\n--- a/ui/gtk.c\n+++ b/ui/gtk.c\n@@ -1963,10 +1963,7 @@ static void gd_vc_chr_set_echo(Chardev *chr, bool echo)\n \n static int nb_vcs;\n static Chardev *vcs[MAX_VCS];\n-static void gd_vc_chr_open(Chardev *chr,\n-                       ChardevBackend *backend,\n-                       bool *be_opened,\n-                       Error **errp)\n+static void gd_vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     if (nb_vcs == MAX_VCS) {\n         error_setg(errp, \"Maximum number of consoles reached\");\n@@ -1975,10 +1972,10 @@ static void gd_vc_chr_open(Chardev *chr,\n \n     vcs[nb_vcs++] = chr;\n \n-    /* console/chardev init sometimes completes elsewhere in a 2nd\n+    /*\n+     * console/chardev init sometimes completes elsewhere in a 2nd\n      * stage, so defer OPENED events until they are fully initialized\n      */\n-    *be_opened = false;\n }\n \n static void char_gd_vc_class_init(ObjectClass *oc, const void *data)\ndiff --git a/ui/spice-app.c b/ui/spice-app.c\nindex ea0b62a22b7..7ac9ae4e78d 100644\n--- a/ui/spice-app.c\n+++ b/ui/spice-app.c\n@@ -49,8 +49,7 @@ struct VCChardev {\n \n struct VCChardevClass {\n     ChardevClass parent;\n-    void (*parent_open)(Chardev *chr, ChardevBackend *backend,\n-                        bool *be_opened, Error **errp);\n+    void (*parent_open)(Chardev *chr, ChardevBackend *backend, Error **errp);\n };\n \n #define TYPE_CHARDEV_VC \"chardev-vc\"\n@@ -67,10 +66,7 @@ chr_spice_backend_new(void)\n     return be;\n }\n \n-static void vc_chr_open(Chardev *chr,\n-                        ChardevBackend *backend,\n-                        bool *be_opened,\n-                        Error **errp)\n+static void vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n {\n     VCChardevClass *vc = CHARDEV_VC_GET_CLASS(chr);\n     ChardevBackend *be;\n@@ -87,7 +83,7 @@ static void vc_chr_open(Chardev *chr,\n     be = chr_spice_backend_new();\n     be->u.spiceport.data->fqdn = fqdn ?\n         g_strdup(fqdn) : g_strdup_printf(\"org.qemu.console.%s\", chr->label);\n-    vc->parent_open(chr, be, be_opened, errp);\n+    vc->parent_open(chr, be, errp);\n     qapi_free_ChardevBackend(be);\n }\n \ndiff --git a/ui/vdagent.c b/ui/vdagent.c\nindex 090771ab171..644e9acaaeb 100644\n--- a/ui/vdagent.c\n+++ b/ui/vdagent.c\n@@ -662,7 +662,6 @@ static void vdagent_chr_recv_clipboard(VDAgentChardev *vd, VDAgentMessage *msg)\n \n static void vdagent_chr_open(Chardev *chr,\n                              ChardevBackend *backend,\n-                             bool *be_opened,\n                              Error **errp)\n {\n     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(chr);\n@@ -692,7 +691,7 @@ static void vdagent_chr_open(Chardev *chr,\n                                                    &vdagent_mouse_handler);\n     }\n \n-    *be_opened = true;\n+    qemu_chr_be_event(chr, CHR_EVENT_OPENED);\n }\n \n static void vdagent_clipboard_peer_register(VDAgentChardev *vd)\n",
    "prefixes": [
        "PULL",
        "v2",
        "06/15"
    ]
}