summaryrefslogtreecommitdiff
path: root/tools/greylist.c
diff options
context:
space:
mode:
authorJohn Denker <jsd@av8n.com>2012-07-21 18:16:12 (GMT)
committerJohn Denker <jsd@av8n.com>2012-07-21 18:21:25 (GMT)
commitc47ab4973a9f6e9840b44cca3cae07a932ed61f6 (patch)
treeba36cb706c5969b4769929c76ae950611a0d0825 /tools/greylist.c
parent83ce0551954e207c7dba125594b25d59ae29e3c1 (diff)
check DNS consistency
Diffstat (limited to 'tools/greylist.c')
-rw-r--r--tools/greylist.c51
1 files changed, 36 insertions, 15 deletions
diff --git a/tools/greylist.c b/tools/greylist.c
index f9a4ebc..863a2fe 100644
--- a/tools/greylist.c
+++ b/tools/greylist.c
@@ -20,6 +20,8 @@
#include <sys/socket.h> /* for getaddrinfo() */
#include <netdb.h> /* for getaddrinfo() */
#include <string.h> /* for memset() */
+#include <arpa/inet.h> /* for inet_ntop() */
+
using namespace std;
@@ -294,7 +296,7 @@ int main(int _argc, char** _argv){
// (b) move all the DNS checking to a separate module
int dns = foo.check_dns();
- if (dns == ex_syserr) return dns;
+ if (dns == ex_syserr || dns == ex_spam) return dns;
exeunt(sts);
}
@@ -373,15 +375,26 @@ int whatsit::doit(const int penalty){
typedef vector<unsigned char> VU;
-class VUx : public VU {
+class VUx{
public:
- sa_family_t fam;
+ VU addr;
+ sa_family_t fam;
+ string str();
};
+string VUx::str(){
+ char msgbuf[INET6_ADDRSTRLEN];
+ const char* rslt = inet_ntop(fam, &addr[0],
+ msgbuf, sizeof(msgbuf));
+ if (!rslt) rslt = "";
+ return rslt;
+}
+
VUx parse_sockaddr(const sockaddr* ai_addr) {
void* numericAddress;
VUx rslt;
int addrsize;
+ rslt.addr = VU(0);
rslt.fam = ((sockaddr *)ai_addr)->sa_family;
switch (rslt.fam) {
case AF_INET:
@@ -397,8 +410,7 @@ VUx parse_sockaddr(const sockaddr* ai_addr) {
return rslt;
}
unsigned char* foo = (unsigned char*) numericAddress;
- (VU)rslt = VU(foo, foo+addrsize);
- cerr << "asdf " << rslt.size() << " ... " << VU(foo, foo+addrsize).size() << endl;
+ rslt.addr = VU(foo, foo+addrsize);
return rslt;
}
@@ -443,7 +455,7 @@ int whatsit::check_dns(){
return ex_syserr;
}
- VU ipAddr = parse_sockaddr(ipresult->ai_addr);
+ VUx ipAddr = parse_sockaddr(ipresult->ai_addr);
error = getaddrinfo(hostvar, NULL, &hints, &result);
if (error) {
cerr << "error in getaddrinfo for " << hostvar
@@ -454,18 +466,27 @@ int whatsit::check_dns(){
// loop over all returned results and check for a match.
vector<string> checked_hosts;
for (res = result; res != NULL; res = res->ai_next){
- VU hostAddr = parse_sockaddr(res->ai_addr);
-#if 0
- char msgbuf[INET6_ADDRSTRLEN];
- const char* rslt = inet_ntop(fam, numericAddress,
- msgbuf, sizeof(msgbuf));
-#endif
- if (!diff(hostAddr, ipAddr)) {
- cerr << "match! " << ipAddr.size() << endl;
+ VUx hostAddr = parse_sockaddr(res->ai_addr);
+
+ if (!diff(hostAddr.addr, ipAddr.addr)) {
+ ///// cerr << "match! " << ipAddr.addr.size() << endl;
goto done;
}
}
- cerr << "no match" << endl;
+ cerr << "(warning) DNS inconsistency: "
+ << ipAddr.str() << " does not match";
+ for (res = result; res != NULL; res = res->ai_next){
+ cerr << " " << parse_sockaddr(res->ai_addr).str();
+ }
+ cerr << endl;
+#if 1
+ // temporary ... just a warning
+ return 0;
+#else
+ return ex_spam;
+#endif
+
+
done:
return 0;
}