aboutsummaryrefslogtreecommitdiff
path: root/mail/rblcheck/files/patch-rblcheck.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/rblcheck/files/patch-rblcheck.c')
-rw-r--r--mail/rblcheck/files/patch-rblcheck.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/mail/rblcheck/files/patch-rblcheck.c b/mail/rblcheck/files/patch-rblcheck.c
new file mode 100644
index 000000000000..3ab717674fb8
--- /dev/null
+++ b/mail/rblcheck/files/patch-rblcheck.c
@@ -0,0 +1,122 @@
+--- rblcheck.c.orig Thu Nov 8 14:05:27 2001
++++ rblcheck.c Wed May 1 08:19:16 2002
+@@ -28,8 +28,10 @@
+ #include <sys/types.h>
+ #include <netinet/in.h>
+ #include <arpa/nameser.h>
++#include <arpa/inet.h>
+ #include <resolv.h>
+ #include <netdb.h>
++#include <unistd.h>
+
+ /*-- PORTABILITY ------------------------------------------------------------*/
+
+@@ -184,7 +186,7 @@
+ * domain. If "txt" is non-zero, we perform a TXT record lookup. We
+ * return the text returned from a TXT match, or an empty string, on
+ * a successful match, or NULL on an unsuccessful match. */
+-char * rblcheck( int a, int b, int c, int d, char * rbldomain, int txt )
++char * rblcheck( struct in_addr a, char * rbldomain, int txt )
+ {
+ char * domain;
+ char * result = NULL;
+@@ -195,12 +197,15 @@
+ const u_char * cend;
+ const u_char * rend;
+ int len;
++ u_char *p;
++ int i, j;
+
+ /* 16 characters max in a dotted-quad address, plus 1 for null */
+ domain = ( char * )malloc( 17 + strlen( rbldomain ) );
+
++ p = (u_char *)&a;
+ /* Create a domain name, in reverse. */
+- sprintf( domain, "%d.%d.%d.%d.%s", d, c, b, a, rbldomain );
++ sprintf( domain, "%d.%d.%d.%d.%s", p[3], p[2], p[1], p[0], rbldomain );
+
+ /* Make our DNS query. */
+ res_init();
+@@ -242,8 +247,8 @@
+ cp = answer + sizeof( HEADER );
+ while( *cp != '\0' )
+ {
+- a = *cp++;
+- while( a-- )
++ i = *cp++;
++ while( i-- )
+ cp++;
+ }
+
+@@ -258,8 +263,8 @@
+ cp += ( NS_INT16SZ * 2 ) + NS_INT32SZ;
+
+ /* Get the length and end of the buffer. */
+- NS_GET16( c, cp );
+- cend = cp + c;
++ NS_GET16( i, cp );
++ cend = cp + i;
+
+ /* Iterate over any multiple answers we might have. In
+ this context, it's unlikely, but anyway. */
+@@ -267,10 +272,10 @@
+ rend = result + RESULT_SIZE - 1;
+ while( cp < cend && rp < rend )
+ {
+- a = *cp++;
+- if( a != 0 )
+- for( b = a; b > 0 && cp < cend && rp < rend;
+- b-- )
++ i = *cp++;
++ if( i != 0 )
++ for( j = i; j > 0 && cp < cend && rp < rend;
++ j-- )
+ {
+ if( *cp == '\n' || *cp == '"' ||
+ *cp == '\\' )
+@@ -289,22 +294,39 @@
+ * RBL listing, handling output of results if necessary. */
+ int full_rblcheck( char * addr )
+ {
+- int a, b, c, d;
++ struct hostent *ent;
++ struct in_addr a;
+ int count = 0;
++ int rblchecking = 0;
+ char * response;
+ struct rbl * ptr;
++ int fail;
++ int c;
+
+ for( ptr = rblsites; ptr != NULL; ptr = ptr->next )
+ {
+- if( sscanf( addr, "%d.%d.%d.%d", &a, &b, &c, &d ) != 4
+- || a < 0 || a > 255 || b < 0 || b > 255 || c < 0 || c > 255
+- || d < 0 || d > 255 )
+- {
++ fail = 0;
++ if ((ent = gethostbyname(addr)) != NULL) {
++ memcpy(&a, ent->h_addr_list[0], sizeof(a));
++ if (ent->h_addr_list[1]) {
++ if (!quiet && rblchecking == 0)
++ fprintf(stderr,
++ "%s resolved to mutiple addresses: ",
++ addr);
++ }
++ if (!quiet && rblchecking++ == 0)
++ fprintf(stderr, "checking %s\n", inet_ntoa(a));
++ } else {
++ if (!inet_aton(addr, &a))
++ fail++;
++ }
++
++ if (fail) {
+ fprintf( stderr, "%s: warning: invalid address `%s'\n",
+ progname, addr );
+ return 0;
+ }
+- response = rblcheck( a, b, c, d, ptr->site, txt );
++ response = rblcheck( a, ptr->site, txt );
+ if( !quiet || response )
+ printf( "%s %s%s%s%s%s%s", addr,
+ ( !quiet && !response ? "not " : "" ),