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

Reply via email to