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