Improve logging by making more functions use clenv rather than fdb and
authorMatthew Mondor <mmondor@pulsar-zone.net>
Wed, 21 Apr 2010 22:07:01 +0000 (22:07 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Wed, 21 Apr 2010 22:07:01 +0000 (22:07 +0000)
be able to log the session ID.

mmsoftware/mmmail/src/mmpop3d/mmpop3d.c
mmsoftware/mmmail/src/mmpop3d/mmpop3d.h
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.c
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.h

index 82aec03..21b2f86 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmpop3d.c,v 1.60 2010/03/27 06:16:42 mmondor Exp $ */
+/* $Id: mmpop3d.c,v 1.61 2010/04/21 22:06:55 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2008, Matthew Mondor
@@ -87,7 +87,7 @@
 
 MMCOPYRIGHT("@(#) Copyright (c) 2001-2007\n\
 \tMatthew Mondor. All rights reserved.\n");
-MMRCSID("$Id: mmpop3d.c,v 1.60 2010/03/27 06:16:42 mmondor Exp $");
+MMRCSID("$Id: mmpop3d.c,v 1.61 2010/04/21 22:06:55 mmondor Exp $");
 
 
 
@@ -431,7 +431,7 @@ main(int argc, char **argv)
 static int
 all_noop(clientenv *clenv)
 {
-    reply(clenv->fdb, TRUE, "Nothing performed");
+    reply(clenv, TRUE, "Nothing performed");
 
     return (STATE_CURRENT);
 }
@@ -441,16 +441,17 @@ static int
 all_quit(clientenv *clenv)
 {
     int nextstate = STATE_END;
-    fdbuf *fdb = clenv->fdb;
 
     if (clenv->login) {
        if (!do_update(clenv)) {
-           reply(fdb, FALSE, "Error applying changes");
+           reply(clenv, FALSE, "Error applying changes");
            nextstate = STATE_ERROR;
        } else
-           reply(fdb, TRUE, "%s closing connection", clenv->iface->hostname);
+           reply(clenv, TRUE, "%s closing connection",
+                   clenv->iface->hostname);
     } else
-       reply(fdb, TRUE, "%s closing connection", clenv->iface->hostname);
+       reply(clenv, TRUE, "%s closing connection",
+               clenv->iface->hostname);
 
     return (nextstate);
 }
@@ -459,7 +460,7 @@ all_quit(clientenv *clenv)
 static int
 all_beer(clientenv *clenv)
 {
-    reply(clenv->fdb, TRUE, "Here, enjoy!");
+    reply(clenv, TRUE, "Here, enjoy!");
 
     return (STATE_CURRENT);
 }
@@ -469,11 +470,10 @@ static int
 auth_user(clientenv *clenv)
 {
     int nextstate = STATE_CURRENT;
-    fdbuf *fdb = clenv->fdb;
     char *cmdline = clenv->buffer, *args[3], addr[64], *tmp;
 
     if (clenv->mailbox != NULL)
-       reply(fdb, FALSE, "Username already specified");
+       reply(clenv, FALSE, "Username already specified");
     else {
        if ((mm_straspl(args, cmdline, 2)) == 2) {
            /* Convert first . to @ in username */
@@ -489,11 +489,11 @@ auth_user(clientenv *clenv)
                else
                    mmstat(&clenv->vstat, STAT_UPDATE, 1, "mmpop3d|who|%s",
                            clenv->mailbox);
-               reply(fdb, TRUE, "Username accepted");
+               reply(clenv, TRUE, "Username accepted");
            } else
-               reply(fdb, FALSE, "Invalid username");
+               reply(clenv, FALSE, "Invalid username");
        } else
-           reply(fdb, FALSE, "Command syntax error");
+           reply(clenv, FALSE, "Command syntax error");
     }
 
     return (nextstate);
@@ -504,7 +504,6 @@ static int
 auth_pass(clientenv *clenv)
 {
     int        nextstate = STATE_CURRENT;
-    fdbuf      *fdb = clenv->fdb;
     char       *cmdline = clenv->buffer, *args[3], pwhash[36], id[33];
     PGresult   *pgres;
     const char *params[3];
@@ -536,7 +535,7 @@ auth_pass(clientenv *clenv)
                    mmstat(&clenv->pstat, STAT_UPDATE, 1,
                            "mmpop3d|failed|login|%s", clenv->c_ipaddr);
                nextstate = STATE_END;
-               reply(fdb, FALSE, "Authentication failure");
+               reply(clenv, FALSE, "Authentication failure");
            } else if (checkpw(clenv, args[1], pwhash)) {
                char *domptr;
 
@@ -554,7 +553,7 @@ auth_pass(clientenv *clenv)
                    syslog(LOG_NOTICE, "auth_pass() - PQexecParams(2)");
                clenv->login = TRUE;
                if (!do_buildindex(clenv)) {
-                   reply(fdb, FALSE, "Error");
+                   reply(clenv, FALSE, "Error");
                    nextstate = STATE_ERROR;
                }
                mmsyslog(1, LOGLEVEL,
@@ -569,7 +568,7 @@ auth_pass(clientenv *clenv)
                mmstat(&clenv->pstat, STAT_UPDATE, 1,
                        "mmmail|domain|%s|logins", domptr);
                mmstat_transact(&clenv->pstat, FALSE);
-               reply(fdb, TRUE, "Authentication successful");
+               reply(clenv, TRUE, "Authentication successful");
                nextstate = STATE_MAIN;
            } else {
                /* User exists but the password was wrong */
@@ -585,12 +584,12 @@ auth_pass(clientenv *clenv)
                            clenv->mailbox, clenv->c_ipaddr);
                mmstat_transact(&clenv->pstat, FALSE);
                nextstate = STATE_END;
-               reply(fdb, FALSE, "Authentication failure");
+               reply(clenv, FALSE, "Authentication failure");
            }
        } else
