@@ -0,0 +1,590 @@
+Index: src/Makefile.am
+===================================================================
+--- src/Makefile.am.orig
++++ src/Makefile.am
+@@ -234,6 +234,10 @@ mod_accesslog_la_SOURCES = mod_accesslog
+ mod_accesslog_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
+ mod_accesslog_la_LIBADD = $(common_libadd)
+
++lib_LTLIBRARIES += mod_geoip.la
++mod_geoip_la_SOURCES = mod_geoip.c
++mod_geoip_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
++mod_geoip_la_LIBADD = $(common_libadd) -lGeoIP
+
+ hdr = server.h buffer.h network.h log.h keyvalue.h \
+ response.h request.h fastcgi.h chunk.h \
+Index: src/mod_geoip.c
+===================================================================
+--- /dev/null
++++ src/mod_geoip.c
+@@ -0,0 +1,417 @@
++#include <GeoIP.h>
++#include <GeoIPCity.h>
++
++#include <ctype.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include "base.h"
++#include "log.h"
++#include "buffer.h"
++
++#include "plugin.h"
++#include "inet_ntop_cache.h"
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++/**
++ *
++ * $mod_geoip.c (v2.0) (13.09.2006 00:29:11)
++ *
++ * Name:
++ * mod_geoip.c
++ *
++ * Description:
++ * GeoIP module (plugin) for lighttpd.
++ * the module loads a geoip database of type "country" or "city" and
++ * sets new ENV vars based on ip record lookups.
++ *
++ * country db env's:
++ * GEOIP_COUNTRY_CODE
++ * GEOIP_COUNTRY_CODE3
++ * GEOIP_COUNTRY_NAME
++ *
++ * city db env's:
++ * GEOIP_COUNTRY_CODE
++ * GEOIP_COUNTRY_CODE3
++ * GEOIP_COUNTRY_NAME
++ * GEOIP_CITY_NAME
++ * GEOIP_CITY_POSTAL_CODE
++ * GEOIP_CITY_LATITUDE
++ * GEOIP_CITY_LONG_LATITUDE
++ * GEOIP_CITY_DMA_CODE
++ * GEOIP_CITY_AREA_CODE
++ *
++ * Usage (configuration options):
++ * geoip.db-filename = <path to the geoip or geocity database>
++ * geoip.memory-cache = <enable|disable> : default disabled
++ * if enabled, mod_geoip will load the database binary file to
++ * memory for very fast lookups. the only penalty is memory usage.
++ *
++ * Author:
++ * Ami E. Bizamcher (amix)
++ * duke.amix@gmail.com
++ *
++ * Note:
++ * GeoIP Library and API must be installed!
++ */
++
++
++/* plugin config for all request/connections */
++
++typedef struct {
++ unsigned short mem_cache;
++ buffer *db_name;
++ GeoIP *gi;
++} plugin_config;
++
++typedef struct {
++ PLUGIN_DATA;
++
++ plugin_config **config_storage;
++
++ plugin_config conf;
++} plugin_data;
++
++/* init the plugin data */
++INIT_FUNC(mod_geoip_init) {
++ plugin_data *p;
++
++ p = calloc(1, sizeof(*p));
++
++ return p;
++}
++
++/* detroy the plugin data */
++FREE_FUNC(mod_geoip_free) {
++ plugin_data *p = p_d;
++
++ UNUSED(srv);
++
++ if (!p) return HANDLER_GO_ON;
++
++ if (p->config_storage) {
++ size_t i;
++
++ for (i = 0; i < srv->config_context->used; i++) {
++ plugin_config *s = p->config_storage[i];
++
++ if (!s) continue;
++
++ buffer_free(s->db_name);
++
++ /* clean up */
++ GeoIP_delete(s->gi);
++
++ free(s);
++ }
++ free(p->config_storage);
++ }
++
++ free(p);
++
++ return HANDLER_GO_ON;
++}
++
++/* handle plugin config and check values */
++
++SETDEFAULTS_FUNC(mod_geoip_set_defaults) {
++ plugin_data *p = p_d;
++ size_t i = 0;
++
++ config_values_t cv[] = {
++ { "geoip.db-filename", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 0 */
++ { "geoip.memory-cache", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 1 */
++ { NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET }
++ };
++
++ if (!p) return HANDLER_ERROR;
++
++ p->config_storage = calloc(1, srv->config_context->used * sizeof(specific_config *));
++
++ for (i = 0; i < srv->config_context->used; i++) {
++ plugin_config *s;
++ int mode;
++
++ s = calloc(1, sizeof(plugin_config));
++
++ s->db_name = buffer_init();
++ s->mem_cache = 0; /* default: do not load db to cache */
++ s->gi = NULL;
++
++ cv[0].destination = s->db_name;
++ cv[1].destination = &(s->mem_cache);
++
++ p->config_storage[i] = s;
++
++ if (0 != config_insert_values_global(srv, ((data_config *)srv->config_context->data[i])->value, cv)) {
++ return HANDLER_ERROR;
++ }
++
++ mode = GEOIP_STANDARD | GEOIP_CHECK_CACHE;
++
++ /* country db filename is requeried! */
++ if (!buffer_is_empty(s->db_name)) {
++
++ /* let's start cooking */
++ if (s->mem_cache != 0)
++ mode = GEOIP_MEMORY_CACHE | GEOIP_CHECK_CACHE;
++
++ if (NULL == (s->gi = GeoIP_open(s->db_name->ptr, mode))) {
++ log_error_write(srv, __FILE__, __LINE__, "s",
++ "failed to open GeoIP database!!!");
++
++ return HANDLER_ERROR;
++ }
++
++ /* is the db supported ? */
++ if (s->gi->databaseType != GEOIP_COUNTRY_EDITION &&
++ s->gi->databaseType != GEOIP_CITY_EDITION_REV0 &&
++ s->gi->databaseType != GEOIP_CITY_EDITION_REV1) {
++ log_error_write(srv, __FILE__, __LINE__, "s",
++ "GeoIP database is of unsupported type!!!");
++ }
++ }
++ }
++
++ return HANDLER_GO_ON;
|