--- 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 */
