aboutsummaryrefslogtreecommitdiff
path: root/mail/rblcheck/files/patch-aa
blob: 3ab717674fb8b77c73fc1a340239af7090dbe2a3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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 " : "" ),