Merge branch 'master' of git+ssh://git.citadel.org/appl/gitroot/citadel
[citadel.git] / citadel / locate_host.c
index 39309e943c6dd7b8ab5f30d276395bbc08366cd5..26c844024515bd2c354a4d46ff358c1c54fad74a 100644 (file)
@@ -4,45 +4,27 @@
  * Copyright (c) 1987-2011 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
  */
 
 #include "sysdep.h"
-#include <stdlib.h>
-#include <unistd.h>
+#include <string.h>
 #include <stdio.h>
+#include <syslog.h>
 #include <ctype.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/socket.h>
+#include <netdb.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-#include <limits.h>
-#include <netdb.h>
-#include <string.h>
-#include <errno.h>
-#include <syslog.h>
+
 #include <libcitadel.h>
-#include "citadel.h"
-#include "server.h"
-#include "locate_host.h"
-#include "sysdep_decls.h"
-#include "config.h"
-#include "domain.h"
-#include "context.h"
-#include "ctdl_module.h"
 
+
+#include "context.h"
 #ifdef HAVE_RESOLV_H
 #include <arpa/nameser.h>
 #ifdef HAVE_ARPA_NAMESER_COMPAT_H
@@ -51,6 +33,9 @@
 #include <resolv.h>
 #endif
 
+#include "domain.h"
+#include "locate_host.h"
+
 /** START:some missing macros on OpenBSD 3.9 */
 #ifndef NS_CMPRSFLGS
 #define NS_CMPRSFLGS   0xc0
@@ -262,11 +247,16 @@ int rbl_check(char *message_to_spammer)
        char tbuf[256] = "";
        int suffix_pos = 0;
        int rbl;
+       int rc;
        int num_rbl;
        char rbl_domains[SIZ];
        char txt_answer[1024];
+       struct timeval tx_start;
+       struct timeval tx_finish;
 
+       rc = 0;
        strcpy(message_to_spammer, "ok");
+       gettimeofday(&tx_start, NULL);          /* start a stopwatch for performance timing */
 
        if ((strchr(CC->cs_addr, '.')) && (!strchr(CC->cs_addr, ':'))) {
                int a1, a2, a3, a4;
@@ -284,12 +274,15 @@ int rbl_check(char *message_to_spammer)
                /* tedious code to expand and reverse an IPv6 address */
                safestrncpy(tbuf, CC->cs_addr, sizeof tbuf);
                num_colons = haschar(tbuf, ':');
-               if ((num_colons < 2) || (num_colons > 7)) return(0);    /* badly formed address */
+               if ((num_colons < 2) || (num_colons > 7))
+                       goto finish_rbl;        /* badly formed address */
 
                /* expand the "::" shorthand */
                while (num_colons < 7) {
                        ptr = strstr(tbuf, "::");
-                       if (!ptr) return(0);                            /* badly formed address */
+                       if (!ptr)
+                               goto finish_rbl;                                /* badly formed address */
+
                        ++ptr;
                        strcpy(workbuf, ptr);
                        strcpy(ptr, ":");
@@ -306,7 +299,8 @@ int rbl_check(char *message_to_spammer)
 
                        memcpy(&tbuf[ (i*4) + (4-strlen(tokbuf)) ], tokbuf, strlen(tokbuf) );
                }
-               if (strlen(tbuf) != 32) return(0);
+               if (strlen(tbuf) != 32)
+                       goto finish_rbl;
 
                /* now reverse it and add dots */
                strcpy(workbuf, tbuf);
@@ -318,12 +312,15 @@ int rbl_check(char *message_to_spammer)
                suffix_pos = 64;
        }
        else {
-               return(0);      /* unknown address format */
+               goto finish_rbl;        /* unknown address format */
        }
 
        /* See if we have any RBL domains configured */
        num_rbl = get_hosts(rbl_domains, "rbl");
-       if (num_rbl < 1) return(0);
+       if (num_rbl < 1)
+       {
+               goto finish_rbl;
+       }
 
        /* Try all configured RBL's */
         for (rbl=0; rbl<num_rbl; ++rbl) {
@@ -332,11 +329,19 @@ int rbl_check(char *message_to_spammer)
                if (rblcheck_backend(tbuf, txt_answer, sizeof txt_answer)) {
                        strcpy(message_to_spammer, txt_answer);
                        syslog(LOG_INFO, "RBL: %s\n", txt_answer);
-                       return(1);
+                       rc = 1;
                }
        }
+finish_rbl:
+       /* How long did this transaction take? */
+       gettimeofday(&tx_finish, NULL);
 
-       return(0);
+       syslog(LOG_WARNING, "RBL [%ld.%06ld] %s",
+              ((tx_finish.tv_sec*1000000 + tx_finish.tv_usec) - (tx_start.tv_sec*1000000 + tx_start.tv_usec)) / 1000000,
+              ((tx_finish.tv_sec*1000000 + tx_finish.tv_usec) - (tx_start.tv_sec*1000000 + tx_start.tv_usec)) % 1000000,
+              (rc)?"Found":"none Found");
+
+       return rc;
 }