Again some related work for RELAYING = TRUE (note: broken, do not use yet)
authorMatthew Mondor <mmondor@pulsar-zone.net>
Sat, 26 Mar 2005 10:44:29 +0000 (10:44 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Sat, 26 Mar 2005 10:44:29 +0000 (10:44 +0000)
an emergency commit was required to fix an urgent problem I had with spam.

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

index d031590..0bff0ce 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmrelayd.c,v 1.10 2005/03/09 08:55:28 mmondor Exp $ */
+/* $Id: mmrelayd.c,v 1.11 2005/03/26 10:44:28 mmondor Exp $ */
 
 /*
  * Copyright (C) 2004-2005, Matthew Mondor
 #include <mmreadcfg.h>
 #include <mmstring.h>
 
+#include "mmrelayd.h"
+
 
 
 MMCOPYRIGHT("@(#) Copyright (c) 2004\n\
 \tMatthew Mondor. All rights reserved.\n");
-MMRCSID("$Id: mmrelayd.c,v 1.10 2005/03/09 08:55:28 mmondor Exp $");
+MMRCSID("$Id: mmrelayd.c,v 1.11 2005/03/26 10:44:28 mmondor Exp $");
 
 
 
@@ -428,7 +430,8 @@ pidfile_write(const char *file)
 /*
  * Binds AF_LOCAL SOCK_DGRAM socket at specified <path>, with write access
  * for the specified group. Returns socket filedescriptor on success, or -1 on
- * failure.
+ * failure. We use setsockopt(2) to ensure that we can atomically receive
+ * messages large enough for our notification message structure.
  */
 static int
 notify_open(const char *path, gid_t group)
@@ -442,6 +445,14 @@ notify_open(const char *path, gid_t group)
                sau.sun_family = AF_UNIX;
                if (bind(sock, (struct sockaddr *)&sau,
                    sizeof(struct sockaddr_un)) != -1) {
+                       int     opt;
+
+                       opt = (int)BALIGN_CEIL(sizeof(notify_msg_t), 1024);
+                       if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &opt,
+                           sizeof(int)) == -1)
+                               syslog(LOG_NOTICE,
+                                   "Cannot setsockopt(2) - (%s)",
+                                   strerror(errno));
                        if (chmod(path, 0020) == 0) {
                                (void) chown(path, -1, group);
                                return sock;
index 5a5feb3..6861f2e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.c,v 1.69 2005/03/05 15:33:34 mmondor Exp $ */
+/* $Id: mmsmtpd.c,v 1.70 2005/03/26 10:44:29 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2004, Matthew Mondor
 #include <mmlimitrate.h>
 
 #include "mmsmtpd.h"
+#include "../mmrelayd/mmrelayd.h"
 
 
 
 
 MMCOPYRIGHT("@(#) Copyright (c) 2001-2004\n\
 \tMatthew Mondor. All rights reserved.\n");
-MMRCSID("$Id: mmsmtpd.c,v 1.69 2005/03/05 15:33:34 mmondor Exp $");
+MMRCSID("$Id: mmsmtpd.c,v 1.70 2005/03/26 10:44:29 mmondor Exp $");
 
 
 
@@ -2220,8 +2221,13 @@ do_data_file(clientenv *clenv, struct fdbrb_buffer *fdbrb)
        /* Queue for relaying or into the mailbox if local */
        if (!rnode->relay)
            ok = do_data_queue_box(clenv, recvline, recvlen, fdbrb, rnode);
-       else
-           ok = do_data_queue_relay(clenv, recvline, recvlen, fdbrb, rnode);
+       else {
+           if (!CONF.RELAYING)
+               ok = FALSE;
+           else
+               ok = do_data_queue_relay(clenv, recvline, recvlen, fdbrb,
+                       rnode);
+       }
        if (!ok)
            break;
     }
@@ -2337,7 +2343,7 @@ do_data_queue_relay(clientenv *clenv, const char *recvline, size_t recvlen,
      * relay mail as soon as possible instead of waiting until its next
      * scheduled round.
      */
-    do_data_queue_notify();
+    do_data_queue_notify(clenv);
 
     return ok;
 }
@@ -2345,11 +2351,24 @@ do_data_queue_relay(clientenv *clenv, const char *recvline, size_t recvlen,
 /*
  * Attempt to notify mmrelayd(8) that at least one message is ready in the
  * queue to route.
+ * XXX Broken! Do not use RELAYING = TRUE yet!
  */
 static void
-do_data_queue_notify(void)
+do_data_queue_notify(clientenv *clenv)
 {
-    bool       ok = FALSE;
+    bool               ok = FALSE;
+    /*
+    notify_msg_t       msg;
+    */
+
+    /* XXX
+     * We now actually require the lock, since we need to send exactly one
+     * message per new queued mail. Fix accordingly. We however can fill in
+     * the data for the message before sending it to hold the lock for as
+     * short as possible. We also possibly only need it to verify if we're
+     * connected, or to mark the socket disconnected... Since we only need
+     * an atomic send per notification?
+     */
 
     /*
      * If we cannot obtain lock, we know that it's already being notified, and
@@ -2397,12 +2416,17 @@ end:
 static int
 do_data_queue_notify_connect(void)
 {
-    int                        fd;
+    int                        fd, opt;
     struct sockaddr_un addr;
 
     if ((fd = socket(AF_LOCAL, SOCK_DGRAM, 0)) != -1) {
+       opt = (int)BALIGN_CEIL(sizeof(notify_msg_t), 1024);
+       if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(int)) == -1)
+           mmsyslog(0, LOGLEVEL,
+                   "do_data_queue_notify_connect() - setsockopt() - (%s)",
+                   strerror(errno));
        mm_memclr(&addr, sizeof(struct sockaddr_un));
-       mm_strncpy(addr.sun_path, CONF.MMRELAYD_SOCKET_PATH, 100);
+       (void) mm_strncpy(addr.sun_path, CONF.MMRELAYD_SOCKET_PATH, 100);
        addr.sun_family = AF_UNIX;
        if ((pth_connect(fd, (struct sockaddr *)&addr,
                        sizeof(struct sockaddr_un))) == -1) {
index db2fdc0..815ffe5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.h,v 1.30 2005/03/05 15:33:34 mmondor Exp $ */
+/* $Id: mmsmtpd.h,v 1.31 2005/03/26 10:44:29 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2004, Matthew Mondor
@@ -305,7 +305,7 @@ static bool do_data_queue_box(clientenv *, const char *, size_t, struct
        fdbrb_buffer *, rcptnode *);
 static bool do_data_queue_relay(clientenv *, const char *, size_t, struct
        fdbrb_buffer *, rcptnode *);
-static void do_data_queue_notify(void);
+static void do_data_queue_notify(clientenv *);
 static int do_data_queue_notify_connect(void);
 #else
 #error "One of MMMAIL_MYSQL or MMMAIL_FILE must be #defined!"