Hi, Next step towards hiding the struct io internals.
This diff adds new io_*() api functions for dealing with buffered data. They are simple wrappers around their iobuf_*() counterpart, with better names in some cases. The point is of course to be able remove the use of iobuf_*() in the rest of the daemon. Eric. Index: ioev.c =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/ioev.c,v retrieving revision 1.28 diff -u -p -r1.28 ioev.c --- ioev.c 17 Nov 2016 07:33:06 -0000 1.28 +++ ioev.c 17 Nov 2016 14:01:28 -0000 @@ -354,6 +354,92 @@ io_set_write(struct io *io) io_reload(io); } +/* + * Buffered output functions + */ + +int +io_write(struct io *io, const void *buf, size_t len) +{ + return iobuf_queue(io->iobuf, buf, len); +} + +int +io_writev(struct io *io, const struct iovec *iov, int iovcount) +{ + return iobuf_queuev(io->iobuf, iov, iovcount); +} + +int +io_print(struct io *io, const char *s) +{ + return io_write(io, s, strlen(s)); +} + +int +io_printf(struct io *io, const char *fmt, ...) +{ + va_list ap; + int r; + + va_start(ap, fmt); + r = io_vprintf(io, fmt, ap); + va_end(ap); + + return r; +} + +int +io_vprintf(struct io *io, const char *fmt, va_list ap) +{ + + char *buf; + int len; + + len = vasprintf(&buf, fmt, ap); + if (len == -1) + return -1; + len = io_write(io, buf, len); + free(buf); + + return len; +} + +size_t +io_queued(struct io *io) +{ + return iobuf_queued(io->iobuf); +} + +/* + * Buffered input functions + */ + +void * +io_data(struct io *io) +{ + return iobuf_data(io->iobuf); +} + +size_t +io_datalen(struct io *io) +{ + return iobuf_len(io->iobuf); +} + +char * +io_getline(struct io *io, size_t *sz) +{ + return iobuf_getline(io->iobuf, sz); +} + +void +io_drop(struct io *io, size_t sz) +{ + return iobuf_drop(io->iobuf, sz); +} + + #define IO_READING(io) (((io)->flags & IO_RW) != IO_WRITE) #define IO_WRITING(io) (((io)->flags & IO_RW) != IO_READ) @@ -428,12 +514,6 @@ size_t io_pending(struct io *io) { return iobuf_len(io->iobuf); -} - -size_t -io_queued(struct io *io) -{ - return iobuf_queued(io->iobuf); } const char* Index: ioev.h =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/ioev.h,v retrieving revision 1.8 diff -u -p -r1.8 ioev.h --- ioev.h 17 Nov 2016 07:33:06 -0000 1.8 +++ ioev.h 17 Nov 2016 14:01:28 -0000 @@ -68,3 +68,17 @@ int io_connect(struct io *, const struct int io_start_tls(struct io *, void *); const char* io_strio(struct io *); const char* io_strevent(int); + +/* Buffered output functions */ +int io_write(struct io *, const void *, size_t); +int io_writev(struct io *, const struct iovec *, int); +int io_print(struct io *, const char *); +int io_printf(struct io *, const char *, ...); +int io_vprintf(struct io *, const char *, va_list); +size_t io_queued(struct io *); + +/* Buffered input functions */ +void* io_data(struct io *); +size_t io_datalen(struct io *); +char* io_getline(struct io *, size_t *); +void io_drop(struct io *, size_t); Index: smtpd.h =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/smtpd.h,v retrieving revision 1.523 diff -u -p -r1.523 smtpd.h --- smtpd.h 4 Sep 2016 09:33:49 -0000 1.523 +++ smtpd.h 17 Nov 2016 14:01:28 -0000 @@ -1494,6 +1494,8 @@ void *xmemdup(const void *, size_t, cons char *strip(char *); void iobuf_xinit(struct iobuf *, size_t, size_t, const char *); void iobuf_xfqueue(struct iobuf *, const char *, const char *, ...); +int io_xprint(struct io *, const char *); +int io_xprintf(struct io *, const char *, ...); void log_envelope(const struct envelope *, const char *, const char *, const char *); int session_socket_error(int); Index: util.c =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/util.c,v retrieving revision 1.128 diff -u -p -r1.128 util.c --- util.c 31 Aug 2016 10:18:08 -0000 1.128 +++ util.c 17 Nov 2016 14:01:28 -0000 @@ -133,6 +133,33 @@ iobuf_xfqueue(struct iobuf *io, const ch fatalx("exiting"); } } + +int +io_xprintf(struct io *io, const char *fmt, ...) +{ + va_list ap; + int len; + + va_start(ap, fmt); + len = io_vprintf(io, fmt, ap); + va_end(ap); + if (len == -1) + fatal("io_xprintf(%p, %s, ...)", io, fmt); + + return len; +} + +int +io_xprint(struct io *io, const char *str) +{ + int len; + + len = io_print(io, str); + if (len == -1) + fatal("io_xprint(%p, %s, ...)", io, str); + + return len; +} #endif char *