From a8471a294a1e61ecbf04e62edc012106423f33bb Mon Sep 17 00:00:00 2001 From: chris mikkelson Date: Fri, 27 Mar 2009 16:05:47 -0500 Subject: [PATCH] Added rest of hooks for module code. --- conn_pool.c | 2 +- smtp.c | 49 ++++++++++++++++++++++++++++++++++++++++--------- smtpsink.h | 3 +++ 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/conn_pool.c b/conn_pool.c index 824f022..906b958 100644 --- a/conn_pool.c +++ b/conn_pool.c @@ -69,7 +69,7 @@ close_conn(struct conn *c) free(c->rdata.s); bzero(&c->rdata, sizeof(c->rdata)); } - /* call close hook */ + module_resetconn(c); if (pthread_mutex_lock(&cp.cpmtx)) assert(0); cp.count --; STAILQ_INSERT_HEAD(&cp.c_pool, c, c_list); diff --git a/smtp.c b/smtp.c index 9e4cc41..b0493e9 100644 --- a/smtp.c +++ b/smtp.c @@ -46,26 +46,48 @@ static int smtpd_helo(struct conn *c, char *cmd, int len, int argoff) { const char *resp = helo_ok; + int ret = 0; + if (cmd[0] == 'e' || cmd[0] == 'E') resp = ehlo_ok; - /* if (c->state == SMTP_GREET) { - call-hook; - } */ + + /* XXX - only send first HELO to module */ + if (c->state == SMTP_GREET) + ret = module_helo(c, cmd, len, argoff); + + if (!SSM_ACCEPTED(ret)) resp = helo_reject; + + if (SSM_RESPONDED(ret)) { + if (c->wdata.s) return 0; + return 1; + } return respond(c, resp, banner_hostname); } static int smtpd_mail(struct conn *c, char *cmd, int len, int argoff) { - /* call hook */ - c->state = SMTP_MAIL; - return respond(c, mail_ok); + int ret = module_mail(c, cmd, len, argoff); + char *resp = mail_ok; + + if (SSM_ACCEPTED(ret)) + c->state = SMTP_MAIL; + else + resp = mail_reject; + + if (SSM_RESPONDED(ret)) { + if (c->wdata.s) return 0; + return 1; + } + return respond(c, resp); } static int smtpd_rcpt(struct conn *c, char *cmd, int len, int argoff) { + int ret; if (c->state == SMTP_MAIL || c->state == SMTP_RCPT) { + ret = module_rcpt(c, cmd, len, argoff); c->state = SMTP_RCPT; return respond(c, rcpt_ok); } @@ -86,9 +108,18 @@ static int smtpd_enddata(struct conn *c) { int now = time(0); - /* call hook */ + int ret = module_enddata(c); + c->state = SMTP_RSET; - return respond(c, enddata_ok, now, now % 38201); + + if (SSM_RESPONDED(ret)) { + if (c->wdata.s) return 0; + return 1; + } + if (SSM_ACCEPTED(ret)) { + return respond(c, enddata_ok, now, now % 38201); + } + return respond(c,enddata_reject); } static int @@ -195,7 +226,7 @@ do_smtp(struct conn *c, char **buf, int *len) } break; } - /* do_data(c, *buf, s - *buf); */ + module_data(c, *buf, s - *buf); *len -= s - *buf; *buf = s; if (c->dstate == 5) return smtpd_enddata(c); diff --git a/smtpsink.h b/smtpsink.h index 7863038..05e6a0a 100644 --- a/smtpsink.h +++ b/smtpsink.h @@ -46,6 +46,9 @@ int respond(struct conn *, const char *, ...); #define SSM_REJECT 2 #define SSM_MSG (1 << 8) +#define SSM_ACCEPTED(x) ((x & 0x0F) == SSM_ACCEPT) +#define SSM_RESPONDED(x) (x & 0x10) + struct smtpsink_module { void (*module_init)(char *); void (*module_hup)(void); -- 2.50.1