|
|
|
|
chardev_ss.add(files(
|
|
|
|
|
'char-fe.c',
|
|
|
|
|
'char-file.c',
|
|
|
|
|
'char-io.c',
|
|
|
|
|
'char-mux.c',
|
chardev/char-hub: implement backend chardev aggregator
This patch implements a new chardev backend `hub` device, which
aggregates input from multiple backend devices and forwards it to a
single frontend device. Additionally, `hub` device takes the output
from the frontend device and sends it back to all the connected
backend devices. This allows for seamless interaction between
different backend devices and a single frontend interface.
The idea of the change is trivial: keep list of backend devices
(up to 4), init them on demand and forward data buffer back and
forth.
The following is QEMU command line example:
-chardev pty,path=/tmp/pty,id=pty0 \
-chardev vc,id=vc0 \
-chardev hub,id=hub0,chardevs.0=pty0,chardevs.1=vc0 \
-device virtconsole,chardev=hub0 \
-vnc 0.0.0.0:0
Which creates 2 backend devices: text virtual console (`vc0`) and a
pseudo TTY (`pty0`) connected to the single virtio hvc console with
the backend aggregator (`hub0`) help. `vc0` renders text to an image,
which can be shared over the VNC protocol. `pty0` is a pseudo TTY
backend which provides biderectional communication to the virtio hvc
console.
'chardevs.N' list syntax is used for the sake of compatibility with
the representation of JSON lists in 'key=val' pairs format of the
util/keyval.c, despite the fact that modern QAPI way of parsing,
namely qobject_input_visitor_new_str(), is not used. Choice of keeping
QAPI list syntax may help to smoothly switch to modern parsing in the
future.
Signed-off-by: Roman Penyaev <r.peniaev@gmail.com>
Reviewed-by: "Marc-André Lureau" <marcandre.lureau@redhat.com>
Cc: qemu-devel@nongnu.org
Message-ID: <20250123085327.965501-3-r.peniaev@gmail.com>
2 years ago
|
|
|
'char-hub.c',
|
|
|
|
|
'char-null.c',
|
|
|
|
|
'char-pipe.c',
|
|
|
|
|
'char-ringbuf.c',
|
|
|
|
|
'char-serial.c',
|
|
|
|
|
'char-socket.c',
|
|
|
|
|
'char-stdio.c',
|
|
|
|
|
'char-udp.c',
|
|
|
|
|
'char.c',
|
|
|
|
|
))
|
|
|
|
|
if host_os == 'windows'
|
|
|
|
|
chardev_ss.add(files(
|
|
|
|
|
'char-console.c',
|
|
|
|
|
'char-win-stdio.c',
|
|
|
|
|
'char-win.c',
|
|
|
|
|
))
|
|
|
|
|
else
|
|
|
|
|
chardev_ss.add(files(
|
|
|
|
|
'char-fd.c',
|
chardev/parallel: Don't close stdin on inappropriate device
The __linux__ version of qemu_chr_open_pp_fd() tries to claim the
parport device with a PPCLAIM ioctl(). On success, it stores the file
descriptor in the chardev object, and returns success. On failure, it
closes the file descriptor, and returns failure.
chardev_new() then passes the Chardev to object_unref(). This duly
calls char_parallel_finalize(), which closes the file descriptor
stored in the chardev object. Since qemu_chr_open_pp_fd() didn't
store it, it's still zero, so this closes standard input. Ooopsie.
To demonstate, add a unit test. With the bug above unfixed, running
this test closes standard input. char_hotswap_test() happens to run
next. It opens a socket, duly gets file descriptor 0, and since it
tests for success with > 0 instead of >= 0, it fails.
The new unit test needs to be conditional exactly like the chardev it
tests. Since the condition is rather complicated, steal the solution
from the serial chardev: define HAVE_CHARDEV_PARALLEL in qemu/osdep.h.
This also permits simplifying chardev/meson.build a bit.
The bug fix is easy enough: store the file descriptor, and leave
closing it to char_parallel_finalize().
The next commit will fix char_hotswap_test()'s test for success.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240203080228.2766159-2-armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
[Test fixed up for BSDs, indentation fixed up, commit message improved]
3 years ago
|
|
|
'char-parallel.c',
|
|
|
|
|
'char-pty.c',
|
|
|
|
|
), util)
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
chardev_ss = chardev_ss.apply({})
|
|
|
|
|
|
|
|
|
|
system_ss.add(files(
|
|
|
|
|
'char-hmp-cmds.c',
|
|
|
|
|
'msmouse.c',
|
|
|
|
|
'wctablet.c',
|
|
|
|
|
'testdev.c'))
|
|
|
|
|
|
|
|
|
|
chardev_modules = {}
|
|
|
|
|
|
|
|
|
|
if brlapi.found()
|
|
|
|
|
module_ss = ss.source_set()
|
|
|
|
|
module_ss.add(when: [brlapi], if_true: [files('baum.c'), pixman])
|
|
|
|
|
chardev_modules += { 'baum': module_ss }
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
if spice.found()
|
|
|
|
|
module_ss = ss.source_set()
|
|
|
|
|
module_ss.add(when: [spice], if_true: files('spice.c'))
|
|
|
|
|
chardev_modules += { 'spice': module_ss }
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
modules += { 'chardev': chardev_modules }
|