xref: /openbmc/qemu/include/chardev/char-fe.h (revision c155d13167c6ace099e351e28125f9eb3694ae27)
14d43a603SMarc-André Lureau #ifndef QEMU_CHAR_FE_H
24d43a603SMarc-André Lureau #define QEMU_CHAR_FE_H
34d43a603SMarc-André Lureau 
44d43a603SMarc-André Lureau #include "chardev/char.h"
5db725815SMarkus Armbruster #include "qemu/main-loop.h"
64d43a603SMarc-André Lureau 
7083b266fSPhilippe Mathieu-Daudé typedef void IOEventHandler(void *opaque, QEMUChrEvent event);
881517ba3SAnton Nefedov typedef int BackendChangeHandler(void *opaque);
94d43a603SMarc-André Lureau 
1067b5595dSAlex Bennée /**
1167b5595dSAlex Bennée  * struct CharBackend - back end as seen by front end
1267b5595dSAlex Bennée  * @fe_is_open: the front end is ready for IO
1367b5595dSAlex Bennée  *
1467b5595dSAlex Bennée  * The actual backend is Chardev
1567b5595dSAlex Bennée  */
164d43a603SMarc-André Lureau struct CharBackend {
174d43a603SMarc-André Lureau     Chardev *chr;
184d43a603SMarc-André Lureau     IOEventHandler *chr_event;
194d43a603SMarc-André Lureau     IOCanReadHandler *chr_can_read;
204d43a603SMarc-André Lureau     IOReadHandler *chr_read;
2181517ba3SAnton Nefedov     BackendChangeHandler *chr_be_change;
224d43a603SMarc-André Lureau     void *opaque;
23*c64f0bc1SRoman Penyaev     unsigned int tag;
2467b5595dSAlex Bennée     bool fe_is_open;
254d43a603SMarc-André Lureau };
264d43a603SMarc-André Lureau 
274d43a603SMarc-André Lureau /**
285662576aSMarc-André Lureau  * qemu_chr_fe_init:
294d43a603SMarc-André Lureau  *
304d43a603SMarc-André Lureau  * Initializes a front end for the given CharBackend and
314d43a603SMarc-André Lureau  * Chardev. Call qemu_chr_fe_deinit() to remove the association and
324d43a603SMarc-André Lureau  * release the driver.
334d43a603SMarc-André Lureau  *
344d43a603SMarc-André Lureau  * Returns: false on error.
354d43a603SMarc-André Lureau  */
364d43a603SMarc-André Lureau bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp);
374d43a603SMarc-André Lureau 
384d43a603SMarc-André Lureau /**
395662576aSMarc-André Lureau  * qemu_chr_fe_deinit:
401ce2610cSMarc-André Lureau  * @b: a CharBackend
411ce2610cSMarc-André Lureau  * @del: if true, delete the chardev backend
424d43a603SMarc-André Lureau *
434d43a603SMarc-André Lureau  * Dissociate the CharBackend from the Chardev.
444d43a603SMarc-André Lureau  *
454d43a603SMarc-André Lureau  * Safe to call without associated Chardev.
464d43a603SMarc-André Lureau  */
471ce2610cSMarc-André Lureau void qemu_chr_fe_deinit(CharBackend *b, bool del);
484d43a603SMarc-André Lureau 
494d43a603SMarc-André Lureau /**
505662576aSMarc-André Lureau  * qemu_chr_fe_get_driver:
514d43a603SMarc-André Lureau  *
525662576aSMarc-André Lureau  * Returns: the driver associated with a CharBackend or NULL if no
534d43a603SMarc-André Lureau  * associated Chardev.
547c44a2a9SAnton Nefedov  * Note: avoid this function as the driver should never be accessed directly,
557c44a2a9SAnton Nefedov  *       especially by the frontends that support chardevice hotswap.
567c44a2a9SAnton Nefedov  *       Consider qemu_chr_fe_backend_connected() to check for driver existence
574d43a603SMarc-André Lureau  */
584d43a603SMarc-André Lureau Chardev *qemu_chr_fe_get_driver(CharBackend *be);
594d43a603SMarc-André Lureau 
604d43a603SMarc-André Lureau /**
615662576aSMarc-André Lureau  * qemu_chr_fe_backend_connected:
627c44a2a9SAnton Nefedov  *
635662576aSMarc-André Lureau  * Returns: true if there is a chardevice associated with @be.
647c44a2a9SAnton Nefedov  */
657c44a2a9SAnton Nefedov bool qemu_chr_fe_backend_connected(CharBackend *be);
667c44a2a9SAnton Nefedov 
677c44a2a9SAnton Nefedov /**
685662576aSMarc-André Lureau  * qemu_chr_fe_backend_open:
6930650701SAnton Nefedov  *
705662576aSMarc-André Lureau  * Returns: true if chardevice associated with @be is open.
7130650701SAnton Nefedov  */
7230650701SAnton Nefedov bool qemu_chr_fe_backend_open(CharBackend *be);
7330650701SAnton Nefedov 
7430650701SAnton Nefedov /**
757a9657efSArtem Pisarenko  * qemu_chr_fe_set_handlers_full:
764d43a603SMarc-André Lureau  * @b: a CharBackend
774d43a603SMarc-André Lureau  * @fd_can_read: callback to get the amount of data the frontend may
784d43a603SMarc-André Lureau  *               receive
794d43a603SMarc-André Lureau  * @fd_read: callback to receive data from char
804d43a603SMarc-André Lureau  * @fd_event: event callback
8181517ba3SAnton Nefedov  * @be_change: backend change callback; passing NULL means hot backend change
8281517ba3SAnton Nefedov  *             is not supported and will not be attempted
834d43a603SMarc-André Lureau  * @opaque: an opaque pointer for the callbacks
844d43a603SMarc-André Lureau  * @context: a main loop context or NULL for the default
85a1a62cedSMichael Tokarev  * @set_open: whether to call qemu_chr_fe_set_open() implicitly when
864d43a603SMarc-André Lureau  * any of the handler is non-NULL
877a9657efSArtem Pisarenko  * @sync_state: whether to issue event callback with updated state
884d43a603SMarc-André Lureau  *
894d43a603SMarc-André Lureau  * Set the front end char handlers. The front end takes the focus if
904d43a603SMarc-André Lureau  * any of the handler is non-NULL.
914d43a603SMarc-André Lureau  *
924d43a603SMarc-André Lureau  * Without associated Chardev, nothing is changed.
934d43a603SMarc-André Lureau  */
947a9657efSArtem Pisarenko void qemu_chr_fe_set_handlers_full(CharBackend *b,
957a9657efSArtem Pisarenko                                    IOCanReadHandler *fd_can_read,
967a9657efSArtem Pisarenko                                    IOReadHandler *fd_read,
977a9657efSArtem Pisarenko                                    IOEventHandler *fd_event,
987a9657efSArtem Pisarenko                                    BackendChangeHandler *be_change,
997a9657efSArtem Pisarenko                                    void *opaque,
1007a9657efSArtem Pisarenko                                    GMainContext *context,
1017a9657efSArtem Pisarenko                                    bool set_open,
1027a9657efSArtem Pisarenko                                    bool sync_state);
1037a9657efSArtem Pisarenko 
1047a9657efSArtem Pisarenko /**
1057a9657efSArtem Pisarenko  * qemu_chr_fe_set_handlers:
1067a9657efSArtem Pisarenko  *
1077a9657efSArtem Pisarenko  * Version of qemu_chr_fe_set_handlers_full() with sync_state = true.
1087a9657efSArtem Pisarenko  */
1094d43a603SMarc-André Lureau void qemu_chr_fe_set_handlers(CharBackend *b,
1104d43a603SMarc-André Lureau                               IOCanReadHandler *fd_can_read,
1114d43a603SMarc-André Lureau                               IOReadHandler *fd_read,
1124d43a603SMarc-André Lureau                               IOEventHandler *fd_event,
11381517ba3SAnton Nefedov                               BackendChangeHandler *be_change,
1144d43a603SMarc-André Lureau                               void *opaque,
1154d43a603SMarc-André Lureau                               GMainContext *context,
1164d43a603SMarc-André Lureau                               bool set_open);
1174d43a603SMarc-André Lureau 
1184d43a603SMarc-André Lureau /**
1195662576aSMarc-André Lureau  * qemu_chr_fe_take_focus:
1204d43a603SMarc-André Lureau  *
1214d43a603SMarc-André Lureau  * Take the focus (if the front end is muxed).
1224d43a603SMarc-André Lureau  *
1234d43a603SMarc-André Lureau  * Without associated Chardev, nothing is changed.
1244d43a603SMarc-André Lureau  */
1254d43a603SMarc-André Lureau void qemu_chr_fe_take_focus(CharBackend *b);
1264d43a603SMarc-André Lureau 
1274d43a603SMarc-André Lureau /**
1285662576aSMarc-André Lureau  * qemu_chr_fe_accept_input:
1294d43a603SMarc-André Lureau  *
1304d43a603SMarc-André Lureau  * Notify that the frontend is ready to receive data
1314d43a603SMarc-André Lureau  */
1324d43a603SMarc-André Lureau void qemu_chr_fe_accept_input(CharBackend *be);
1334d43a603SMarc-André Lureau 
1344d43a603SMarc-André Lureau /**
1355662576aSMarc-André Lureau  * qemu_chr_fe_disconnect:
1364d43a603SMarc-André Lureau  *
1377351681eSJulia Suvorova  * Close a fd accepted by character backend.
1384d43a603SMarc-André Lureau  * Without associated Chardev, do nothing.
1394d43a603SMarc-André Lureau  */
1404d43a603SMarc-André Lureau void qemu_chr_fe_disconnect(CharBackend *be);
1414d43a603SMarc-André Lureau 
1424d43a603SMarc-André Lureau /**
1435662576aSMarc-André Lureau  * qemu_chr_fe_wait_connected:
1444d43a603SMarc-André Lureau  *
145a1a62cedSMichael Tokarev  * Wait for character backend to be connected, return < 0 on error or
1467351681eSJulia Suvorova  * if no associated Chardev.
1474d43a603SMarc-André Lureau  */
1484d43a603SMarc-André Lureau int qemu_chr_fe_wait_connected(CharBackend *be, Error **errp);
1494d43a603SMarc-André Lureau 
1504d43a603SMarc-André Lureau /**
1515662576aSMarc-André Lureau  * qemu_chr_fe_set_echo:
1525662576aSMarc-André Lureau  * @echo: true to enable echo, false to disable echo
1534d43a603SMarc-André Lureau  *
1544d43a603SMarc-André Lureau  * Ask the backend to override its normal echo setting.  This only really
1554d43a603SMarc-André Lureau  * applies to the stdio backend and is used by the QMP server such that you
1564d43a603SMarc-André Lureau  * can see what you type if you try to type QMP commands.
1574d43a603SMarc-André Lureau  * Without associated Chardev, do nothing.
1584d43a603SMarc-André Lureau  */
1594d43a603SMarc-André Lureau void qemu_chr_fe_set_echo(CharBackend *be, bool echo);
1604d43a603SMarc-André Lureau 
1614d43a603SMarc-André Lureau /**
1625662576aSMarc-André Lureau  * qemu_chr_fe_set_open:
16367b5595dSAlex Bennée  * @be: a CharBackend
16467b5595dSAlex Bennée  * @is_open: the front end open status
1654d43a603SMarc-André Lureau  *
16667b5595dSAlex Bennée  * This is an indication that the front end is ready (or not) to begin
16767b5595dSAlex Bennée  * doing I/O. Without associated Chardev, do nothing.
1684d43a603SMarc-André Lureau  */
16967b5595dSAlex Bennée void qemu_chr_fe_set_open(CharBackend *be, bool is_open);
1704d43a603SMarc-André Lureau 
1714d43a603SMarc-André Lureau /**
1725662576aSMarc-André Lureau  * qemu_chr_fe_printf:
1735662576aSMarc-André Lureau  * @fmt: see #printf
1744d43a603SMarc-André Lureau  *
1754d43a603SMarc-André Lureau  * Write to a character backend using a printf style interface.  This
1764d43a603SMarc-André Lureau  * function is thread-safe. It does nothing without associated
1774d43a603SMarc-André Lureau  * Chardev.
1784d43a603SMarc-André Lureau  */
1794d43a603SMarc-André Lureau void qemu_chr_fe_printf(CharBackend *be, const char *fmt, ...)
1809edc6313SMarc-André Lureau     G_GNUC_PRINTF(2, 3);
1814d43a603SMarc-André Lureau 
182bf7b1eabSMarc-André Lureau 
183b3a1090fSPhilippe Mathieu-Daudé /**
184b3a1090fSPhilippe Mathieu-Daudé  * FEWatchFunc: a #GSourceFunc called when any conditions requested by
185b3a1090fSPhilippe Mathieu-Daudé  *              qemu_chr_fe_add_watch() is satisfied.
186b3a1090fSPhilippe Mathieu-Daudé  * @do_not_use: depending on the underlying chardev, a GIOChannel or a
187b3a1090fSPhilippe Mathieu-Daudé  *              QIOChannel. DO NOT USE!
188b3a1090fSPhilippe Mathieu-Daudé  * @cond: bitwise combination of conditions watched and satisfied
189b3a1090fSPhilippe Mathieu-Daudé  *              before calling this callback.
190b3a1090fSPhilippe Mathieu-Daudé  * @data: user data passed at creation to qemu_chr_fe_add_watch(). Can
191b3a1090fSPhilippe Mathieu-Daudé  *              be NULL.
192b3a1090fSPhilippe Mathieu-Daudé  *
193b3a1090fSPhilippe Mathieu-Daudé  * Returns: G_SOURCE_REMOVE if the GSource should be removed from the
194b3a1090fSPhilippe Mathieu-Daudé  *              main loop, or G_SOURCE_CONTINUE to leave the GSource in
195b3a1090fSPhilippe Mathieu-Daudé  *              the main loop.
196b3a1090fSPhilippe Mathieu-Daudé  */
197bf7b1eabSMarc-André Lureau typedef gboolean (*FEWatchFunc)(void *do_not_use, GIOCondition condition, void *data);
198bf7b1eabSMarc-André Lureau 
1994d43a603SMarc-André Lureau /**
2005662576aSMarc-André Lureau  * qemu_chr_fe_add_watch:
2015662576aSMarc-André Lureau  * @cond: the condition to poll for
2025662576aSMarc-André Lureau  * @func: the function to call when the condition happens
2035662576aSMarc-André Lureau  * @user_data: the opaque pointer to pass to @func
2044d43a603SMarc-André Lureau  *
2054d43a603SMarc-André Lureau  * If the backend is connected, create and add a #GSource that fires
2064d43a603SMarc-André Lureau  * when the given condition (typically G_IO_OUT|G_IO_HUP or G_IO_HUP)
2074d43a603SMarc-André Lureau  * is active; return the #GSource's tag.  If it is disconnected,
2084d43a603SMarc-André Lureau  * or without associated Chardev, return 0.
2094d43a603SMarc-André Lureau  *
21064c3f266SMarc-André Lureau  * Note that you are responsible to update the front-end sources if
21164c3f266SMarc-André Lureau  * you are switching the main context with qemu_chr_fe_set_handlers().
21264c3f266SMarc-André Lureau  *
213bf7b1eabSMarc-André Lureau  * Warning: DO NOT use the first callback argument (it may be either
214bf7b1eabSMarc-André Lureau  * a GIOChannel or a QIOChannel, depending on the underlying chardev)
215bf7b1eabSMarc-André Lureau  *
2164d43a603SMarc-André Lureau  * Returns: the source tag
2174d43a603SMarc-André Lureau  */
2184d43a603SMarc-André Lureau guint qemu_chr_fe_add_watch(CharBackend *be, GIOCondition cond,
219bf7b1eabSMarc-André Lureau                             FEWatchFunc func, void *user_data);
2204d43a603SMarc-André Lureau 
2214d43a603SMarc-André Lureau /**
2225662576aSMarc-André Lureau  * qemu_chr_fe_write:
2235662576aSMarc-André Lureau  * @buf: the data
2245662576aSMarc-André Lureau  * @len: the number of bytes to send
2254d43a603SMarc-André Lureau  *
2264d43a603SMarc-André Lureau  * Write data to a character backend from the front end.  This function
2274d43a603SMarc-André Lureau  * will send data from the front end to the back end.  This function
2284d43a603SMarc-André Lureau  * is thread-safe.
2294d43a603SMarc-André Lureau  *
2307351681eSJulia Suvorova  * Returns: the number of bytes consumed (0 if no associated Chardev)
231b07f0776SPhilippe Mathieu-Daudé  *          or -1 on error.
2324d43a603SMarc-André Lureau  */
2334d43a603SMarc-André Lureau int qemu_chr_fe_write(CharBackend *be, const uint8_t *buf, int len);
2344d43a603SMarc-André Lureau 
2354d43a603SMarc-André Lureau /**
2365662576aSMarc-André Lureau  * qemu_chr_fe_write_all:
2375662576aSMarc-André Lureau  * @buf: the data
2385662576aSMarc-André Lureau  * @len: the number of bytes to send
2394d43a603SMarc-André Lureau  *
2404d43a603SMarc-André Lureau  * Write data to a character backend from the front end.  This function will
2414d43a603SMarc-André Lureau  * send data from the front end to the back end.  Unlike @qemu_chr_fe_write,
2424d43a603SMarc-André Lureau  * this function will block if the back end cannot consume all of the data
2434d43a603SMarc-André Lureau  * attempted to be written.  This function is thread-safe.
2444d43a603SMarc-André Lureau  *
2457351681eSJulia Suvorova  * Returns: the number of bytes consumed (0 if no associated Chardev)
246b07f0776SPhilippe Mathieu-Daudé  *          or -1 on error.
2474d43a603SMarc-André Lureau  */
2484d43a603SMarc-André Lureau int qemu_chr_fe_write_all(CharBackend *be, const uint8_t *buf, int len);
2494d43a603SMarc-André Lureau 
2504d43a603SMarc-André Lureau /**
2515662576aSMarc-André Lureau  * qemu_chr_fe_read_all:
2525662576aSMarc-André Lureau  * @buf: the data buffer
2535662576aSMarc-André Lureau  * @len: the number of bytes to read
2544d43a603SMarc-André Lureau  *
2554d43a603SMarc-André Lureau  * Read data to a buffer from the back end.
2564d43a603SMarc-André Lureau  *
2577351681eSJulia Suvorova  * Returns: the number of bytes read (0 if no associated Chardev)
258b07f0776SPhilippe Mathieu-Daudé  *          or -1 on error.
2594d43a603SMarc-André Lureau  */
2604d43a603SMarc-André Lureau int qemu_chr_fe_read_all(CharBackend *be, uint8_t *buf, int len);
2614d43a603SMarc-André Lureau 
2624d43a603SMarc-André Lureau /**
2635662576aSMarc-André Lureau  * qemu_chr_fe_ioctl:
2645662576aSMarc-André Lureau  * @cmd: see CHR_IOCTL_*
2655662576aSMarc-André Lureau  * @arg: the data associated with @cmd
2664d43a603SMarc-André Lureau  *
2674d43a603SMarc-André Lureau  * Issue a device specific ioctl to a backend.  This function is thread-safe.
2684d43a603SMarc-André Lureau  *
2694d43a603SMarc-André Lureau  * Returns: if @cmd is not supported by the backend or there is no
2704d43a603SMarc-André Lureau  *          associated Chardev, -ENOTSUP, otherwise the return
2714d43a603SMarc-André Lureau  *          value depends on the semantics of @cmd
2724d43a603SMarc-André Lureau  */
2734d43a603SMarc-André Lureau int qemu_chr_fe_ioctl(CharBackend *be, int cmd, void *arg);
2744d43a603SMarc-André Lureau 
2754d43a603SMarc-André Lureau /**
2765662576aSMarc-André Lureau  * qemu_chr_fe_get_msgfd:
2774d43a603SMarc-André Lureau  *
2784d43a603SMarc-André Lureau  * For backends capable of fd passing, return the latest file descriptor passed
2794d43a603SMarc-André Lureau  * by a client.
2804d43a603SMarc-André Lureau  *
2814d43a603SMarc-André Lureau  * Returns: -1 if fd passing isn't supported or there is no pending file
2824d43a603SMarc-André Lureau  *          descriptor.  If a file descriptor is returned, subsequent calls to
2834d43a603SMarc-André Lureau  *          this function will return -1 until a client sends a new file
2844d43a603SMarc-André Lureau  *          descriptor.
2854d43a603SMarc-André Lureau  */
2864d43a603SMarc-André Lureau int qemu_chr_fe_get_msgfd(CharBackend *be);
2874d43a603SMarc-André Lureau 
2884d43a603SMarc-André Lureau /**
2895662576aSMarc-André Lureau  * qemu_chr_fe_get_msgfds:
2904d43a603SMarc-André Lureau  *
2914d43a603SMarc-André Lureau  * For backends capable of fd passing, return the number of file received
2924d43a603SMarc-André Lureau  * descriptors and fills the fds array up to num elements
2934d43a603SMarc-André Lureau  *
2944d43a603SMarc-André Lureau  * Returns: -1 if fd passing isn't supported or there are no pending file
2954d43a603SMarc-André Lureau  *          descriptors.  If file descriptors are returned, subsequent calls to
2964d43a603SMarc-André Lureau  *          this function will return -1 until a client sends a new set of file
2974d43a603SMarc-André Lureau  *          descriptors.
2984d43a603SMarc-André Lureau  */
2994d43a603SMarc-André Lureau int qemu_chr_fe_get_msgfds(CharBackend *be, int *fds, int num);
3004d43a603SMarc-André Lureau 
3014d43a603SMarc-André Lureau /**
3025662576aSMarc-André Lureau  * qemu_chr_fe_set_msgfds:
3034d43a603SMarc-André Lureau  *
3044d43a603SMarc-André Lureau  * For backends capable of fd passing, set an array of fds to be passed with
3054d43a603SMarc-André Lureau  * the next send operation.
3064d43a603SMarc-André Lureau  * A subsequent call to this function before calling a write function will
3074d43a603SMarc-André Lureau  * result in overwriting the fd array with the new value without being send.
3084d43a603SMarc-André Lureau  * Upon writing the message the fd array is freed.
3094d43a603SMarc-André Lureau  *
3104d43a603SMarc-André Lureau  * Returns: -1 if fd passing isn't supported or no associated Chardev.
3114d43a603SMarc-André Lureau  */
3124d43a603SMarc-André Lureau int qemu_chr_fe_set_msgfds(CharBackend *be, int *fds, int num);
3134d43a603SMarc-André Lureau 
3144d43a603SMarc-André Lureau #endif /* QEMU_CHAR_FE_H */
315