-           reply(fdb, FALSE, "Command syntax error");
+           reply(clenv, FALSE, "Command syntax error");
     } else
-       reply(fdb, FALSE, "Specify username first");
+       reply(clenv, FALSE, "Specify username first");
 
     return (nextstate);
 }
@@ -604,7 +603,7 @@ main_rset(clientenv *clenv)
     if (!init_clientenv(clenv))
        nextstate = STATE_ERROR;
     else
-       reply(clenv->fdb, TRUE, "Reset state");
+       reply(clenv, TRUE, "Reset state");
 
     return (nextstate);
 }
@@ -613,7 +612,7 @@ main_rset(clientenv *clenv)
 static int
 main_stat(clientenv *clenv)
 {
-    reply(clenv->fdb, TRUE, "%ld %ld", clenv->newmessages, clenv->newsize);
+    reply(clenv, TRUE, "%ld %ld", clenv->newmessages, clenv->newsize);
 
     return (STATE_CURRENT);
 }
@@ -624,7 +623,6 @@ main_list(clientenv *clenv)
 {
     int nextstate = STATE_CURRENT;
     long i;
-    fdbuf *fdb = clenv->fdb;
     char *args[3];
 
     if ((mm_straspl(args, clenv->buffer, 2)) == 2) {
@@ -633,18 +631,18 @@ main_list(clientenv *clenv)
        i--;                    /* Array starts at 0, not 1 */
        if (i < 0 || i > clenv->messages - 1 || clenv->index == NULL ||
                clenv->index[i].deleted) {
-           reply(fdb, FALSE, "Out of range");
+           reply(clenv, FALSE, "Out of range");
            REGISTER_ERROR(clenv);
        } else
-           reply(fdb, TRUE, "%ld %ld", i + 1, clenv->index[i].size);
+           reply(clenv, TRUE, "%ld %ld", i + 1, clenv->index[i].size);
     } else {
        /* All messages */
-       reply(fdb, TRUE, "%ld message(s) (%ld octets)", clenv->newmessages,
-               clenv->newsize);
+       reply(clenv, TRUE, "%ld message(s) (%ld octets)",
+               clenv->newmessages, clenv->newsize);
        if (clenv->index != NULL) {
            for (i = 0; i < clenv->messages; i++) {
                if (!clenv->index[i].deleted) {
-                   if (!fdbprintf(fdb, "%ld %ld\r\n", i + 1,
+                   if (!fdbprintf(clenv->fdb, "%ld %ld\r\n", i + 1,
                                clenv->index[i].size)) {
                        nextstate = STATE_ERROR;
                        break;
@@ -653,7 +651,7 @@ main_list(clientenv *clenv)
            }
        }
        if (nextstate != STATE_ERROR) {
-           if ((fdbwrite(fdb, ".\r\n", 3)) != 3)
+           if ((fdbwrite(clenv->fdb, ".\r\n", 3)) != 3)
                nextstate = STATE_ERROR;
        }
     }
@@ -667,7 +665,6 @@ main_retr(clientenv *clenv)
 {
     int nextstate = STATE_CURRENT;
     long i;
-    fdbuf *fdb = clenv->fdb;
     char *args[3];
 
     if ((mm_straspl(args, clenv->buffer, 2)) == 2) {
@@ -675,22 +672,22 @@ main_retr(clientenv *clenv)
        i--;                    /* Array starts at 0, not 1 */
        if (i < 0 || !(i < clenv->messages) || clenv->index == NULL ||
                clenv->index[i].deleted) {
-           reply(fdb, FALSE, "Out of range");
+           reply(clenv, FALSE, "Out of range");
            REGISTER_ERROR(clenv);
        } else {
            /* Valid message number to retreive */
            if (clenv->index[i].retreived) {
-               reply(fdb, FALSE, "Already retreived");
+               reply(clenv, FALSE, "Already retreived");
                REGISTER_ERROR(clenv);
            } else {
                clenv->last = i + 1;
                clenv->retreived++;
-               if (!do_retreive(fdb, &clenv->index[i]))
+               if (!do_retreive(clenv, &clenv->index[i]))
                    nextstate = STATE_ERROR;
            }
        }
     } else {
-       reply(fdb, FALSE, "Command syntax error");
+       reply(clenv, FALSE, "Command syntax error");
        REGISTER_ERROR(clenv);
     }
 
@@ -702,7 +699,6 @@ static int
 main_dele(clientenv *clenv)
 {
     long i;
-    fdbuf *fdb = clenv->fdb;
     char *args[3];
 
     if ((mm_straspl(args, clenv->buffer, 2)) == 2) {
@@ -710,26 +706,26 @@ main_dele(clientenv *clenv)
            i = atol(args[1]);
            i--;                /* Array starts at 0, not 1 */
            if (i < 0 || !(i < clenv->messages)) {
-               reply(fdb, FALSE, "Out of range");
+               reply(clenv, FALSE, "Out of range");
                REGISTER_ERROR(clenv);
            } else {
                if (!clenv->index[i].deleted) {
                    clenv->index[i].deleted = TRUE;
                    clenv->newmessages--;
                    clenv->newsize -= clenv->index[i].size;
-                   reply(fdb, TRUE, "Maked to delete");
+                   reply(clenv, TRUE, "Maked to delete");
                    clenv->deleted++;
                } else {
-                   reply(fdb, FALSE, "Already marked to delete");
+                   reply(clenv, FALSE, "Already marked to delete");
                    REGISTER_ERROR(clenv);
                }
            }
        } else {
-           reply(fdb, FALSE, "No messages");
+           reply(clenv, FALSE, "No messages");
            REGISTER_ERROR(clenv);
        }
     } else {
-       reply(fdb, FALSE, "Command syntax error");
+       reply(clenv, FALSE, "Command syntax error");
        REGISTER_ERROR(clenv);
     }
 
@@ -740,7 +736,7 @@ main_dele(clientenv *clenv)
 static int
 main_last(clientenv *clenv)
 {
-    reply(clenv->fdb, TRUE, "%ld", clenv->last);
+    reply(clenv, TRUE, "%ld", clenv->last);
 
     return (STATE_CURRENT);
 }
@@ -751,7 +747,6 @@ main_top(clientenv *clenv)
 {
     int nextstate = STATE_CURRENT;
     long i1, i2;
-    fdbuf *fdb = clenv->fdb;
     char *args[4];
 
     if ((mm_straspl(args, clenv->buffer, 3)) == 3) {
@@ -760,21 +755,21 @@ main_top(clientenv *clenv)
        i1--;                   /* Array starts at 0, not 1 */
        if ((i1 < 0) || !(i1 < clenv->messages) || clenv->index == NULL ||
                clenv->index[i1].deleted) {
-           reply(fdb, FALSE, "Out of range");
+           reply(clenv, FALSE, "Out of range");
            REGISTER_ERROR(clenv);
        } else {
            /* Valid message number to retreive */
            if (clenv->index[i1].retreived) {
-               reply(fdb, FALSE, "Already retreived");
+               reply(clenv, FALSE, "Already retreived");
                REGISTER_ERROR(clenv);
            } else {
                clenv->last = i1 + 1;
-               if (!do_top(fdb, &clenv->index[i1], i2))
+               if (!do_top(clenv, &clenv->index[i1], i2))
                    nextstate = STATE_ERROR;
            }
        }
     } else {
-       reply(fdb, FALSE, "Command syntax error");
+       reply(clenv, FALSE, "Command syntax error");
        REGISTER_ERROR(clenv);
     }
 
@@ -787,7 +782,6 @@ main_uidl(clientenv *clenv)
 {
     int                nextstate = STATE_CURRENT;
     long       i;
-    fdbuf      *fdb = clenv->fdb;
     char       *args[3];
 
     if ((mm_straspl(args, clenv->buffer, 2)) == 2) {
@@ -796,18 +790,19 @@ main_uidl(clientenv *clenv)
        i--;                    /* Array starts at 0, not 1 */
        if (i < 0 || i > clenv->messages - 1 || clenv->index == NULL ||
                clenv->index[i].deleted) {
-           reply(fdb, FALSE, "Out of range");
+           reply(clenv, FALSE, "Out of range");
            REGISTER_ERROR(clenv);
        } else
-           reply(fdb, TRUE, "%ld %s", i + 1, clenv->index[i].id);
+           reply(clenv, TRUE, "%ld %s", i + 1, clenv->index[i].id);
     } else {
        /* All messages */
-       reply(fdb, TRUE, "%ld message(s) (%ld octets)", clenv->newmessages,
+       reply(clenv, TRUE, "%ld message(s) (%ld octets)",
+               clenv->newmessages,
                clenv->newsize);
        if (clenv->index != NULL) {
            for (i = 0; i < clenv->messages; i++) {
                if (!clenv->index[i].deleted) {
-                   if (!fdbprintf(fdb, "%ld %s\r\n", i + 1,
+                   if (!fdbprintf(clenv->fdb, "%ld %s\r\n", i + 1,
                                clenv->index[i].id)) {
                        nextstate = STATE_ERROR;
                        break;
@@ -816,7 +811,7 @@ main_uidl(clientenv *clenv)
            }
        }
        if (nextstate != STATE_ERROR) {
-           if ((fdbwrite(fdb, ".\r\n", 3)) != 3)
+           if ((fdbwrite(clenv->fdb, ".\r\n", 3)) != 3)
                nextstate = STATE_ERROR;
        }
     }
@@ -830,7 +825,6 @@ main_head(clientenv *clenv)
 {
     int                nextstate = STATE_CURRENT;
     long       i, t;
-    fdbuf      *fdb = clenv->fdb;
     char       *args[3];
 
     if ((mm_straspl(args, clenv->buffer, 2)) == 2) {
@@ -839,7 +833,7 @@ main_head(clientenv *clenv)
        i--;                    /* Array starts at 0, not 1 */
        if (i < 0 || i > clenv->messages - 1 || clenv->index == NULL ||
                clenv->index[i].deleted) {
-           reply(fdb, FALSE, "Out of range");
+           reply(clenv, FALSE, "Out of range");
            REGISTER_ERROR(clenv);
            return nextstate;
        }
@@ -848,13 +842,13 @@ main_head(clientenv *clenv)
        t = clenv->messages;
 
     /* All messages */
-    reply(fdb, TRUE, "%ld message(s) (%ld octets)", clenv->newmessages,
+    reply(clenv, TRUE, "%ld message(s) (%ld octets)", clenv->newmessages,
            clenv->newsize);
     if (clenv->index != NULL) {
        for (i = 0; i < t; i++) {
            if (!clenv->index[i].deleted && !clenv->index[i].retreived &&
                !clenv->index[i].read) {
-               if (!fdbprintf(fdb,
+               if (!fdbprintf(clenv->fdb,
                    "%ld\t- From: %s\r\n\t  To:   %s\r\n\t  Subj: %s\r\n"
                    "\t  Size: %ld\r\n",
                    i + 1, clenv->index[i].h_from, clenv->index[i].h_to,
@@ -866,7 +860,7 @@ main_head(clientenv *clenv)
        }
     }
     if (nextstate != STATE_ERROR) {
-       if ((fdbwrite(fdb, ".\r\n", 3)) != 3)
+       if ((fdbwrite(clenv->fdb, ".\r\n", 3)) != 3)
            nextstate = STATE_ERROR;
     }
 
@@ -879,7 +873,6 @@ main_page(clientenv *clenv)
 {
     int nextstate = STATE_CURRENT;
     long i1, i2, i3;
-    fdbuf *fdb = clenv->fdb;
     char *args[5];
 
     if ((mm_straspl(args, clenv->buffer, 4)) == 4) {
@@ -890,21 +883,21 @@ main_page(clientenv *clenv)
        if (i1 < 0 || i2 < 1 || i3 < 1 || i3 > 60 ||
                !(i1 < clenv->messages) || clenv->index == NULL ||
                clenv->index[i1].deleted) {
-           reply(fdb, FALSE, "Out of range");
+           reply(clenv, FALSE, "Out of range");
            REGISTER_ERROR(clenv);
        } else {
            /* Valid message number to retreive */
            if (clenv->index[i1].retreived) {
-               reply(fdb, FALSE, "Already retreived");
+               reply(clenv, FALSE, "Already retreived");
                REGISTER_ERROR(clenv);
            } else {
                clenv->last = i1 + 1;
-               if (!do_page(fdb, &clenv->index[i1], i2, i3))
+               if (!do_page(clenv, &clenv->index[i1], i2, i3))
                    nextstate = STATE_ERROR;
            }
        }
     } else {
-       reply(fdb, FALSE, "Command syntax error");
+       reply(clenv, FALSE, "Command syntax error");
        REGISTER_ERROR(clenv);
     }
 
@@ -923,9 +916,10 @@ main_page(clientenv *clenv)
  * fdbgets().
  */
 static bool
-reply(fdbuf *fdb, bool result, const char *fmt, ...)
+reply(clientenv *clenv, bool result, const char *fmt, ...)
 {
     char buf[1024], *ok = "+OK", *err = "-ERR", *res = ok;
+    fdbuf *fdb = clenv->fdb;
     va_list arg_ptr;
     bool ret = FALSE;
 
@@ -939,8 +933,7 @@ reply(fdbuf *fdb, bool result, const char *fmt, ...)
 
     if (fdbprintf(fdb, "%s %s\r\n", res, buf)) ret = TRUE;
 
-    /* XXX should be able to show the clenv->id */
-    mmsyslog(3, LOGLEVEL, "> %s (%s)", res, buf);
+    mmsyslog(3, LOGLEVEL, "%08lX > %s (%s)", clenv->id, res, buf);
 
     return (ret);
 }
@@ -1318,13 +1311,14 @@ do_message_free(msgdata *mdata)
 
 /* Query database and output the message contents to fdb, with . */
 static bool
-do_retreive(fdbuf *fdb, msgnode *mnode)
+do_retreive(clientenv *clenv, msgnode *mnode)
 {
+    fdbuf *fdb = clenv->fdb;
     bool ok = FALSE;
     msgdata mdata;
 
     if (do_message_load(&mdata, mnode)) {
-       if (reply(fdb, TRUE, "%u octets", (unsigned int)mdata.size)) {
+       if (reply(clenv, TRUE, "%u octets", (unsigned int)mdata.size)) {
            fdbflushw(fdb);
            if (msgwrite(fdb, mdata.body, mdata.size)) {
                if ((fdbwrite(fdb, "\r\n.\r\n", 5)) == 5) {
@@ -1346,15 +1340,16 @@ do_retreive(fdbuf *fdb, msgnode *mnode)
 
 /* Query database and output the message contents to fdb, with . */
 static bool
-do_top(fdbuf *fdb, msgnode *mnode, long lines)
+do_top(clientenv *clenv, msgnode *mnode, long lines)
 {
+    fdbuf *fdb = clenv->fdb;
     register char *tmp, *to;
     bool ok = FALSE;
     long i;
     msgdata mdata;
 
     if (do_message_load(&mdata, mnode)) {
-       if (reply(fdb, TRUE,
+       if (reply(clenv, TRUE,
                    "%lu octets, also try PAGE <msg> <page> "
                    "<linesperpage>", mdata.size)) {
            /* First display all message headers */
@@ -1397,9 +1392,10 @@ do_top(fdbuf *fdb, msgnode *mnode, long lines)
 
 /* This function is like do_top but more powerful */
 static bool
-do_page(fdbuf *fdb, msgnode *mnode, long page, long lines)
+do_page(clientenv *clenv, msgnode *mnode, long page, long lines)
 {
     register char *tmp, *from, *to;
+    fdbuf *fdb = clenv->fdb;
     bool ok = FALSE;
     long lfrom, i;
     msgdata mdata;
@@ -1411,7 +1407,7 @@ do_page(fdbuf *fdb, msgnode *mnode, long page, long lines)
        lfrom = (page - 1) * lines;
 
     if (do_message_load(&mdata, mnode)) {
-       if (reply(fdb, TRUE, "%lu octets", mdata.size)) {
+       if (reply(clenv, TRUE, "%lu octets", mdata.size)) {
            /* Find out where starts and ends wanted range */
            i = lfrom;
            to = tmp = mdata.body;
@@ -1619,8 +1615,8 @@ handleclient(unsigned long id, int fd, clientlistnode *clientlnode,
            clenv->mailbox = NULL;
            clenv->index = NULL;
 
-           reply(fdb, TRUE, "%s (%s (%s)) Service ready", iface->hostname,
-                   DAEMON_NAME, DAEMON_VERSION);
+           reply(clenv, TRUE, "%s (%s (%s)) Service ready",
+                   iface->hostname, DAEMON_NAME, DAEMON_VERSION);
            state = STATE_AUTH;
            dstatus = MMS_NORMAL;
 
@@ -1639,7 +1635,7 @@ handleclient(unsigned long id, int fd, clientlistnode *clientlnode,
 
                    /* If there were too many errors, exit accordingly */
                    if (clenv->errors > CONF.MAX_ERRORS) {
-                       reply(fdb, FALSE, "Too many errors");
+                       reply(clenv, FALSE, "Too many errors");
                        dstatus = MMS_MANY_ERRORS;
                        break;
                    }
@@ -1667,14 +1663,14 @@ handleclient(unsigned long id, int fd, clientlistnode *clientlnode,
                        } else {
                            /* Unimplemented command for this state */
                            REGISTER_ERROR(clenv);
-                           if (!reply(fdb, states[state].errcode,
+                           if (!reply(clenv, states[state].errcode,
                                        states[state].errtext))
                                break;
                        }
 
                    } else {
                        mmsyslog(3, LOGLEVEL, "%08lX < %s", id, buffer);
-                       if (!reply(fdb, FALSE,
+                       if (!reply(clenv, FALSE,
                                    "Syntax error or unknown command"))
                            break;
                        REGISTER_ERROR(clenv);
index d9a5dea..72bdc02 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmpop3d.h,v 1.30 2009/07/23 18:05:17 mmondor Exp $ */
+/* $Id: mmpop3d.h,v 1.31 2010/04/21 22:06:55 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2008, Matthew Mondor
@@ -216,12 +216,12 @@ static int commandnode_keycmp(const void *, const void *, size_t);
 static bool do_buildindex(clientenv *);
 static bool do_message_load(msgdata *, msgnode *);
 static void do_message_free(msgdata *);
-static bool do_retreive(fdbuf *, msgnode *);
-static bool do_top(fdbuf *, msgnode *, long);
-static bool do_page(fdbuf *, msgnode *, long, long);
+static bool do_retreive(clientenv *, msgnode *);
+static bool do_top(clientenv *, msgnode *, long);
+static bool do_page(clientenv *, msgnode *, long, long);
 static bool do_update(clientenv *);
 static bool msgwrite(fdbuf *, const void *, size_t);
-static bool reply(fdbuf *, bool, const char *, ...);
+static bool reply(clientenv *, bool, const char *, ...);
 static bool clenv_constructor(pnode_t *);
 static void clenv_destructor(pnode_t *);
 static void *utdata_constructor(void);
index 3963273..18fc57b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.c,v 1.106 2010/04/21 19:40:52 mmondor Exp $ */
+/* $Id: mmsmtpd.c,v 1.107 2010/04/21 22:07:01 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2008, Matthew Mondor
@@ -86,7 +86,7 @@
 
 MMCOPYRIGHT("@(#) Copyright (c) 2001-2007\n\
 \tMatthew Mondor. All rights reserved.\n");
-MMRCSID("$Id: mmsmtpd.c,v 1.106 2010/04/21 19:40:52 mmondor Exp $");
+MMRCSID("$Id: mmsmtpd.c,v 1.107 2010/04/21 22:07:01 mmondor Exp $");
 
 
 
@@ -592,7 +592,7 @@ main(int argc, char **argv)
 static int
 all_noop(clientenv *clenv)
 {
-    reply(clenv->fdb, 250, FALSE, "Ok, nothing performed");
+    reply(clenv, 250, FALSE, "Ok, nothing performed");
 
     return (STATE_CURRENT);
 }
@@ -602,15 +602,14 @@ static int
 all_rset(clientenv *clenv)
 {
     int nextstate = STATE_CURRENT;
-    fdbuf *fdb = clenv->fdb;
 
     if (clenv->buffer[4] == 0) {
        if (!init_clientenv(clenv, TRUE))
            nextstate = STATE_ERROR;
        else
-           reply(fdb, 250, FALSE, "Reset state");
+           reply(clenv, 250, FALSE, "Reset state");
     } else {
-       reply(fdb, 550, FALSE, "Command syntax error");
+       reply(clenv, 550, FALSE, "Command syntax error");
        REGISTER_ERROR(clenv);
     }
 
@@ -621,7 +620,7 @@ all_rset(clientenv *clenv)
 static int
 all_quit(clientenv *clenv)
 {
-    reply(clenv->fdb, 221, FALSE, "%s closing connection",
+    reply(clenv, 221, FALSE, "%s closing connection",
            clenv->iface->hostname);
 
     return (STATE_END);
@@ -632,7 +631,6 @@ static int
 all_help(clientenv *clenv)
 {
     int col;
-    fdbuf *fdb = clenv->fdb;
     char *args[3], *cmdline = clenv->buffer, *tmp;
 
     /* First check if a topic was specified */
@@ -647,15 +645,15 @@ all_help(clientenv *clenv)
                    &chash, sizeof(uint32_t));
        col = 0;
        if (nod != NULL) {
-           reply(fdb, 214, TRUE, nod->command->args);
-           reply(fdb, 214, TRUE, "   %s", nod->command->desc);
+           reply(clenv, 214, TRUE, nod->command->args);
+           reply(clenv, 214, TRUE, "   %s", nod->command->desc);
            col = 2;
        }
 
        if (col > 0)
-           reply(fdb, 214, FALSE, "End of HELP information");
+           reply(clenv, 214, FALSE, "End of HELP information");
        else {
-           reply(fdb, 504, FALSE, "Unknown HELP topic");
+           reply(clenv, 504, FALSE, "Unknown HELP topic");
            REGISTER_ERROR(clenv);
        }
 
@@ -663,23 +661,23 @@ all_help(clientenv *clenv)
        register int i;
 
        /* No, display the topics */
-       reply(fdb, 214, TRUE, "Available topics:");
-       fdbwrite(fdb, "214-", 4);
+       reply(clenv, 214, TRUE, "Available topics:");
+       fdbwrite(clenv->fdb, "214-", 4);
        col = 1;
        for (i = 0; (tmp = commands[i].name) != NULL; i++) {
            if (commands[i].desc != NULL) {
                if (col == 0)
-                   fdbwrite(fdb, "\r\n214-", 6);
+                   fdbwrite(clenv->fdb, "\r\n214-", 6);
                col++;
                if (col > 4)
                    col = 0;
-               fdbprintf(fdb, "   %s", tmp);
+               fdbprintf(clenv->fdb, "   %s", tmp);
            }
        }
-       fdbwrite(fdb, "\r\n", 2);
+       fdbwrite(clenv->fdb, "\r\n", 2);
 
-       reply(fdb, 214, TRUE, "For more information, use HELP <topic>");
-       reply(fdb, 214, FALSE, "End of HELP information");
+       reply(clenv, 214, TRUE, "For more information, use HELP <topic>");
+       reply(clenv, 214, FALSE, "End of HELP information");
     }
 
     return (STATE_CURRENT);
@@ -689,7 +687,6 @@ all_help(clientenv *clenv)
 static int
 all_helo(clientenv *clenv)
 {
-    fdbuf *fdb = clenv->fdb;
     char *args[3], *cmdline = clenv->buffer;
 
     if ((mm_straspl(args, cmdline, 2)) == 2) {
@@ -698,21 +695,21 @@ all_helo(clientenv *clenv)
                        CONF.RESOLVE_HELO ? HOST_RES : HOST_NORES, TRUE,
                        TRUE) &&
                    ((clenv->helo = mmstrdup(args[1])) != NULL)) {
-               reply(fdb, 250, FALSE, "%s ok", clenv->iface->hostname);
+               reply(clenv, 250, FALSE, "%s ok", clenv->iface->hostname);
            } else {
                if (CONF.STATFAIL_HELO)
                    mmstat(&clenv->pstat, STAT_UPDATE, 1,
                            "mmsmtpd|failed|helo|%s",
                            clenv->c_ipaddr);
-               reply(fdb, 501, FALSE, "Invalid hostname");
+               reply(clenv, 501, FALSE, "Invalid hostname");
                REGISTER_ERROR(clenv);
            }
        } else {
-           reply(fdb, 503, FALSE, "Duplicate HELO, use RSET or proceed");
+           reply(clenv, 503, FALSE, "Duplicate HELO, use RSET or proceed");
            REGISTER_ERROR(clenv);
        }
     } else {
-       reply(fdb, 550, FALSE, "Command syntax error");
+       reply(clenv, 550, FALSE, "Command syntax error");
        REGISTER_ERROR(clenv);
     }
 
@@ -724,7 +721,6 @@ static int
 all_mail(clientenv *clenv)
 {
     int nextstate = STATE_CURRENT;
-    fdbuf *fdb = clenv->fdb;
     char addr[128];
     bool valid;
     bool nofrom = false, checkednofrom = false;
@@ -739,7 +735,7 @@ all_mail(clientenv *clenv)
                    mmstat(&clenv->pstat, STAT_UPDATE, 1,
                            "mmsmtpd|failed|nohelo|%s",
                            clenv->c_ipaddr);
-               reply(fdb, 503, FALSE, "Use HELO first");
+               reply(clenv, 503, FALSE, "Use HELO first");
                REGISTER_ERROR(clenv);
                return STATE_CURRENT;
            }
@@ -772,16 +768,16 @@ all_mail(clientenv *clenv)
 
        if (valid) {
            if ((clenv->from = mmstrdup(addr)) != NULL)
-               reply(fdb, 250, FALSE, "Sender ok");
+               reply(clenv, 250, FALSE, "Sender ok");
            else
                nextstate = STATE_ERROR;
        } else {
-           reply(fdb, 501, FALSE, "Invalid address");
+           reply(clenv, 501, FALSE, "Invalid address");
            REGISTER_ERROR(clenv);
        }
 
     } else {
-       reply(fdb, 503, FALSE, "Sender already specified");
+       reply(clenv, 503, FALSE, "Sender already specified");
        REGISTER_ERROR(clenv);
     }
 
@@ -793,7 +789,6 @@ static int
 all_rcpt(clientenv *clenv)
 {
     int nextstate = STATE_CURRENT;
-    fdbuf *fdb = clenv->fdb;
     char addr[64], foraddr[64], *line = clenv->buffer;
     int reason;
     struct box_info boxinfo;
@@ -1018,7 +1013,7 @@ end:
     /* Reply with appropriate message */
     if (reason != RCPT_OK)
        REGISTER_ERROR(clenv);
-    reply(fdb, rcpt_msg[reason].code, FALSE, rcpt_msg[reason].msg);
+    reply(clenv, rcpt_msg[reason].code, FALSE, rcpt_msg[reason].msg);
 
     return (nextstate);
 }
@@ -1028,7 +1023,6 @@ static int
 all_data(clientenv *clenv)
 {
     int nextstate = STATE_CURRENT;
-    fdbuf *fdb = clenv->fdb;
 
     if (clenv->buffer[4] == '\0') {
        if (clenv->from != NULL) {
@@ -1038,15 +1032,15 @@ all_data(clientenv *clenv)
                else
                    clenv->messages++;
            } else {
-               reply(fdb, 502, FALSE, "Use RCPT first");
+               reply(clenv, 502, FALSE, "Use RCPT first");
                REGISTER_ERROR(clenv);
            }
        } else {
-           reply(fdb, 503, FALSE, "Use MAIL and RCPT first");
+           reply(clenv, 503, FALSE, "Use MAIL and RCPT first");
            REGISTER_ERROR(clenv);
        }
     } else {
-       reply(fdb, 550, FALSE, "Command syntax error");
+       reply(clenv, 550, FALSE, "Command syntax error");
        REGISTER_ERROR(clenv);
     }
 
@@ -1057,7 +1051,7 @@ all_data(clientenv *clenv)
 static int
 all_beer(clientenv *clenv)
 {
-    reply(clenv->fdb, 420, FALSE, "Here, enjoy!");
+    reply(clenv, 420, FALSE, "Here, enjoy!");
 
     return (STATE_CURRENT);
 }
@@ -1131,11 +1125,12 @@ commandnode_keycmp(const void *src, const void *dst, size_t len)
  * fdbgets().
  */
 static bool
-reply(fdbuf *fdb, int code, bool cont, const char *fmt, ...)
+reply(clientenv *clenv, int code, bool cont, const char *fmt, ...)
 {
     char buf[1024];
     va_list arg_ptr;
     bool err = TRUE;
+    fdbuf *fdb = clenv->fdb;
 
     *buf = 0;
     va_start(arg_ptr, fmt);
@@ -1147,7 +1142,7 @@ reply(fdbuf *fdb, int code, bool cont, const char *fmt, ...)
     else
        err = fdbprintf(fdb, "%d %s\r\n", code, buf);
 
-    mmsyslog(3, LOGLEVEL, "> %d (%s)", code, buf);
+    mmsyslog(3, LOGLEVEL, "%08lX > %d (%s)", clenv->id, code, buf);
 
     return (err);
 }
@@ -1839,7 +1834,7 @@ do_data(clientenv *clenv)
     bool ok = FALSE;
     struct validate_udata ud;
 
-    reply(clenv->fdb, data_msg[DATA_SUBMIT].code, FALSE,
+    reply(clenv, data_msg[DATA_SUBMIT].code, FALSE,
            data_msg[DATA_SUBMIT].msg);
     fdbflushw(clenv->fdb);
 
@@ -1919,7 +1914,7 @@ do_data(clientenv *clenv)
     fdbfreebuf(&fdbrb);        /* Internally only frees if not already freed */
     if (ok)
        err = DATA_OK;
-    reply(clenv->fdb, data_msg[err].code, FALSE, data_msg[err].msg);
+    reply(clenv, data_msg[err].code, FALSE, data_msg[err].msg);
 
     /* Reset mail state (and free RCPTs) */
     init_clientenv(clenv, FALSE);
@@ -2444,7 +2439,7 @@ handleclient(unsigned long id, int fd, clientlistnode *clientlnode,
            DLIST_INIT(&clenv->rcpt);
            clenv->helo = clenv->from = NULL;
 
-           reply(fdb, 220, FALSE, "%s (%s (%s)) Service ready",
+           reply(clenv, 220, FALSE, "%s (%s (%s)) Service ready",
                    iface->hostname, DAEMON_NAME, DAEMON_VERSION);
            state = STATE_ALL;
            dstatus = MMS_NORMAL;
@@ -2469,7 +2464,7 @@ handleclient(unsigned long id, int fd, clientlistnode *clientlnode,
 
                    /* If there were too many errors, exit accordingly */
                    if (clenv->errors > CONF.MAX_ERRORS) {
-                       reply(fdb, 421, FALSE, "Too many errors");
+                       reply(clenv, 421, FALSE, "Too many errors");
                        dstatus = MMS_MANY_ERRORS;
                        break;
                    }
@@ -2497,14 +2492,14 @@ handleclient(unsigned long id, int fd, clientlistnode *clientlnode,
                        } else {
                            /* Unimplemented command for this state */
                            REGISTER_ERROR(clenv);
-                           if (!reply(fdb, states[state].errcode, FALSE,
+                           if (!reply(clenv, states[state].errcode, FALSE,
                                        states[state].errtext))
                                break;
                        }
 
                    } else {
                        mmsyslog(3, LOGLEVEL, "%08lX < %s", id, buffer);
-                       reply(fdb, 500, FALSE,
+                       reply(clenv, 500, FALSE,
                                "Syntax error or unknown command, type HELP");
                        REGISTER_ERROR(clenv);
                    }
index 6b5cde8..992b916 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.h,v 1.52 2010/04/21 19:40:53 mmondor Exp $ */
+/* $Id: mmsmtpd.h,v 1.53 2010/04/21 22:07:01 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2008, Matthew Mondor
@@ -287,7 +287,7 @@ static int all_beer(clientenv *);
 static bool hash_commands(struct command *, size_t);
 static uint32_t commandnode_keyhash(const void *, size_t);
 static int commandnode_keycmp(const void *, const void *, size_t);
-static bool reply(fdbuf *, int, bool, const char *, ...);
+static bool reply(clientenv *, int, bool, const char *, ...);
 
 static bool clientenv_constructor(pnode_t *);
 static void clientenv_destructor(pnode_t *);