--- tcp_wrappers_7.6-ipv6.4.orig/options.c Mon Feb 12 01:01:32 1996 +++ tcp_wrappers_7.6-ipv6.4/options.c Mon Dec 13 14:05:44 2004 @@ -85,6 +85,7 @@ static void allow_option(); /* execute "allow" option */ static void deny_option(); /* execute "deny" option */ static void banners_option(); /* execute "banners path" option */ +static void rbl_option(); /* execute "rbl" option */ /* Structure of the options table. */ @@ -122,6 +123,7 @@ "allow", allow_option, USE_LAST, "deny", deny_option, USE_LAST, "banners", banners_option, NEED_ARG, + "rbl", rbl_option, NEED_ARG | USE_LAST, 0, }; @@ -556,6 +558,35 @@ allow_severity = deny_severity = level ? severity_map(log_fac, value) | severity_map(log_sev, level) : severity_map(log_sev, value); +} + +/* rbl_option - check realtime blacklist */ + +/* ARGSUSED */ + +static void rbl_option(value, request) +char *value; +struct request_info *request; +{ + char rbl_name[STRING_LENGTH], rbl_base[STRING_LENGTH]; + unsigned char a[4]; + int len; + + if (SGFAM(request->client->sin) == AF_INET) { + sscanf(request->client->addr, + "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]); + while (*(value = chop_string(value)) != '\0') { + len = strcspn(value, whitespace); + strncpy(rbl_base, value, len); + *(rbl_base + len) = '\0'; + snprintf(rbl_name, STRING_LENGTH, "%d.%d.%d.%d.%s", + a[3], a[2], a[1], a[0], rbl_base); + if (gethostbyname(rbl_name) != NULL) + deny_option(value, request); + value += len; + } + } + allow_option(value, request); } /* get_field - return pointer to next field in string */