[PATCH v2 16/25] chardev: add .chr_get_client() handler

Vladimir Sementsov-Ogievskiy posted 25 patches 4 weeks, 1 day ago
[PATCH v2 16/25] chardev: add .chr_get_client() handler
Posted by Vladimir Sementsov-Ogievskiy 4 weeks, 1 day ago
A pair for .char_add_client(), to be used to support backend-transfer
migration of chardev attached to vhost-user-blk in following commits.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
 chardev/char-socket.c  | 7 +++++++
 chardev/char.c         | 6 ++++++
 include/chardev/char.h | 4 ++++
 3 files changed, 17 insertions(+)

diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 0a5738c158..51bb9d0a2d 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -929,6 +929,12 @@ static int tcp_chr_new_client(Chardev *chr, QIOChannelSocket *sioc)
     return 0;
 }
 
+static int tcp_chr_get_client(Chardev *chr)
+{
+    SocketChardev *s = SOCKET_CHARDEV(chr);
+
+    return s->sioc->fd;
+}
 
 static int tcp_chr_add_client(Chardev *chr, int fd)
 {
@@ -1591,6 +1597,7 @@ static void char_socket_class_init(ObjectClass *oc, const void *data)
     cc->get_msgfds = tcp_get_msgfds;
     cc->set_msgfds = tcp_set_msgfds;
     cc->chr_add_client = tcp_chr_add_client;
+    cc->chr_get_client = tcp_chr_get_client;
     cc->chr_add_watch = tcp_chr_add_watch;
     cc->chr_update_read_handler = tcp_chr_update_read_handler;
 
diff --git a/chardev/char.c b/chardev/char.c
index b68d44e394..3c2ed972f1 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -247,6 +247,12 @@ int qemu_chr_add_client(Chardev *s, int fd)
         CHARDEV_GET_CLASS(s)->chr_add_client(s, fd) : -1;
 }
 
+int qemu_chr_get_client(Chardev *s)
+{
+    return CHARDEV_GET_CLASS(s)->chr_get_client ?
+        CHARDEV_GET_CLASS(s)->chr_get_client(s) : -1;
+}
+
 static bool qemu_char_open(Chardev *chr, ChardevBackend *backend,
                            const char *default_filename, Error **errp)
 {
diff --git a/include/chardev/char.h b/include/chardev/char.h
index d2e01f0f9c..671f64cb7e 100644
--- a/include/chardev/char.h
+++ b/include/chardev/char.h
@@ -216,6 +216,7 @@ void qemu_chr_be_update_read_handlers(Chardev *s,
 void qemu_chr_be_event(Chardev *s, QEMUChrEvent event);
 
 int qemu_chr_add_client(Chardev *s, int fd);
+int qemu_chr_get_client(Chardev *s);
 Chardev *qemu_chr_find(const char *name);
 
 bool qemu_chr_has_feature(Chardev *chr,
@@ -316,6 +317,9 @@ struct ChardevClass {
     /* accept the given fd */
     int (*chr_add_client)(Chardev *chr, int fd);
 
+    /* get fd back */
+    int (*chr_get_client)(Chardev *chr);
+
     /* wait for a connection */
     int (*chr_wait_connected)(Chardev *chr, Error **errp);
 
-- 
2.48.1
Re: [PATCH v2 16/25] chardev: add .chr_get_client() handler
Posted by Daniel P. Berrangé 4 weeks, 1 day ago
On Thu, Oct 16, 2025 at 02:40:53PM +0300, Vladimir Sementsov-Ogievskiy wrote:
> A pair for .char_add_client(), to be used to support backend-transfer
> migration of chardev attached to vhost-user-blk in following commits.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> ---
>  chardev/char-socket.c  | 7 +++++++
>  chardev/char.c         | 6 ++++++
>  include/chardev/char.h | 4 ++++
>  3 files changed, 17 insertions(+)
> 
> diff --git a/chardev/char-socket.c b/chardev/char-socket.c
> index 0a5738c158..51bb9d0a2d 100644
> --- a/chardev/char-socket.c
> +++ b/chardev/char-socket.c
> @@ -929,6 +929,12 @@ static int tcp_chr_new_client(Chardev *chr, QIOChannelSocket *sioc)
>      return 0;
>  }
>  
> +static int tcp_chr_get_client(Chardev *chr)
> +{
> +    SocketChardev *s = SOCKET_CHARDEV(chr);
> +
> +    return s->sioc->fd;
> +}

This will crash on a NULL s->sioc pointer when the chardev
is not connected. More generally it feels wrong to be exposing
internal impl details of the socket chardev in this way.


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|