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