diff -ur pure-ftpd-1.0.22/src/Makefile.am pure-ftpd-1.0.22-geoip/src/Makefile.am
--- pure-ftpd-1.0.22/src/Makefile.am	Thu Apr 23 19:17:00 2009
+++ pure-ftpd-1.0.22-geoip/src/Makefile.am	Sat Apr 25 18:54:48 2009
@@ -16,7 +16,7 @@
 
 pure_ftpd_LDADD = \
 	../puredb/src/libpuredb_read.a \
-	@LDAP_SSL_LIBS@ @GETLOADAVG_LIBS@ @BONJOUR_LDADD@
+	@LDAP_SSL_LIBS@ @GETLOADAVG_LIBS@ @BONJOUR_LDADD@ -lGeoIP
 
 pure_ftpd_CFLAGS = -DINCLUDE_IO_WRAPPERS=1
 
diff -ur pure-ftpd-1.0.22/src/Makefile.in pure-ftpd-1.0.22-geoip/src/Makefile.in
--- pure-ftpd-1.0.22/src/Makefile.in	Sat Apr 25 18:18:55 2009
+++ pure-ftpd-1.0.22-geoip/src/Makefile.in	Sat Apr 25 18:54:48 2009
@@ -226,7 +226,7 @@
 target_alias = @target_alias@
 pure_ftpd_LDADD = \
 	../puredb/src/libpuredb_read.a \
-	@LDAP_SSL_LIBS@ @GETLOADAVG_LIBS@ @BONJOUR_LDADD@
+	@LDAP_SSL_LIBS@ @GETLOADAVG_LIBS@ @BONJOUR_LDADD@ -lGeoIP
 
 pure_ftpd_CFLAGS = -DINCLUDE_IO_WRAPPERS=1
 pure_ftpd_SOURCES = \
diff -ur pure-ftpd-1.0.22/src/ftpd.c pure-ftpd-1.0.22-geoip/src/ftpd.c
--- pure-ftpd-1.0.22/src/ftpd.c	Sat Apr 25 18:25:59 2009
+++ pure-ftpd-1.0.22-geoip/src/ftpd.c	Sat Apr 25 18:54:48 2009
@@ -33,6 +33,7 @@
 #ifdef WITH_BONJOUR
 # include "bonjour.h"
 #endif
+#include "GeoIP.h"
 
 #ifdef WITH_DMALLOC
 # include <dmalloc.h>
@@ -4617,9 +4618,10 @@
         die(421, LOG_ERR, MSG_GETPEERNAME ": %s" , strerror(errno));
     }
     fourinsix(&peer);
-    if (checkvalidaddr(&peer) == 0) {
+    if (checkvalidaddr(&peer) == 0 || STORAGE_FAMILY(ctrlconn) != AF_INET) {
         die(425, LOG_ERR, MSG_INVALID_IP);
     }
+    resolve_hostnames = 0;
 #ifndef DONT_LOG_IP
     for (;;) {
         int eai;
@@ -4653,6 +4655,37 @@
     *host = '?';
     host[1] = 0;
 #endif
+    do {
+        char line[LINE_MAX];        
+        GeoIP *gi;
+        const char *country;
+        char *sep;
+        int found = 0;
+        FILE *fp;
+
+        gi = GeoIP_new(GEOIP_STANDARD);
+        country = GeoIP_country_code_by_name(gi, host);        
+        if (country == NULL || *country == 0 ||
+            !(fp = fopen(CONFDIR "/pureftpd-restricted-countries.txt", "r"))) {
+            break;
+        }
+        while (fgets(line, sizeof line, fp) != NULL) {
+            if (*line == '#') {
+                continue;
+            }
+            if ((sep = strchr(line, '\n')) != NULL) {
+                *sep = 0;
+            }
+            if (strcasecmp(line, country) == 0) {
+                found++;
+                break;
+            }
+        }
+        fclose(fp);
+        if (found == 0) {
+            die(425, LOG_ERR, MSG_INVALID_IP);
+        }
+    } while(0);   
     iptropize(&peer);
     logfile(LOG_INFO, MSG_NEW_CONNECTION, host);
 
