1 #include <sys/socket.h>
11 #include "smtp_proc.h"
13 static char **blacklists = NULL;
14 static size_t nblacklists = 0;
17 enum filter_decision dnsbl_connect(char *, int, time_t, char *, char *,
18 uint64_t, uint64_t, struct smtp_filter_connect *);
21 main(int argc, char *argv[])
28 char *msgid, *token, *ip;
32 if (pledge("stdio dns", NULL) == -1)
35 while ((ch = getopt(argc, argv, "b:f:r:")) != -1) {
38 blacklists = reallocarray(blacklists, nblacklists + 1,
40 if (blacklists == NULL)
42 if ((blacklists[nblacklists] = strdup(optarg)) == NULL)
52 errx(1, "No blacklist specified");
54 smtp_register_filter_connect(dnsbl_connect);
61 dnsbl_connect(char *type, int version, time_t tm, char *direction, char *phase,
62 uint64_t reqid, uint64_t token, struct smtp_filter_connect *params)
70 addr = (u_char *)&(params->addr);
71 for (i = 0; i < nblacklists; i++) {
72 if (params->af == AF_INET) {
73 if (snprintf(query, sizeof(query), "%u.%u.%u.%u.%s",
74 addr[3], addr[2], addr[1], addr[0],
75 blacklists[i]) >= sizeof(query))
76 errx(1, "Can't create query, domain too long");
77 } else if (params->af == AF_INET6) {
78 if (snprintf(query, sizeof(query), "%hhx.%hhx.%hhx.%hhx"
79 ".%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%hhx"
80 ".%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%hhx"
81 ".%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%hhx.%s",
82 (u_char) (addr[15] & 0xf), (u_char) (addr[15] >> 4),
83 (u_char) (addr[14] & 0xf), (u_char) (addr[14] >> 4),
84 (u_char) (addr[13] & 0xf), (u_char) (addr[13] >> 4),
85 (u_char) (addr[12] & 0xf), (u_char) (addr[12] >> 4),
86 (u_char) (addr[11] & 0xf), (u_char) (addr[11] >> 4),
87 (u_char) (addr[10] & 0xf), (u_char) (addr[10] >> 4),
88 (u_char) (addr[9] & 0xf), (u_char) (addr[9] >> 4),
89 (u_char) (addr[8] & 0xf), (u_char) (addr[8] >> 4),
90 (u_char) (addr[7] & 0xf), (u_char) (addr[8] >> 4),
91 (u_char) (addr[6] & 0xf), (u_char) (addr[7] >> 4),
92 (u_char) (addr[5] & 0xf), (u_char) (addr[5] >> 4),
93 (u_char) (addr[4] & 0xf), (u_char) (addr[4] >> 4),
94 (u_char) (addr[3] & 0xf), (u_char) (addr[3] >> 4),
95 (u_char) (addr[2] & 0xf), (u_char) (addr[2] >> 4),
96 (u_char) (addr[1] & 0xf), (u_char) (addr[1] >> 4),
97 (u_char) (addr[0] & 0xf), (u_char) (addr[0] >> 4),
98 blacklists[i]) >= sizeof(query))
99 errx(1, "Can't create query, domain too long");
101 errx(1, "Invalid address family received");
103 if ((hent = gethostbyname(query)) == NULL) {
104 if (h_errno == HOST_NOT_FOUND)
106 if (h_errno != TRY_AGAIN) {
107 smtp_filter_disconnect(reqid, token,
108 "Blacklist check failed");
109 return FILTER_DISCONNECT;
112 smtp_filter_disconnect(reqid, token,
113 "Listed at %s", blacklists[i]);
114 return FILTER_DISCONNECT;
117 return FILTER_PROCEED;
123 fprintf(stderr, "usage: %s [-b blacklist]\n",