]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/network/serv_netmail.c
getting with the times, we dont need to wrap snprintf anymore
[citadel.git] / citadel / modules / network / serv_netmail.c
index 709877a64a6454cc74530d6f5dcde76942a36f9f..a793c5f600b0151984a576213cb944d43f39bfed 100644 (file)
@@ -2,22 +2,16 @@
  * This module handles shared rooms, inter-Citadel mail, and outbound
  * mailing list processing.
  *
- * Copyright (c) 2000-2011 by the citadel.org team
+ * Copyright (c) 2000-2012 by the citadel.org team
  *
  *  This program is open source software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
+ *  it under the terms of the GNU General Public License, version 3.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
  * ** NOTE **   A word on the S_NETCONFIGS semaphore:
  * This is a fairly high-level type of critical section.  It ensures that no
  * two threads work on the netconfigs files at the same time.  Since we do
 #include "file_ops.h"
 #include "citadel_dirs.h"
 #include "threads.h"
-
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
-
 #include "context.h"
 #include "netconfig.h"
 #include "netspool.h"
@@ -97,6 +86,7 @@
  * Deliver digest messages
  */
 void network_deliver_digest(SpoolControl *sc) {
+       struct CitContext *CCC = CC;
        char buf[SIZ];
        int i;
        struct CtdlMessage *msg = NULL;
@@ -167,9 +157,9 @@ void network_deliver_digest(SpoolControl *sc) {
        recps = malloc(recps_len);
 
        if (recps == NULL) {
-               syslog(LOG_EMERG,
-                      "Cannot allocate %ld bytes for recps...\n",
-                      (long)recps_len);
+               QN_syslog(LOG_EMERG,
+                         "Cannot allocate %ld bytes for recps...\n",
+                         (long)recps_len);
                abort();
        }
 
@@ -203,7 +193,9 @@ void network_deliver_digest(SpoolControl *sc) {
 /*
  * Deliver list messages to everyone on the list ... efficiently
  */
-void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc) {
+void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc, const char *RoomName)
+{
+       struct CitContext *CCC = CC;
        char *recps = NULL;
        size_t recps_len = SIZ;
        struct recptypes *valid;
@@ -225,9 +217,9 @@ void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc) {
        recps = malloc(recps_len);
 
        if (recps == NULL) {
-               syslog(LOG_EMERG,
-                      "Cannot allocate %ld bytes for recps...\n",
-                      (long)recps_len);
+               QN_syslog(LOG_EMERG,
+                         "Cannot allocate %ld bytes for recps...\n",
+                         (long)recps_len);
                abort();
        }
 
@@ -251,6 +243,7 @@ void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc) {
        if (valid != NULL) {
                valid->bounce_to = strdup(bounce_to);
                valid->envelope_from = strdup(bounce_to);
+               valid->sending_room = strdup(RoomName);
                CtdlSubmitMsg(msg, valid, NULL, 0);
                free_recipients(valid);
        }
@@ -264,6 +257,8 @@ void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc) {
 void network_spool_msg(long msgnum,
                       void *userdata)
 {
+       struct CitContext *CCC = CC;
+       StrBuf *Buf = NULL;
        SpoolControl *sc;
        int i;
        char *newpath = NULL;
@@ -390,7 +385,7 @@ void network_spool_msg(long msgnum,
                        }
 
                        /* Handle delivery */
-                       network_deliver_list(msg, sc);
+                       network_deliver_list(msg, sc, CC->room.QRname);
                        CtdlFreeMessage(msg);
                }
        }
@@ -469,9 +464,11 @@ void network_spool_msg(long msgnum,
                                                config.c_nodename)) {
                                        ok_to_participate = 1;
                                }
+
+                               Buf = NewStrBufPlain(msg->cm_fields['N'], -1);
                                if (is_valid_node(NULL,
                                                  NULL,
-                                                 msg->cm_fields['N'],
+                                                 Buf,
                                                  sc->working_ignetcfg,
                                                  sc->the_netmap) == 0)
                                {
@@ -559,42 +556,46 @@ void network_spool_msg(long msgnum,
                    mptr = mptr->next) {
 
                        send = 1;
-
+                       if (Buf == NULL)
+                               Buf = NewStrBufPlain(mptr->remote_nodename, -1);
+                       else
+                               StrBufPlain(Buf, mptr->remote_nodename, -1);
                        /* Check for valid node name */
                        if (is_valid_node(NULL,
                                          NULL,
-                                         mptr->remote_nodename,
+                                         Buf,
                                          sc->working_ignetcfg,
                                          sc->the_netmap) != 0)
                        {
-                               syslog(LOG_ERR,
-                                      "Invalid node <%s>\n",
-                                      mptr->remote_nodename);
+                               QN_syslog(LOG_ERR,
+                                         "Invalid node <%s>\n",
+                                         mptr->remote_nodename);
 
                                send = 0;
                        }
 
                        /* Check for split horizon */
-                       syslog(LOG_DEBUG, "Path is %s\n", msg->cm_fields['P']);
+                       QN_syslog(LOG_DEBUG, "Path is %s\n", msg->cm_fields['P']);
                        bang = num_tokens(msg->cm_fields['P'], '!');
-                       if (bang > 1) for (i=0; i<(bang-1); ++i) {
-                               extract_token(buf,
-                                             msg->cm_fields['P'],
-                                             i, '!',
-                                             sizeof buf);
-
-                               syslog(LOG_DEBUG, "Compare <%s> to <%s>\n",
-                                       buf, mptr->remote_nodename) ;
-                               if (!strcasecmp(buf, mptr->remote_nodename)) {
-                                       send = 0;
-                                       syslog(LOG_DEBUG, "Not sending to %s\n",
-                                               mptr->remote_nodename);
-                               }
-                               else {
-                                       syslog(LOG_DEBUG,
-                                              "Sending to %s\n",
-                                              mptr->remote_nodename);
+                       if (bang > 1) {
+                               for (i=0; i<(bang-1); ++i) {
+                                       extract_token(buf,
+                                                     msg->cm_fields['P'],
+                                                     i, '!',
+                                                     sizeof buf);
+                                       
+                                       QN_syslog(LOG_DEBUG, "Compare <%s> to <%s>\n",
+                                                 buf, mptr->remote_nodename) ;
+                                       if (!strcasecmp(buf, mptr->remote_nodename)) {
+                                               send = 0;
+                                               break;
+                                       }
                                }
+
+                               QN_syslog(LOG_INFO,
+                                         "%sSending to %s\n",
+                                         (send)?"":"Not ",
+                                         mptr->remote_nodename);
                        }
 
                        /* Send the message */
@@ -631,9 +632,9 @@ void network_spool_msg(long msgnum,
                                                 rand()
                                        );
 
-                                       syslog(LOG_DEBUG,
-                                              "Appending to %s\n",
-                                              filename);
+                                       QN_syslog(LOG_DEBUG,
+                                                 "Appending to %s\n",
+                                                 filename);
 
                                        fp = fopen(filename, "ab");
                                        if (fp != NULL) {
@@ -642,10 +643,10 @@ void network_spool_msg(long msgnum,
                                                fclose(fp);
                                        }
                                        else {
-                                               syslog(LOG_ERR,
-                                                      "%s: %s\n",
-                                                      filename,
-                                                      strerror(errno));
+                                               QN_syslog(LOG_ERR,
+                                                         "%s: %s\n",
+                                                         filename,
+                                                         strerror(errno));
                                        }
 
                                        /* free the serialized version */
@@ -664,5 +665,5 @@ void network_spool_msg(long msgnum,
        if (delete_after_send) {
                CtdlDeleteMessages(CC->room.QRname, &msgnum, 1, "");
        }
-
+       FreeStrBuf(&Buf);
 }