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.
Eric.
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));