1666a3af9SDaniel P. Berrange /* 2666a3af9SDaniel P. Berrange * QEMU I/O channels 3666a3af9SDaniel P. Berrange * 4666a3af9SDaniel P. Berrange * Copyright (c) 2015 Red Hat, Inc. 5666a3af9SDaniel P. Berrange * 6666a3af9SDaniel P. Berrange * This library is free software; you can redistribute it and/or 7666a3af9SDaniel P. Berrange * modify it under the terms of the GNU Lesser General Public 8666a3af9SDaniel P. Berrange * License as published by the Free Software Foundation; either 9666a3af9SDaniel P. Berrange * version 2 of the License, or (at your option) any later version. 10666a3af9SDaniel P. Berrange * 11666a3af9SDaniel P. Berrange * This library is distributed in the hope that it will be useful, 12666a3af9SDaniel P. Berrange * but WITHOUT ANY WARRANTY; without even the implied warranty of 13666a3af9SDaniel P. Berrange * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14666a3af9SDaniel P. Berrange * Lesser General Public License for more details. 15666a3af9SDaniel P. Berrange * 16666a3af9SDaniel P. Berrange * You should have received a copy of the GNU Lesser General Public 17666a3af9SDaniel P. Berrange * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18666a3af9SDaniel P. Berrange * 19666a3af9SDaniel P. Berrange */ 20666a3af9SDaniel P. Berrange 212a6a4076SMarkus Armbruster #ifndef QIO_CHANNEL_H 222a6a4076SMarkus Armbruster #define QIO_CHANNEL_H 23666a3af9SDaniel P. Berrange 24666a3af9SDaniel P. Berrange #include "qemu-common.h" 25666a3af9SDaniel P. Berrange #include "qom/object.h" 26c4c497d2SPaolo Bonzini #include "qemu/coroutine.h" 27bf88c124SPaolo Bonzini #include "block/aio.h" 28666a3af9SDaniel P. Berrange 29666a3af9SDaniel P. Berrange #define TYPE_QIO_CHANNEL "qio-channel" 30666a3af9SDaniel P. Berrange #define QIO_CHANNEL(obj) \ 31666a3af9SDaniel P. Berrange OBJECT_CHECK(QIOChannel, (obj), TYPE_QIO_CHANNEL) 32666a3af9SDaniel P. Berrange #define QIO_CHANNEL_CLASS(klass) \ 33666a3af9SDaniel P. Berrange OBJECT_CLASS_CHECK(QIOChannelClass, klass, TYPE_QIO_CHANNEL) 34666a3af9SDaniel P. Berrange #define QIO_CHANNEL_GET_CLASS(obj) \ 35666a3af9SDaniel P. Berrange OBJECT_GET_CLASS(QIOChannelClass, obj, TYPE_QIO_CHANNEL) 36666a3af9SDaniel P. Berrange 37666a3af9SDaniel P. Berrange typedef struct QIOChannel QIOChannel; 38666a3af9SDaniel P. Berrange typedef struct QIOChannelClass QIOChannelClass; 39666a3af9SDaniel P. Berrange 40666a3af9SDaniel P. Berrange #define QIO_CHANNEL_ERR_BLOCK -2 41666a3af9SDaniel P. Berrange 42666a3af9SDaniel P. Berrange typedef enum QIOChannelFeature QIOChannelFeature; 43666a3af9SDaniel P. Berrange 44666a3af9SDaniel P. Berrange enum QIOChannelFeature { 458fbf6612SFelipe Franciosi QIO_CHANNEL_FEATURE_FD_PASS, 468fbf6612SFelipe Franciosi QIO_CHANNEL_FEATURE_SHUTDOWN, 478fbf6612SFelipe Franciosi QIO_CHANNEL_FEATURE_LISTEN, 48666a3af9SDaniel P. Berrange }; 49666a3af9SDaniel P. Berrange 50666a3af9SDaniel P. Berrange 51666a3af9SDaniel P. Berrange typedef enum QIOChannelShutdown QIOChannelShutdown; 52666a3af9SDaniel P. Berrange 53666a3af9SDaniel P. Berrange enum QIOChannelShutdown { 54666a3af9SDaniel P. Berrange QIO_CHANNEL_SHUTDOWN_BOTH, 55666a3af9SDaniel P. Berrange QIO_CHANNEL_SHUTDOWN_READ, 56666a3af9SDaniel P. Berrange QIO_CHANNEL_SHUTDOWN_WRITE, 57666a3af9SDaniel P. Berrange }; 58666a3af9SDaniel P. Berrange 59666a3af9SDaniel P. Berrange typedef gboolean (*QIOChannelFunc)(QIOChannel *ioc, 60666a3af9SDaniel P. Berrange GIOCondition condition, 61666a3af9SDaniel P. Berrange gpointer data); 62666a3af9SDaniel P. Berrange 63666a3af9SDaniel P. Berrange /** 64666a3af9SDaniel P. Berrange * QIOChannel: 65666a3af9SDaniel P. Berrange * 66666a3af9SDaniel P. Berrange * The QIOChannel defines the core API for a generic I/O channel 67666a3af9SDaniel P. Berrange * class hierarchy. It is inspired by GIOChannel, but has the 68666a3af9SDaniel P. Berrange * following differences 69666a3af9SDaniel P. Berrange * 70666a3af9SDaniel P. Berrange * - Use QOM to properly support arbitrary subclassing 71666a3af9SDaniel P. Berrange * - Support use of iovecs for efficient I/O with multiple blocks 72666a3af9SDaniel P. Berrange * - None of the character set translation, binary data exclusively 73666a3af9SDaniel P. Berrange * - Direct support for QEMU Error object reporting 74666a3af9SDaniel P. Berrange * - File descriptor passing 75666a3af9SDaniel P. Berrange * 76666a3af9SDaniel P. Berrange * This base class is abstract so cannot be instantiated. There 77666a3af9SDaniel P. Berrange * will be subclasses for dealing with sockets, files, and higher 78666a3af9SDaniel P. Berrange * level protocols such as TLS, WebSocket, etc. 79666a3af9SDaniel P. Berrange */ 80666a3af9SDaniel P. Berrange 81666a3af9SDaniel P. Berrange struct QIOChannel { 82666a3af9SDaniel P. Berrange Object parent; 83666a3af9SDaniel P. Berrange unsigned int features; /* bitmask of QIOChannelFeatures */ 8420f4aa26SDaniel P. Berrange char *name; 85c4c497d2SPaolo Bonzini AioContext *ctx; 86c4c497d2SPaolo Bonzini Coroutine *read_coroutine; 87c4c497d2SPaolo Bonzini Coroutine *write_coroutine; 88a5897205SPaolo Bonzini #ifdef _WIN32 89a5897205SPaolo Bonzini HANDLE event; /* For use with GSource on Win32 */ 90a5897205SPaolo Bonzini #endif 91666a3af9SDaniel P. Berrange }; 92666a3af9SDaniel P. Berrange 93666a3af9SDaniel P. Berrange /** 94666a3af9SDaniel P. Berrange * QIOChannelClass: 95666a3af9SDaniel P. Berrange * 96666a3af9SDaniel P. Berrange * This class defines the contract that all subclasses 97666a3af9SDaniel P. Berrange * must follow to provide specific channel implementations. 98666a3af9SDaniel P. Berrange * The first five callbacks are mandatory to support, others 99666a3af9SDaniel P. Berrange * provide additional optional features. 100666a3af9SDaniel P. Berrange * 101666a3af9SDaniel P. Berrange * Consult the corresponding public API docs for a description 102666a3af9SDaniel P. Berrange * of the semantics of each callback 103666a3af9SDaniel P. Berrange */ 104666a3af9SDaniel P. Berrange struct QIOChannelClass { 105666a3af9SDaniel P. Berrange ObjectClass parent; 106666a3af9SDaniel P. Berrange 107666a3af9SDaniel P. Berrange /* Mandatory callbacks */ 108666a3af9SDaniel P. Berrange ssize_t (*io_writev)(QIOChannel *ioc, 109666a3af9SDaniel P. Berrange const struct iovec *iov, 110666a3af9SDaniel P. Berrange size_t niov, 111666a3af9SDaniel P. Berrange int *fds, 112666a3af9SDaniel P. Berrange size_t nfds, 113666a3af9SDaniel P. Berrange Error **errp); 114666a3af9SDaniel P. Berrange ssize_t (*io_readv)(QIOChannel *ioc, 115666a3af9SDaniel P. Berrange const struct iovec *iov, 116666a3af9SDaniel P. Berrange size_t niov, 117666a3af9SDaniel P. Berrange int **fds, 118666a3af9SDaniel P. Berrange size_t *nfds, 119666a3af9SDaniel P. Berrange Error **errp); 120666a3af9SDaniel P. Berrange int (*io_close)(QIOChannel *ioc, 121666a3af9SDaniel P. Berrange Error **errp); 122666a3af9SDaniel P. Berrange GSource * (*io_create_watch)(QIOChannel *ioc, 123666a3af9SDaniel P. Berrange GIOCondition condition); 124666a3af9SDaniel P. Berrange int (*io_set_blocking)(QIOChannel *ioc, 125666a3af9SDaniel P. Berrange bool enabled, 126666a3af9SDaniel P. Berrange Error **errp); 127666a3af9SDaniel P. Berrange 128666a3af9SDaniel P. Berrange /* Optional callbacks */ 129666a3af9SDaniel P. Berrange int (*io_shutdown)(QIOChannel *ioc, 130666a3af9SDaniel P. Berrange QIOChannelShutdown how, 131666a3af9SDaniel P. Berrange Error **errp); 132666a3af9SDaniel P. Berrange void (*io_set_cork)(QIOChannel *ioc, 133666a3af9SDaniel P. Berrange bool enabled); 134666a3af9SDaniel P. Berrange void (*io_set_delay)(QIOChannel *ioc, 135666a3af9SDaniel P. Berrange bool enabled); 136666a3af9SDaniel P. Berrange off_t (*io_seek)(QIOChannel *ioc, 137666a3af9SDaniel P. Berrange off_t offset, 138666a3af9SDaniel P. Berrange int whence, 139666a3af9SDaniel P. Berrange Error **errp); 140bf88c124SPaolo Bonzini void (*io_set_aio_fd_handler)(QIOChannel *ioc, 141bf88c124SPaolo Bonzini AioContext *ctx, 142bf88c124SPaolo Bonzini IOHandler *io_read, 143bf88c124SPaolo Bonzini IOHandler *io_write, 144bf88c124SPaolo Bonzini void *opaque); 145666a3af9SDaniel P. Berrange }; 146666a3af9SDaniel P. Berrange 147666a3af9SDaniel P. Berrange /* General I/O handling functions */ 148666a3af9SDaniel P. Berrange 149666a3af9SDaniel P. Berrange /** 150666a3af9SDaniel P. Berrange * qio_channel_has_feature: 151666a3af9SDaniel P. Berrange * @ioc: the channel object 152666a3af9SDaniel P. Berrange * @feature: the feature to check support of 153666a3af9SDaniel P. Berrange * 154666a3af9SDaniel P. Berrange * Determine whether the channel implementation supports 155666a3af9SDaniel P. Berrange * the optional feature named in @feature. 156666a3af9SDaniel P. Berrange * 157666a3af9SDaniel P. Berrange * Returns: true if supported, false otherwise. 158666a3af9SDaniel P. Berrange */ 159666a3af9SDaniel P. Berrange bool qio_channel_has_feature(QIOChannel *ioc, 160666a3af9SDaniel P. Berrange QIOChannelFeature feature); 161666a3af9SDaniel P. Berrange 162666a3af9SDaniel P. Berrange /** 163d8d3c7ccSFelipe Franciosi * qio_channel_set_feature: 164d8d3c7ccSFelipe Franciosi * @ioc: the channel object 165d8d3c7ccSFelipe Franciosi * @feature: the feature to set support for 166d8d3c7ccSFelipe Franciosi * 167d8d3c7ccSFelipe Franciosi * Add channel support for the feature named in @feature. 168d8d3c7ccSFelipe Franciosi */ 169d8d3c7ccSFelipe Franciosi void qio_channel_set_feature(QIOChannel *ioc, 170d8d3c7ccSFelipe Franciosi QIOChannelFeature feature); 171d8d3c7ccSFelipe Franciosi 172d8d3c7ccSFelipe Franciosi /** 17320f4aa26SDaniel P. Berrange * qio_channel_set_name: 17420f4aa26SDaniel P. Berrange * @ioc: the channel object 17520f4aa26SDaniel P. Berrange * @name: the name of the channel 17620f4aa26SDaniel P. Berrange * 17720f4aa26SDaniel P. Berrange * Sets the name of the channel, which serves as an aid 17820f4aa26SDaniel P. Berrange * to debugging. The name is used when creating GSource 17920f4aa26SDaniel P. Berrange * watches for this channel. 18020f4aa26SDaniel P. Berrange */ 18120f4aa26SDaniel P. Berrange void qio_channel_set_name(QIOChannel *ioc, 18220f4aa26SDaniel P. Berrange const char *name); 18320f4aa26SDaniel P. Berrange 18420f4aa26SDaniel P. Berrange /** 185666a3af9SDaniel P. Berrange * qio_channel_readv_full: 186666a3af9SDaniel P. Berrange * @ioc: the channel object 187666a3af9SDaniel P. Berrange * @iov: the array of memory regions to read data into 188666a3af9SDaniel P. Berrange * @niov: the length of the @iov array 189666a3af9SDaniel P. Berrange * @fds: pointer to an array that will received file handles 190666a3af9SDaniel P. Berrange * @nfds: pointer filled with number of elements in @fds on return 191821791b5SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 192666a3af9SDaniel P. Berrange * 193666a3af9SDaniel P. Berrange * Read data from the IO channel, storing it in the 194666a3af9SDaniel P. Berrange * memory regions referenced by @iov. Each element 195666a3af9SDaniel P. Berrange * in the @iov will be fully populated with data 196666a3af9SDaniel P. Berrange * before the next one is used. The @niov parameter 197666a3af9SDaniel P. Berrange * specifies the total number of elements in @iov. 198666a3af9SDaniel P. Berrange * 199666a3af9SDaniel P. Berrange * It is not required for all @iov to be filled with 200666a3af9SDaniel P. Berrange * data. If the channel is in blocking mode, at least 201666a3af9SDaniel P. Berrange * one byte of data will be read, but no more is 202666a3af9SDaniel P. Berrange * guaranteed. If the channel is non-blocking and no 203666a3af9SDaniel P. Berrange * data is available, it will return QIO_CHANNEL_ERR_BLOCK 204666a3af9SDaniel P. Berrange * 205666a3af9SDaniel P. Berrange * If the channel has passed any file descriptors, 206666a3af9SDaniel P. Berrange * the @fds array pointer will be allocated and 207666a3af9SDaniel P. Berrange * the elements filled with the received file 208666a3af9SDaniel P. Berrange * descriptors. The @nfds pointer will be updated 209666a3af9SDaniel P. Berrange * to indicate the size of the @fds array that 210666a3af9SDaniel P. Berrange * was allocated. It is the callers responsibility 211666a3af9SDaniel P. Berrange * to call close() on each file descriptor and to 212666a3af9SDaniel P. Berrange * call g_free() on the array pointer in @fds. 213666a3af9SDaniel P. Berrange * 214666a3af9SDaniel P. Berrange * It is an error to pass a non-NULL @fds parameter 215666a3af9SDaniel P. Berrange * unless qio_channel_has_feature() returns a true 216666a3af9SDaniel P. Berrange * value for the QIO_CHANNEL_FEATURE_FD_PASS constant. 217666a3af9SDaniel P. Berrange * 218666a3af9SDaniel P. Berrange * Returns: the number of bytes read, or -1 on error, 219666a3af9SDaniel P. Berrange * or QIO_CHANNEL_ERR_BLOCK if no data is available 220666a3af9SDaniel P. Berrange * and the channel is non-blocking 221666a3af9SDaniel P. Berrange */ 222666a3af9SDaniel P. Berrange ssize_t qio_channel_readv_full(QIOChannel *ioc, 223666a3af9SDaniel P. Berrange const struct iovec *iov, 224666a3af9SDaniel P. Berrange size_t niov, 225666a3af9SDaniel P. Berrange int **fds, 226666a3af9SDaniel P. Berrange size_t *nfds, 227666a3af9SDaniel P. Berrange Error **errp); 228666a3af9SDaniel P. Berrange 229666a3af9SDaniel P. Berrange 230666a3af9SDaniel P. Berrange /** 231666a3af9SDaniel P. Berrange * qio_channel_writev_full: 232666a3af9SDaniel P. Berrange * @ioc: the channel object 233666a3af9SDaniel P. Berrange * @iov: the array of memory regions to write data from 234666a3af9SDaniel P. Berrange * @niov: the length of the @iov array 235666a3af9SDaniel P. Berrange * @fds: an array of file handles to send 236666a3af9SDaniel P. Berrange * @nfds: number of file handles in @fds 237821791b5SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 238666a3af9SDaniel P. Berrange * 239666a3af9SDaniel P. Berrange * Write data to the IO channel, reading it from the 240666a3af9SDaniel P. Berrange * memory regions referenced by @iov. Each element 241666a3af9SDaniel P. Berrange * in the @iov will be fully sent, before the next 242666a3af9SDaniel P. Berrange * one is used. The @niov parameter specifies the 243666a3af9SDaniel P. Berrange * total number of elements in @iov. 244666a3af9SDaniel P. Berrange * 245666a3af9SDaniel P. Berrange * It is not required for all @iov data to be fully 246666a3af9SDaniel P. Berrange * sent. If the channel is in blocking mode, at least 247666a3af9SDaniel P. Berrange * one byte of data will be sent, but no more is 248666a3af9SDaniel P. Berrange * guaranteed. If the channel is non-blocking and no 249666a3af9SDaniel P. Berrange * data can be sent, it will return QIO_CHANNEL_ERR_BLOCK 250666a3af9SDaniel P. Berrange * 251666a3af9SDaniel P. Berrange * If there are file descriptors to send, the @fds 252666a3af9SDaniel P. Berrange * array should be non-NULL and provide the handles. 253666a3af9SDaniel P. Berrange * All file descriptors will be sent if at least one 254666a3af9SDaniel P. Berrange * byte of data was sent. 255666a3af9SDaniel P. Berrange * 256666a3af9SDaniel P. Berrange * It is an error to pass a non-NULL @fds parameter 257666a3af9SDaniel P. Berrange * unless qio_channel_has_feature() returns a true 258666a3af9SDaniel P. Berrange * value for the QIO_CHANNEL_FEATURE_FD_PASS constant. 259666a3af9SDaniel P. Berrange * 260666a3af9SDaniel P. Berrange * Returns: the number of bytes sent, or -1 on error, 261666a3af9SDaniel P. Berrange * or QIO_CHANNEL_ERR_BLOCK if no data is can be sent 262666a3af9SDaniel P. Berrange * and the channel is non-blocking 263666a3af9SDaniel P. Berrange */ 264666a3af9SDaniel P. Berrange ssize_t qio_channel_writev_full(QIOChannel *ioc, 265666a3af9SDaniel P. Berrange const struct iovec *iov, 266666a3af9SDaniel P. Berrange size_t niov, 267666a3af9SDaniel P. Berrange int *fds, 268666a3af9SDaniel P. Berrange size_t nfds, 269666a3af9SDaniel P. Berrange Error **errp); 270666a3af9SDaniel P. Berrange 271666a3af9SDaniel P. Berrange /** 272*e8ffaa31SEric Blake * qio_channel_readv_all_eof: 273*e8ffaa31SEric Blake * @ioc: the channel object 274*e8ffaa31SEric Blake * @iov: the array of memory regions to read data into 275*e8ffaa31SEric Blake * @niov: the length of the @iov array 276*e8ffaa31SEric Blake * @errp: pointer to a NULL-initialized error object 277*e8ffaa31SEric Blake * 278*e8ffaa31SEric Blake * Read data from the IO channel, storing it in the 279*e8ffaa31SEric Blake * memory regions referenced by @iov. Each element 280*e8ffaa31SEric Blake * in the @iov will be fully populated with data 281*e8ffaa31SEric Blake * before the next one is used. The @niov parameter 282*e8ffaa31SEric Blake * specifies the total number of elements in @iov. 283*e8ffaa31SEric Blake * 284*e8ffaa31SEric Blake * The function will wait for all requested data 285*e8ffaa31SEric Blake * to be read, yielding from the current coroutine 286*e8ffaa31SEric Blake * if required. 287*e8ffaa31SEric Blake * 288*e8ffaa31SEric Blake * If end-of-file occurs before any data is read, 289*e8ffaa31SEric Blake * no error is reported; otherwise, if it occurs 290*e8ffaa31SEric Blake * before all requested data has been read, an error 291*e8ffaa31SEric Blake * will be reported. 292*e8ffaa31SEric Blake * 293*e8ffaa31SEric Blake * Returns: 1 if all bytes were read, 0 if end-of-file 294*e8ffaa31SEric Blake * occurs without data, or -1 on error 295*e8ffaa31SEric Blake */ 296*e8ffaa31SEric Blake int qio_channel_readv_all_eof(QIOChannel *ioc, 297*e8ffaa31SEric Blake const struct iovec *iov, 298*e8ffaa31SEric Blake size_t niov, 299*e8ffaa31SEric Blake Error **errp); 300*e8ffaa31SEric Blake 301*e8ffaa31SEric Blake /** 302d4622e55SDaniel P. Berrange * qio_channel_readv_all: 303d4622e55SDaniel P. Berrange * @ioc: the channel object 304d4622e55SDaniel P. Berrange * @iov: the array of memory regions to read data into 305d4622e55SDaniel P. Berrange * @niov: the length of the @iov array 306d4622e55SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 307d4622e55SDaniel P. Berrange * 308d4622e55SDaniel P. Berrange * Read data from the IO channel, storing it in the 309d4622e55SDaniel P. Berrange * memory regions referenced by @iov. Each element 310d4622e55SDaniel P. Berrange * in the @iov will be fully populated with data 311d4622e55SDaniel P. Berrange * before the next one is used. The @niov parameter 312d4622e55SDaniel P. Berrange * specifies the total number of elements in @iov. 313d4622e55SDaniel P. Berrange * 314d4622e55SDaniel P. Berrange * The function will wait for all requested data 315d4622e55SDaniel P. Berrange * to be read, yielding from the current coroutine 316d4622e55SDaniel P. Berrange * if required. 317d4622e55SDaniel P. Berrange * 318d4622e55SDaniel P. Berrange * If end-of-file occurs before all requested data 319d4622e55SDaniel P. Berrange * has been read, an error will be reported. 320d4622e55SDaniel P. Berrange * 321d4622e55SDaniel P. Berrange * Returns: 0 if all bytes were read, or -1 on error 322d4622e55SDaniel P. Berrange */ 323d4622e55SDaniel P. Berrange int qio_channel_readv_all(QIOChannel *ioc, 324d4622e55SDaniel P. Berrange const struct iovec *iov, 325d4622e55SDaniel P. Berrange size_t niov, 326d4622e55SDaniel P. Berrange Error **errp); 327d4622e55SDaniel P. Berrange 328d4622e55SDaniel P. Berrange 329d4622e55SDaniel P. Berrange /** 330d4622e55SDaniel P. Berrange * qio_channel_writev_all: 331d4622e55SDaniel P. Berrange * @ioc: the channel object 332d4622e55SDaniel P. Berrange * @iov: the array of memory regions to write data from 333d4622e55SDaniel P. Berrange * @niov: the length of the @iov array 334d4622e55SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 335d4622e55SDaniel P. Berrange * 336d4622e55SDaniel P. Berrange * Write data to the IO channel, reading it from the 337d4622e55SDaniel P. Berrange * memory regions referenced by @iov. Each element 338d4622e55SDaniel P. Berrange * in the @iov will be fully sent, before the next 339d4622e55SDaniel P. Berrange * one is used. The @niov parameter specifies the 340d4622e55SDaniel P. Berrange * total number of elements in @iov. 341d4622e55SDaniel P. Berrange * 342d4622e55SDaniel P. Berrange * The function will wait for all requested data 343d4622e55SDaniel P. Berrange * to be written, yielding from the current coroutine 344d4622e55SDaniel P. Berrange * if required. 345d4622e55SDaniel P. Berrange * 346d4622e55SDaniel P. Berrange * Returns: 0 if all bytes were written, or -1 on error 347d4622e55SDaniel P. Berrange */ 348d4622e55SDaniel P. Berrange int qio_channel_writev_all(QIOChannel *ioc, 349d4622e55SDaniel P. Berrange const struct iovec *iov, 350d4622e55SDaniel P. Berrange size_t niov, 351d4622e55SDaniel P. Berrange Error **erp); 352d4622e55SDaniel P. Berrange 353d4622e55SDaniel P. Berrange /** 354666a3af9SDaniel P. Berrange * qio_channel_readv: 355666a3af9SDaniel P. Berrange * @ioc: the channel object 356666a3af9SDaniel P. Berrange * @iov: the array of memory regions to read data into 357666a3af9SDaniel P. Berrange * @niov: the length of the @iov array 358821791b5SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 359666a3af9SDaniel P. Berrange * 360666a3af9SDaniel P. Berrange * Behaves as qio_channel_readv_full() but does not support 361666a3af9SDaniel P. Berrange * receiving of file handles. 362666a3af9SDaniel P. Berrange */ 363666a3af9SDaniel P. Berrange ssize_t qio_channel_readv(QIOChannel *ioc, 364666a3af9SDaniel P. Berrange const struct iovec *iov, 365666a3af9SDaniel P. Berrange size_t niov, 366666a3af9SDaniel P. Berrange Error **errp); 367666a3af9SDaniel P. Berrange 368666a3af9SDaniel P. Berrange /** 369666a3af9SDaniel P. Berrange * qio_channel_writev: 370666a3af9SDaniel P. Berrange * @ioc: the channel object 371666a3af9SDaniel P. Berrange * @iov: the array of memory regions to write data from 372666a3af9SDaniel P. Berrange * @niov: the length of the @iov array 373821791b5SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 374666a3af9SDaniel P. Berrange * 375666a3af9SDaniel P. Berrange * Behaves as qio_channel_writev_full() but does not support 376666a3af9SDaniel P. Berrange * sending of file handles. 377666a3af9SDaniel P. Berrange */ 378666a3af9SDaniel P. Berrange ssize_t qio_channel_writev(QIOChannel *ioc, 379666a3af9SDaniel P. Berrange const struct iovec *iov, 380666a3af9SDaniel P. Berrange size_t niov, 381666a3af9SDaniel P. Berrange Error **errp); 382666a3af9SDaniel P. Berrange 383666a3af9SDaniel P. Berrange /** 38450ea44f0SDaniel P. Berrange * qio_channel_read: 385666a3af9SDaniel P. Berrange * @ioc: the channel object 386666a3af9SDaniel P. Berrange * @buf: the memory region to read data into 387666a3af9SDaniel P. Berrange * @buflen: the length of @buf 388821791b5SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 389666a3af9SDaniel P. Berrange * 390666a3af9SDaniel P. Berrange * Behaves as qio_channel_readv_full() but does not support 391666a3af9SDaniel P. Berrange * receiving of file handles, and only supports reading into 392666a3af9SDaniel P. Berrange * a single memory region. 393666a3af9SDaniel P. Berrange */ 394666a3af9SDaniel P. Berrange ssize_t qio_channel_read(QIOChannel *ioc, 395666a3af9SDaniel P. Berrange char *buf, 396666a3af9SDaniel P. Berrange size_t buflen, 397666a3af9SDaniel P. Berrange Error **errp); 398666a3af9SDaniel P. Berrange 399666a3af9SDaniel P. Berrange /** 40061f7c6a0SMarc-André Lureau * qio_channel_write: 401666a3af9SDaniel P. Berrange * @ioc: the channel object 402666a3af9SDaniel P. Berrange * @buf: the memory regions to send data from 403666a3af9SDaniel P. Berrange * @buflen: the length of @buf 404821791b5SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 405666a3af9SDaniel P. Berrange * 406666a3af9SDaniel P. Berrange * Behaves as qio_channel_writev_full() but does not support 407666a3af9SDaniel P. Berrange * sending of file handles, and only supports writing from a 408666a3af9SDaniel P. Berrange * single memory region. 409666a3af9SDaniel P. Berrange */ 410666a3af9SDaniel P. Berrange ssize_t qio_channel_write(QIOChannel *ioc, 411666a3af9SDaniel P. Berrange const char *buf, 412666a3af9SDaniel P. Berrange size_t buflen, 413666a3af9SDaniel P. Berrange Error **errp); 414666a3af9SDaniel P. Berrange 415666a3af9SDaniel P. Berrange /** 416*e8ffaa31SEric Blake * qio_channel_read_all_eof: 417*e8ffaa31SEric Blake * @ioc: the channel object 418*e8ffaa31SEric Blake * @buf: the memory region to read data into 419*e8ffaa31SEric Blake * @buflen: the number of bytes to @buf 420*e8ffaa31SEric Blake * @errp: pointer to a NULL-initialized error object 421*e8ffaa31SEric Blake * 422*e8ffaa31SEric Blake * Reads @buflen bytes into @buf, possibly blocking or (if the 423*e8ffaa31SEric Blake * channel is non-blocking) yielding from the current coroutine 424*e8ffaa31SEric Blake * multiple times until the entire content is read. If end-of-file 425*e8ffaa31SEric Blake * occurs immediately it is not an error, but if it occurs after 426*e8ffaa31SEric Blake * data has been read it will return an error rather than a 427*e8ffaa31SEric Blake * short-read. Otherwise behaves as qio_channel_read(). 428*e8ffaa31SEric Blake * 429*e8ffaa31SEric Blake * Returns: 1 if all bytes were read, 0 if end-of-file occurs 430*e8ffaa31SEric Blake * without data, or -1 on error 431*e8ffaa31SEric Blake */ 432*e8ffaa31SEric Blake int qio_channel_read_all_eof(QIOChannel *ioc, 433*e8ffaa31SEric Blake char *buf, 434*e8ffaa31SEric Blake size_t buflen, 435*e8ffaa31SEric Blake Error **errp); 436*e8ffaa31SEric Blake 437*e8ffaa31SEric Blake /** 438d4622e55SDaniel P. Berrange * qio_channel_read_all: 439d4622e55SDaniel P. Berrange * @ioc: the channel object 440d4622e55SDaniel P. Berrange * @buf: the memory region to read data into 441d4622e55SDaniel P. Berrange * @buflen: the number of bytes to @buf 442d4622e55SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 443d4622e55SDaniel P. Berrange * 444d4622e55SDaniel P. Berrange * Reads @buflen bytes into @buf, possibly blocking or (if the 445d4622e55SDaniel P. Berrange * channel is non-blocking) yielding from the current coroutine 446d4622e55SDaniel P. Berrange * multiple times until the entire content is read. If end-of-file 447d4622e55SDaniel P. Berrange * occurs it will return an error rather than a short-read. Otherwise 448d4622e55SDaniel P. Berrange * behaves as qio_channel_read(). 449d4622e55SDaniel P. Berrange * 450d4622e55SDaniel P. Berrange * Returns: 0 if all bytes were read, or -1 on error 451d4622e55SDaniel P. Berrange */ 452d4622e55SDaniel P. Berrange int qio_channel_read_all(QIOChannel *ioc, 453d4622e55SDaniel P. Berrange char *buf, 454d4622e55SDaniel P. Berrange size_t buflen, 455d4622e55SDaniel P. Berrange Error **errp); 456*e8ffaa31SEric Blake 457d4622e55SDaniel P. Berrange /** 458d4622e55SDaniel P. Berrange * qio_channel_write_all: 459d4622e55SDaniel P. Berrange * @ioc: the channel object 460d4622e55SDaniel P. Berrange * @buf: the memory region to write data into 461d4622e55SDaniel P. Berrange * @buflen: the number of bytes to @buf 462d4622e55SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 463d4622e55SDaniel P. Berrange * 464d4622e55SDaniel P. Berrange * Writes @buflen bytes from @buf, possibly blocking or (if the 465d4622e55SDaniel P. Berrange * channel is non-blocking) yielding from the current coroutine 466d4622e55SDaniel P. Berrange * multiple times until the entire content is written. Otherwise 467d4622e55SDaniel P. Berrange * behaves as qio_channel_write(). 468d4622e55SDaniel P. Berrange * 469d4622e55SDaniel P. Berrange * Returns: 0 if all bytes were written, or -1 on error 470d4622e55SDaniel P. Berrange */ 471d4622e55SDaniel P. Berrange int qio_channel_write_all(QIOChannel *ioc, 472d4622e55SDaniel P. Berrange const char *buf, 473d4622e55SDaniel P. Berrange size_t buflen, 474d4622e55SDaniel P. Berrange Error **errp); 475d4622e55SDaniel P. Berrange 476d4622e55SDaniel P. Berrange /** 477666a3af9SDaniel P. Berrange * qio_channel_set_blocking: 478666a3af9SDaniel P. Berrange * @ioc: the channel object 479666a3af9SDaniel P. Berrange * @enabled: the blocking flag state 480821791b5SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 481666a3af9SDaniel P. Berrange * 482666a3af9SDaniel P. Berrange * If @enabled is true, then the channel is put into 483666a3af9SDaniel P. Berrange * blocking mode, otherwise it will be non-blocking. 484666a3af9SDaniel P. Berrange * 485666a3af9SDaniel P. Berrange * In non-blocking mode, read/write operations may 486666a3af9SDaniel P. Berrange * return QIO_CHANNEL_ERR_BLOCK if they would otherwise 487666a3af9SDaniel P. Berrange * block on I/O 488666a3af9SDaniel P. Berrange */ 489666a3af9SDaniel P. Berrange int qio_channel_set_blocking(QIOChannel *ioc, 490666a3af9SDaniel P. Berrange bool enabled, 491666a3af9SDaniel P. Berrange Error **errp); 492666a3af9SDaniel P. Berrange 493666a3af9SDaniel P. Berrange /** 494666a3af9SDaniel P. Berrange * qio_channel_close: 495666a3af9SDaniel P. Berrange * @ioc: the channel object 496821791b5SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 497666a3af9SDaniel P. Berrange * 498666a3af9SDaniel P. Berrange * Close the channel, flushing any pending I/O 499666a3af9SDaniel P. Berrange * 500666a3af9SDaniel P. Berrange * Returns: 0 on success, -1 on error 501666a3af9SDaniel P. Berrange */ 502666a3af9SDaniel P. Berrange int qio_channel_close(QIOChannel *ioc, 503666a3af9SDaniel P. Berrange Error **errp); 504666a3af9SDaniel P. Berrange 505666a3af9SDaniel P. Berrange /** 506666a3af9SDaniel P. Berrange * qio_channel_shutdown: 507666a3af9SDaniel P. Berrange * @ioc: the channel object 508666a3af9SDaniel P. Berrange * @how: the direction to shutdown 509821791b5SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 510666a3af9SDaniel P. Berrange * 511666a3af9SDaniel P. Berrange * Shutdowns transmission and/or receiving of data 512666a3af9SDaniel P. Berrange * without closing the underlying transport. 513666a3af9SDaniel P. Berrange * 514666a3af9SDaniel P. Berrange * Not all implementations will support this facility, 515666a3af9SDaniel P. Berrange * so may report an error. To avoid errors, the 516666a3af9SDaniel P. Berrange * caller may check for the feature flag 517666a3af9SDaniel P. Berrange * QIO_CHANNEL_FEATURE_SHUTDOWN prior to calling 518666a3af9SDaniel P. Berrange * this method. 519666a3af9SDaniel P. Berrange * 520666a3af9SDaniel P. Berrange * Returns: 0 on success, -1 on error 521666a3af9SDaniel P. Berrange */ 522666a3af9SDaniel P. Berrange int qio_channel_shutdown(QIOChannel *ioc, 523666a3af9SDaniel P. Berrange QIOChannelShutdown how, 524666a3af9SDaniel P. Berrange Error **errp); 525666a3af9SDaniel P. Berrange 526666a3af9SDaniel P. Berrange /** 527666a3af9SDaniel P. Berrange * qio_channel_set_delay: 528666a3af9SDaniel P. Berrange * @ioc: the channel object 529666a3af9SDaniel P. Berrange * @enabled: the new flag state 530666a3af9SDaniel P. Berrange * 531666a3af9SDaniel P. Berrange * Controls whether the underlying transport is 532666a3af9SDaniel P. Berrange * permitted to delay writes in order to merge 533666a3af9SDaniel P. Berrange * small packets. If @enabled is true, then the 534666a3af9SDaniel P. Berrange * writes may be delayed in order to opportunistically 535666a3af9SDaniel P. Berrange * merge small packets into larger ones. If @enabled 536666a3af9SDaniel P. Berrange * is false, writes are dispatched immediately with 537666a3af9SDaniel P. Berrange * no delay. 538666a3af9SDaniel P. Berrange * 539666a3af9SDaniel P. Berrange * When @enabled is false, applications may wish to 540666a3af9SDaniel P. Berrange * use the qio_channel_set_cork() method to explicitly 541666a3af9SDaniel P. Berrange * control write merging. 542666a3af9SDaniel P. Berrange * 543666a3af9SDaniel P. Berrange * On channels which are backed by a socket, this 544666a3af9SDaniel P. Berrange * API corresponds to the inverse of TCP_NODELAY flag, 545666a3af9SDaniel P. Berrange * controlling whether the Nagle algorithm is active. 546666a3af9SDaniel P. Berrange * 547666a3af9SDaniel P. Berrange * This setting is merely a hint, so implementations are 548666a3af9SDaniel P. Berrange * free to ignore this without it being considered an 549666a3af9SDaniel P. Berrange * error. 550666a3af9SDaniel P. Berrange */ 551666a3af9SDaniel P. Berrange void qio_channel_set_delay(QIOChannel *ioc, 552666a3af9SDaniel P. Berrange bool enabled); 553666a3af9SDaniel P. Berrange 554666a3af9SDaniel P. Berrange /** 555666a3af9SDaniel P. Berrange * qio_channel_set_cork: 556666a3af9SDaniel P. Berrange * @ioc: the channel object 557666a3af9SDaniel P. Berrange * @enabled: the new flag state 558666a3af9SDaniel P. Berrange * 559666a3af9SDaniel P. Berrange * Controls whether the underlying transport is 560666a3af9SDaniel P. Berrange * permitted to dispatch data that is written. 561666a3af9SDaniel P. Berrange * If @enabled is true, then any data written will 562666a3af9SDaniel P. Berrange * be queued in local buffers until @enabled is 563666a3af9SDaniel P. Berrange * set to false once again. 564666a3af9SDaniel P. Berrange * 565666a3af9SDaniel P. Berrange * This feature is typically used when the automatic 566666a3af9SDaniel P. Berrange * write coalescing facility is disabled via the 567666a3af9SDaniel P. Berrange * qio_channel_set_delay() method. 568666a3af9SDaniel P. Berrange * 569666a3af9SDaniel P. Berrange * On channels which are backed by a socket, this 570666a3af9SDaniel P. Berrange * API corresponds to the TCP_CORK flag. 571666a3af9SDaniel P. Berrange * 572666a3af9SDaniel P. Berrange * This setting is merely a hint, so implementations are 573666a3af9SDaniel P. Berrange * free to ignore this without it being considered an 574666a3af9SDaniel P. Berrange * error. 575666a3af9SDaniel P. Berrange */ 576666a3af9SDaniel P. Berrange void qio_channel_set_cork(QIOChannel *ioc, 577666a3af9SDaniel P. Berrange bool enabled); 578666a3af9SDaniel P. Berrange 579666a3af9SDaniel P. Berrange 580666a3af9SDaniel P. Berrange /** 581666a3af9SDaniel P. Berrange * qio_channel_seek: 582666a3af9SDaniel P. Berrange * @ioc: the channel object 583666a3af9SDaniel P. Berrange * @offset: the position to seek to, relative to @whence 584666a3af9SDaniel P. Berrange * @whence: one of the (POSIX) SEEK_* constants listed below 585821791b5SDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 586666a3af9SDaniel P. Berrange * 587666a3af9SDaniel P. Berrange * Moves the current I/O position within the channel 588666a3af9SDaniel P. Berrange * @ioc, to be @offset. The value of @offset is 589666a3af9SDaniel P. Berrange * interpreted relative to @whence: 590666a3af9SDaniel P. Berrange * 591666a3af9SDaniel P. Berrange * SEEK_SET - the position is set to @offset bytes 592666a3af9SDaniel P. Berrange * SEEK_CUR - the position is moved by @offset bytes 593666a3af9SDaniel P. Berrange * SEEK_END - the position is set to end of the file plus @offset bytes 594666a3af9SDaniel P. Berrange * 595666a3af9SDaniel P. Berrange * Not all implementations will support this facility, 596666a3af9SDaniel P. Berrange * so may report an error. 597666a3af9SDaniel P. Berrange * 598666a3af9SDaniel P. Berrange * Returns: the new position on success, (off_t)-1 on failure 599666a3af9SDaniel P. Berrange */ 600666a3af9SDaniel P. Berrange off_t qio_channel_io_seek(QIOChannel *ioc, 601666a3af9SDaniel P. Berrange off_t offset, 602666a3af9SDaniel P. Berrange int whence, 603666a3af9SDaniel P. Berrange Error **errp); 604666a3af9SDaniel P. Berrange 605666a3af9SDaniel P. Berrange 606666a3af9SDaniel P. Berrange /** 607666a3af9SDaniel P. Berrange * qio_channel_create_watch: 608666a3af9SDaniel P. Berrange * @ioc: the channel object 609666a3af9SDaniel P. Berrange * @condition: the I/O condition to monitor 610666a3af9SDaniel P. Berrange * 611666a3af9SDaniel P. Berrange * Create a new main loop source that is used to watch 612666a3af9SDaniel P. Berrange * for the I/O condition @condition. Typically the 613666a3af9SDaniel P. Berrange * qio_channel_add_watch() method would be used instead 614666a3af9SDaniel P. Berrange * of this, since it directly attaches a callback to 615666a3af9SDaniel P. Berrange * the source 616666a3af9SDaniel P. Berrange * 617666a3af9SDaniel P. Berrange * Returns: the new main loop source. 618666a3af9SDaniel P. Berrange */ 619666a3af9SDaniel P. Berrange GSource *qio_channel_create_watch(QIOChannel *ioc, 620666a3af9SDaniel P. Berrange GIOCondition condition); 621666a3af9SDaniel P. Berrange 622666a3af9SDaniel P. Berrange /** 623666a3af9SDaniel P. Berrange * qio_channel_add_watch: 624666a3af9SDaniel P. Berrange * @ioc: the channel object 625666a3af9SDaniel P. Berrange * @condition: the I/O condition to monitor 626666a3af9SDaniel P. Berrange * @func: callback to invoke when the source becomes ready 627666a3af9SDaniel P. Berrange * @user_data: opaque data to pass to @func 628666a3af9SDaniel P. Berrange * @notify: callback to free @user_data 629666a3af9SDaniel P. Berrange * 630666a3af9SDaniel P. Berrange * Create a new main loop source that is used to watch 631666a3af9SDaniel P. Berrange * for the I/O condition @condition. The callback @func 632666a3af9SDaniel P. Berrange * will be registered against the source, to be invoked 633666a3af9SDaniel P. Berrange * when the source becomes ready. The optional @user_data 634666a3af9SDaniel P. Berrange * will be passed to @func when it is invoked. The @notify 635666a3af9SDaniel P. Berrange * callback will be used to free @user_data when the 636666a3af9SDaniel P. Berrange * watch is deleted 637666a3af9SDaniel P. Berrange * 638666a3af9SDaniel P. Berrange * The returned source ID can be used with g_source_remove() 639666a3af9SDaniel P. Berrange * to remove and free the source when no longer required. 640666a3af9SDaniel P. Berrange * Alternatively the @func callback can return a FALSE 641666a3af9SDaniel P. Berrange * value. 642666a3af9SDaniel P. Berrange * 643666a3af9SDaniel P. Berrange * Returns: the source ID 644666a3af9SDaniel P. Berrange */ 645666a3af9SDaniel P. Berrange guint qio_channel_add_watch(QIOChannel *ioc, 646666a3af9SDaniel P. Berrange GIOCondition condition, 647666a3af9SDaniel P. Berrange QIOChannelFunc func, 648666a3af9SDaniel P. Berrange gpointer user_data, 649666a3af9SDaniel P. Berrange GDestroyNotify notify); 650666a3af9SDaniel P. Berrange 651666a3af9SDaniel P. Berrange 652666a3af9SDaniel P. Berrange /** 653c4c497d2SPaolo Bonzini * qio_channel_attach_aio_context: 654c4c497d2SPaolo Bonzini * @ioc: the channel object 655c4c497d2SPaolo Bonzini * @ctx: the #AioContext to set the handlers on 656c4c497d2SPaolo Bonzini * 657c4c497d2SPaolo Bonzini * Request that qio_channel_yield() sets I/O handlers on 658c4c497d2SPaolo Bonzini * the given #AioContext. If @ctx is %NULL, qio_channel_yield() 659c4c497d2SPaolo Bonzini * uses QEMU's main thread event loop. 660c4c497d2SPaolo Bonzini * 661c4c497d2SPaolo Bonzini * You can move a #QIOChannel from one #AioContext to another even if 662c4c497d2SPaolo Bonzini * I/O handlers are set for a coroutine. However, #QIOChannel provides 663c4c497d2SPaolo Bonzini * no synchronization between the calls to qio_channel_yield() and 664c4c497d2SPaolo Bonzini * qio_channel_attach_aio_context(). 665c4c497d2SPaolo Bonzini * 666c4c497d2SPaolo Bonzini * Therefore you should first call qio_channel_detach_aio_context() 667c4c497d2SPaolo Bonzini * to ensure that the coroutine is not entered concurrently. Then, 668c4c497d2SPaolo Bonzini * while the coroutine has yielded, call qio_channel_attach_aio_context(), 669c4c497d2SPaolo Bonzini * and then aio_co_schedule() to place the coroutine on the new 670c4c497d2SPaolo Bonzini * #AioContext. The calls to qio_channel_detach_aio_context() 671c4c497d2SPaolo Bonzini * and qio_channel_attach_aio_context() should be protected with 672c4c497d2SPaolo Bonzini * aio_context_acquire() and aio_context_release(). 673c4c497d2SPaolo Bonzini */ 674c4c497d2SPaolo Bonzini void qio_channel_attach_aio_context(QIOChannel *ioc, 675c4c497d2SPaolo Bonzini AioContext *ctx); 676c4c497d2SPaolo Bonzini 677c4c497d2SPaolo Bonzini /** 678c4c497d2SPaolo Bonzini * qio_channel_detach_aio_context: 679c4c497d2SPaolo Bonzini * @ioc: the channel object 680c4c497d2SPaolo Bonzini * 681c4c497d2SPaolo Bonzini * Disable any I/O handlers set by qio_channel_yield(). With the 682c4c497d2SPaolo Bonzini * help of aio_co_schedule(), this allows moving a coroutine that was 683c4c497d2SPaolo Bonzini * paused by qio_channel_yield() to another context. 684c4c497d2SPaolo Bonzini */ 685c4c497d2SPaolo Bonzini void qio_channel_detach_aio_context(QIOChannel *ioc); 686c4c497d2SPaolo Bonzini 687c4c497d2SPaolo Bonzini /** 688666a3af9SDaniel P. Berrange * qio_channel_yield: 689666a3af9SDaniel P. Berrange * @ioc: the channel object 690666a3af9SDaniel P. Berrange * @condition: the I/O condition to wait for 691666a3af9SDaniel P. Berrange * 692c4c497d2SPaolo Bonzini * Yields execution from the current coroutine until the condition 693c4c497d2SPaolo Bonzini * indicated by @condition becomes available. @condition must 694c4c497d2SPaolo Bonzini * be either %G_IO_IN or %G_IO_OUT; it cannot contain both. In 695c4c497d2SPaolo Bonzini * addition, no two coroutine can be waiting on the same condition 696c4c497d2SPaolo Bonzini * and channel at the same time. 697666a3af9SDaniel P. Berrange * 698666a3af9SDaniel P. Berrange * This must only be called from coroutine context 699666a3af9SDaniel P. Berrange */ 700666a3af9SDaniel P. Berrange void qio_channel_yield(QIOChannel *ioc, 701666a3af9SDaniel P. Berrange GIOCondition condition); 702666a3af9SDaniel P. Berrange 703666a3af9SDaniel P. Berrange /** 704666a3af9SDaniel P. Berrange * qio_channel_wait: 705666a3af9SDaniel P. Berrange * @ioc: the channel object 706666a3af9SDaniel P. Berrange * @condition: the I/O condition to wait for 707666a3af9SDaniel P. Berrange * 708666a3af9SDaniel P. Berrange * Block execution from the current thread until 709666a3af9SDaniel P. Berrange * the condition indicated by @condition becomes 710666a3af9SDaniel P. Berrange * available. 711666a3af9SDaniel P. Berrange * 712666a3af9SDaniel P. Berrange * This will enter a nested event loop to perform 713666a3af9SDaniel P. Berrange * the wait. 714666a3af9SDaniel P. Berrange */ 715666a3af9SDaniel P. Berrange void qio_channel_wait(QIOChannel *ioc, 716666a3af9SDaniel P. Berrange GIOCondition condition); 717666a3af9SDaniel P. Berrange 718bf88c124SPaolo Bonzini /** 719bf88c124SPaolo Bonzini * qio_channel_set_aio_fd_handler: 720bf88c124SPaolo Bonzini * @ioc: the channel object 721bf88c124SPaolo Bonzini * @ctx: the AioContext to set the handlers on 722bf88c124SPaolo Bonzini * @io_read: the read handler 723bf88c124SPaolo Bonzini * @io_write: the write handler 724bf88c124SPaolo Bonzini * @opaque: the opaque value passed to the handler 725bf88c124SPaolo Bonzini * 726bf88c124SPaolo Bonzini * This is used internally by qio_channel_yield(). It can 727bf88c124SPaolo Bonzini * be used by channel implementations to forward the handlers 728bf88c124SPaolo Bonzini * to another channel (e.g. from #QIOChannelTLS to the 729bf88c124SPaolo Bonzini * underlying socket). 730bf88c124SPaolo Bonzini */ 731bf88c124SPaolo Bonzini void qio_channel_set_aio_fd_handler(QIOChannel *ioc, 732bf88c124SPaolo Bonzini AioContext *ctx, 733bf88c124SPaolo Bonzini IOHandler *io_read, 734bf88c124SPaolo Bonzini IOHandler *io_write, 735bf88c124SPaolo Bonzini void *opaque); 736bf88c124SPaolo Bonzini 7372a6a4076SMarkus Armbruster #endif /* QIO_CHANNEL_H */ 738