1*ceeebefeSbenno /* $OpenBSD: iobuf.h,v 1.7 2021/07/28 19:39:50 benno Exp $ */ 2d1ece852Seric /* 3d1ece852Seric * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> 4d1ece852Seric * 5d1ece852Seric * Permission to use, copy, modify, and distribute this software for any 6d1ece852Seric * purpose with or without fee is hereby granted, provided that the above 7d1ece852Seric * copyright notice and this permission notice appear in all copies. 8d1ece852Seric * 9d1ece852Seric * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10d1ece852Seric * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11d1ece852Seric * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12d1ece852Seric * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13d1ece852Seric * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14d1ece852Seric * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15d1ece852Seric * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16d1ece852Seric */ 17d1ece852Seric 18d1ece852Seric struct ioqbuf { 19d1ece852Seric struct ioqbuf *next; 20d1ece852Seric char *buf; 21d1ece852Seric size_t size; 22d1ece852Seric size_t wpos; 23d1ece852Seric size_t rpos; 24d1ece852Seric }; 25d1ece852Seric 26d1ece852Seric struct iobuf { 27d1ece852Seric char *buf; 28d1ece852Seric size_t max; 29d1ece852Seric size_t size; 30d1ece852Seric size_t wpos; 31d1ece852Seric size_t rpos; 32d1ece852Seric 33d1ece852Seric size_t queued; 34d1ece852Seric struct ioqbuf *outq; 35d1ece852Seric struct ioqbuf *outqlast; 36d1ece852Seric }; 37d1ece852Seric 38eed85469Seric struct tls; 39eed85469Seric 40d1ece852Seric #define IOBUF_WANT_READ -1 41d1ece852Seric #define IOBUF_WANT_WRITE -2 42d1ece852Seric #define IOBUF_CLOSED -3 43d1ece852Seric #define IOBUF_ERROR -4 44d1ece852Seric 45d1ece852Seric int iobuf_init(struct iobuf *, size_t, size_t); 46d1ece852Seric void iobuf_clear(struct iobuf *); 47d1ece852Seric 48d1ece852Seric int iobuf_extend(struct iobuf *, size_t); 49d1ece852Seric void iobuf_normalize(struct iobuf *); 50d1ece852Seric void iobuf_drop(struct iobuf *, size_t); 51d1ece852Seric size_t iobuf_space(struct iobuf *); 52d1ece852Seric size_t iobuf_len(struct iobuf *); 53d1ece852Seric size_t iobuf_left(struct iobuf *); 54d1ece852Seric char *iobuf_data(struct iobuf *); 55d1ece852Seric char *iobuf_getline(struct iobuf *, size_t *); 56d1ece852Seric ssize_t iobuf_read(struct iobuf *, int); 57eed85469Seric ssize_t iobuf_read_tls(struct iobuf *, struct tls *); 58d1ece852Seric 59d1ece852Seric size_t iobuf_queued(struct iobuf *); 60d1ece852Seric void* iobuf_reserve(struct iobuf *, size_t); 61d1ece852Seric int iobuf_queue(struct iobuf *, const void*, size_t); 62d1ece852Seric int iobuf_queuev(struct iobuf *, const struct iovec *, int); 63*ceeebefeSbenno int iobuf_fqueue(struct iobuf *, const char *, ...) 64*ceeebefeSbenno __attribute__((__format__ (printf, 2, 3))); 65d1ece852Seric int iobuf_vfqueue(struct iobuf *, const char *, va_list); 66d1ece852Seric int iobuf_flush(struct iobuf *, int); 67eed85469Seric int iobuf_flush_tls(struct iobuf *, struct tls *); 68d1ece852Seric ssize_t iobuf_write(struct iobuf *, int); 69eed85469Seric ssize_t iobuf_write_tls(struct iobuf *, struct tls *); 70