]> git.mikk.net Git - smtpsink/commitdiff
Added rest of hooks for module code.
authorchris mikkelson <chris@mikk.net>
Fri, 27 Mar 2009 21:05:47 +0000 (16:05 -0500)
committerchris mikkelson <chris@mikk.net>
Fri, 27 Mar 2009 21:05:47 +0000 (16:05 -0500)
conn_pool.c
smtp.c
smtpsink.h

index 824f022ba5ac738b6c2a762a14de9b29394ff26e..906b9584da13c62d0e3b1d424663c75c88123b9e 100644 (file)
@@ -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 9e4cc41fdb09d64f4ca9049279f4744f24cee18f..b0493e934dbb14f75c0be5e790383ee2bf8e6f5d 100644 (file)
--- 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);
index 78630385974d63b714552f79c98acb30a5b0d2e0..05e6a0a05b7ba0faa9190a04a7cb39c863d10f5c 100644 (file)
@@ -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);