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);
}
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
}
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);