On Wed, Nov 16, 2016 at 09:13:40PM +0100, Eric Faurot wrote:
> Hi,
>
> I'm working on improving the async io interface in smtpd, make it simpler
> to use and less error-prone.
>
> The short-term goal is to make the io structure opaque.
>
> With this first diff, the user pointer is passed as parameter to the io
> callback instead of having the user dereference the io structure. There
> are places where the callback function is triggered outside of the io
> layer. It's not desirable, and it needs to be fixed in a separate diff.
>
ok gilles@
> Index: bounce.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/bounce.c,v
> retrieving revision 1.72
> diff -u -p -r1.72 bounce.c
> --- bounce.c 3 Feb 2016 05:57:09 -0000 1.72
> +++ bounce.c 16 Nov 2016 19:35:54 -0000
> @@ -97,7 +97,7 @@ static int bounce_next_message(struct b
> static int bounce_next(struct bounce_session *);
> static void bounce_delivery(struct bounce_message *, int, const char *);
> static void bounce_status(struct bounce_session *, const char *, ...);
> -static void bounce_io(struct io *, int);
> +static void bounce_io(struct io *, int, void *);
> static void bounce_timeout(int, short, void *);
> static void bounce_free(struct bounce_session *);
> static const char *action_str(const struct delivery_bounce *);
> @@ -712,9 +712,9 @@ bounce_free(struct bounce_session *s)
> }
>
> static void
> -bounce_io(struct io *io, int evt)
> +bounce_io(struct io *io, int evt, void *arg)
> {
> - struct bounce_session *s = io->arg;
> + struct bounce_session *s = arg;
> const char *error;
> char *line, *msg;
> int cont;
> Index: filter.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/filter.c,v
> retrieving revision 1.19
> diff -u -p -r1.19 filter.c
> --- filter.c 29 Jun 2016 06:46:06 -0000 1.19
> +++ filter.c 16 Nov 2016 19:35:54 -0000
> @@ -114,7 +114,7 @@ static void filter_run_query(struct filt
> static void filter_end_query(struct filter_query *);
> static void filter_set_sink(struct filter_session *, int);
> static int filter_tx(struct filter_session *, int);
> -static void filter_tx_io(struct io *, int);
> +static void filter_tx_io(struct io *, int, void *);
>
> static TAILQ_HEAD(, filter_proc) procs;
> struct dict chains;
> @@ -678,9 +678,9 @@ filter_tx(struct filter_session *s, int
> }
>
> static void
> -filter_tx_io(struct io *io, int evt)
> +filter_tx_io(struct io *io, int evt, void *arg)
> {
> - struct filter_session *s = io->arg;
> + struct filter_session *s = arg;
> size_t len, n;
> char *data;
>
> Index: ioev.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/ioev.c,v
> retrieving revision 1.26
> diff -u -p -r1.26 ioev.c
> --- ioev.c 16 May 2016 21:43:16 -0000 1.26
> +++ ioev.c 16 Nov 2016 19:35:54 -0000
> @@ -226,7 +226,7 @@ _io_init()
>
> void
> io_init(struct io *io, int sock, void *arg,
> - void(*cb)(struct io*, int), struct iobuf *iobuf)
> + void(*cb)(struct io*, int, void *), struct iobuf *iobuf)
> {
> _io_init();
>
> @@ -580,7 +580,7 @@ leave:
> void
> io_callback(struct io *io, int evt)
> {
> - io->cb(io, evt);
> + io->cb(io, evt, io->arg);
> }
>
> int
> Index: ioev.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/ioev.h,v
> retrieving revision 1.6
> diff -u -p -r1.6 ioev.h
> --- ioev.h 25 Mar 2016 15:06:58 -0000 1.6
> +++ ioev.h 16 Nov 2016 19:35:54 -0000
> @@ -41,7 +41,7 @@ struct iobuf;
> struct io {
> int sock;
> void *arg;
> - void (*cb)(struct io*, int);
> + void (*cb)(struct io*, int, void *);
> struct iobuf *iobuf;
> size_t lowat;
> int timeout;
> @@ -55,7 +55,8 @@ struct io {
> void io_set_nonblocking(int);
> void io_set_nolinger(int);
>
> -void io_init(struct io*, int, void*, void(*)(struct io*, int), struct
> iobuf*);
> +void io_init(struct io*, int, void*, void(*)(struct io*, int, void *),
> + struct iobuf*);
> void io_clear(struct io*);
> void io_set_read(struct io *);
> void io_set_write(struct io *);
> Index: mda.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/mda.c,v
> retrieving revision 1.120
> diff -u -p -r1.120 mda.c
> --- mda.c 1 Sep 2016 15:12:45 -0000 1.120
> +++ mda.c 16 Nov 2016 19:35:55 -0000
> @@ -84,7 +84,7 @@ struct mda_session {
> FILE *datafp;
> };
>
> -static void mda_io(struct io *, int);
> +static void mda_io(struct io *, int, void *);
> static int mda_check_loop(FILE *, struct mda_envelope *);
> static int mda_getlastline(int, char *, size_t);
> static void mda_done(struct mda_session *);
> @@ -496,9 +496,9 @@ mda_postprivdrop()
> }
>
> static void
> -mda_io(struct io *io, int evt)
> +mda_io(struct io *io, int evt, void *arg)
> {
> - struct mda_session *s = io->arg;
> + struct mda_session *s = arg;
> char *ln = NULL;
> size_t sz = 0;
> ssize_t len;
> Index: mta_session.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/mta_session.c,v
> retrieving revision 1.83
> diff -u -p -r1.83 mta_session.c
> --- mta_session.c 22 May 2016 16:31:21 -0000 1.83
> +++ mta_session.c 16 Nov 2016 19:35:55 -0000
> @@ -135,7 +135,7 @@ struct mta_session {
>
> static void mta_session_init(void);
> static void mta_start(int fd, short ev, void *arg);
> -static void mta_io(struct io *, int);
> +static void mta_io(struct io *, int, void *);
> static void mta_free(struct mta_session *);
> static void mta_on_ptr(void *, void *, void *);
> static void mta_on_timeout(struct runq *, void *);
> @@ -363,7 +363,7 @@ mta_session_imsg(struct mproc *p, struct
> return;
> }
>
> - mta_io(&s->io, IO_TLSVERIFIED);
> + mta_io(&s->io, IO_TLSVERIFIED, s->io.arg);
> io_resume(&s->io, IO_PAUSE_IN);
> io_reload(&s->io);
> return;
> @@ -1134,9 +1134,9 @@ mta_response(struct mta_session *s, char
> }
>
> static void
> -mta_io(struct io *io, int evt)
> +mta_io(struct io *io, int evt, void *arg)
> {
> - struct mta_session *s = io->arg;
> + struct mta_session *s = arg;
> char *line, *msg, *p;
> size_t len;
> const char *error;
> Index: smtp_session.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/smtp_session.c,v
> retrieving revision 1.289
> diff -u -p -r1.289 smtp_session.c
> --- smtp_session.c 16 Oct 2016 17:15:15 -0000 1.289
> +++ smtp_session.c 16 Nov 2016 19:35:56 -0000
> @@ -167,8 +167,8 @@ static void smtp_session_init(void);
> static int smtp_lookup_servername(struct smtp_session *);
> static void smtp_connected(struct smtp_session *);
> static void smtp_send_banner(struct smtp_session *);
> -static void smtp_io(struct io *, int);
> -static void smtp_data_io(struct io *, int);
> +static void smtp_io(struct io *, int, void *);
> +static void smtp_data_io(struct io *, int, void *);
> static void smtp_data_io_done(struct smtp_session *);
> static void smtp_enter_state(struct smtp_session *, int);
> static void smtp_reply(struct smtp_session *, char *, ...);
> @@ -993,7 +993,7 @@ smtp_session_imsg(struct mproc *p, struc
> smtp_free(s, "SSL certificate check failed");
> return;
> }
> - smtp_io(&s->io, IO_TLSVERIFIED);
> + smtp_io(&s->io, IO_TLSVERIFIED, s->io.arg);
> io_resume(&s->io, IO_PAUSE_IN);
> return;
> }
> @@ -1232,10 +1232,10 @@ smtp_filter_fd(uint64_t id, int fd)
> }
>
> static void
> -smtp_io(struct io *io, int evt)
> +smtp_io(struct io *io, int evt, void *arg)
> {
> struct ca_cert_req_msg req_ca_cert;
> - struct smtp_session *s = io->arg;
> + struct smtp_session *s = arg;
> char *line;
> size_t len;
> X509 *x;
> @@ -1476,9 +1476,9 @@ smtp_tx_free(struct smtp_tx *tx)
> }
>
> static void
> -smtp_data_io(struct io *io, int evt)
> +smtp_data_io(struct io *io, int evt, void *arg)
> {
> - struct smtp_session *s = io->arg;
> + struct smtp_session *s = arg;
>
> log_trace(TRACE_IO, "smtp: %p (data): %s %s", s, io_strevent(evt),
> io_strio(io));
>
--
Gilles Chehade
https://www.poolp.org @poolpOrg