You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by jm...@apache.org on 2006/06/30 00:22:41 UTC

svn commit: r418149 - in /spamassassin/trunk: spamc/libspamc.c t/spamc_l.t

Author: jm
Date: Thu Jun 29 15:22:38 2006
New Revision: 418149

URL: http://svn.apache.org/viewvc?rev=418149&view=rev
Log:
cleanup spamc error handling and reduce ifdefs; fix a windows build failure due to misplaced format args in libspamc_log; log hostname in failure-to-connect messages again; log failures to connect for all failing interfaces for multihomed hosts, so that t/spamc_l.t will pass when there is no IPv6 interface but IPv6 is in the kernel

Modified:
    spamassassin/trunk/spamc/libspamc.c
    spamassassin/trunk/t/spamc_l.t

Modified: spamassassin/trunk/spamc/libspamc.c
URL: http://svn.apache.org/viewvc/spamassassin/trunk/spamc/libspamc.c?rev=418149&r1=418148&r2=418149&view=diff
==============================================================================
--- spamassassin/trunk/spamc/libspamc.c (original)
+++ spamassassin/trunk/spamc/libspamc.c Thu Jun 29 15:22:38 2006
@@ -78,6 +78,12 @@
 #define h_errno errno
 #endif
 
+#ifdef _WIN32
+#define spamc_get_errno()   WSAGetLastError()
+#else
+#define spamc_get_errno()   errno
+#endif
+
 #ifndef HAVE_OPTARG
 extern char *optarg;
 #endif
@@ -187,7 +193,7 @@
 static int _opensocket(int flags, struct addrinfo *res, int *psock)
 {
     const char *typename;
-
+    int origerr;
 #ifdef _WIN32
     int socktout;
 #endif
@@ -225,18 +231,16 @@
 	== INVALID_SOCKET
 #endif
 	) {
-	int origerr;
 
 		/*--------------------------------------------------------
 		 * At this point we had a failure creating the socket, and
 		 * this is pretty much fatal. Translate the error reason
 		 * into something the user can understand.
 		 */
+	origerr = spamc_get_errno();
 #ifndef _WIN32
-	origerr = errno;	/* take a copy before syslog() */
 	libspamc_log(flags, LOG_ERR, "socket(%s) to spamd failed: %s", typename, strerror(origerr));
 #else
-	origerr = WSAGetLastError();
 	libspamc_log(flags, LOG_ERR, "socket(%s) to spamd failed: %d", typename, origerr);
 #endif
 
@@ -265,16 +269,15 @@
     if (type == PF_INET
         && setsockopt(*psock, SOL_SOCKET, SO_RCVTIMEO, (char *)&socktout, sizeof(socktout)) != 0)
     {
-        int origerrno;
 
-        origerrno = WSAGetLastError();
-        switch (origerrno)
+        origerr = spamc_get_errno();
+        switch (origerr)
         {
         case EBADF:
         case ENOTSOCK:
         case ENOPROTOOPT:
         case EFAULT:
-            libspamc_log(flags, LOG_ERR, "setsockopt(SO_RCVTIMEO) failed: %d", origerrno);
+            libspamc_log(flags, LOG_ERR, "setsockopt(SO_RCVTIMEO) failed: %d", origerr);
             closesocket(*psock);
             return EX_SOFTWARE;
 
@@ -294,12 +297,7 @@
 
 	if (type == PF_INET
 	    && setsockopt(*psock, 0, TCP_NODELAY, &one, sizeof one) != 0) {
-	    int origerrno;
-#ifndef _WIN32
-	    origerr = errno;
-#else
-	    origerrno = WSAGetLastError();
-#endif
+	    origerr = spamc_get_errno();
 	    switch (origerr) {
 	    case EBADF:
 	    case ENOTSOCK:
@@ -459,13 +457,20 @@
             status = connect(mysock, res->ai_addr, res->ai_addrlen);
 
             if (status != 0) {
+                  origerr = spamc_get_errno();
+                  closesocket(mysock);
+
 #ifndef _WIN32
-                  origerr = errno;
+                  libspamc_log(tp->flags, LOG_ERR,
+                      "connect to spamd on %s failed, retrying (#%d of %d): %s",
+                      host, numloops+1, MAX_CONNECT_RETRIES, strerror(origerr));
 #else
-                  origerr = WSAGetLastError();
+                  libspamc_log(tp->flags, LOG_ERR,
+                      "connect to spamd on %s failed, retrying (#%d of %d): %d",
+                      host, numloops+1, MAX_CONNECT_RETRIES, origerr);
 #endif
-                  closesocket(mysock);
-              } else {
+
+            } else {
 #ifdef DO_CONNECT_DEBUG_SYSLOGS
                   libspamc_log(tp->flags, CONNECT_DEBUG_LEVEL,
                           "dbg: connect(%s) to spamd done",family);
@@ -477,16 +482,6 @@
             res = res->ai_next;
         }
         sleep(CONNECT_RETRY_SLEEP);
-
-#ifndef _WIN32
-        libspamc_log(tp->flags, LOG_ERR,
-                "connect to spamd failed, retrying (#%d of %d): %s",
-                numloops+1, MAX_CONNECT_RETRIES, strerror(origerr));
-#else
-        libspamc_log(tp->flags, LOG_ERR,
-                "connect to spamd on %s failed, retrying (#%d of %d): %s",
-                family, host, numloops+1, MAX_CONNECT_RETRIES, origerr);
-#endif
     } /* for(numloops...) */
 
     for(numloops=0;numloops<tp->nhosts;numloops++) {
@@ -1575,7 +1570,7 @@
 #endif
     case TRANSPORT_LOCALHOST:
         /* getaddrinfo(NULL) will look up the loopback address */
-        if (origerr = getaddrinfo(NULL, port, &hints, &res)) {
+        if ((origerr = getaddrinfo(NULL, port, &hints, &res)) != 0) {
             libspamc_log(flags, LOG_ERR, 
                   "getaddrinfo(NULL) failed: %s",
                   gai_strerror(origerr));

Modified: spamassassin/trunk/t/spamc_l.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/spamc_l.t?rev=418149&r1=418148&r2=418149&view=diff
==============================================================================
--- spamassassin/trunk/t/spamc_l.t (original)
+++ spamassassin/trunk/t/spamc_l.t Thu Jun 29 15:22:38 2006
@@ -2,7 +2,7 @@
 
 use lib '.'; use lib 't';
 use SATest; sa_t_init("spamc_l");
-use Test; plan tests => ($NO_SPAMC_EXE ? 0 : 3),
+use Test; plan tests => ($NO_SPAMC_EXE ? 0 : 4),
                onfail => sub { warn "FAIL: Some other process running on port 8?  Test assumes nothing is listening on port 8." };
 
 
@@ -15,7 +15,8 @@
 %patterns = (
 
 q{ hello world }, 'spamc_l',
-q{ spamc: connect to spamd failed, retrying (#1 of 3): } . $errmsg, 'connfailed',
+q{ spamc: connect to spamd on }, 'connfailed_a',
+q{ failed, retrying (#1 of 3): } . $errmsg, 'connfailed_b',
 
 );