xref: /openbsd-src/usr.sbin/smtpd/iobuf.h (revision ceeebefe3564938ff6ba87e7f465f6c35aeb8b03)
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