Assert that we don't always have a valid session.
[citadel.git] / citadel / locate_host.c
index d964bc72e0f27972e1dca54708076ccaba031baf..26c844024515bd2c354a4d46ff358c1c54fad74a 100644 (file)
  */
 
 #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
@@ -45,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
@@ -256,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;
@@ -278,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, ":");
@@ -300,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);
@@ -312,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) {
@@ -326,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;
 }