diff options
author | Ulf Lamping <ulf.lamping@web.de> | 2009-02-04 01:02:59 +0000 |
---|---|---|
committer | Ulf Lamping <ulf.lamping@web.de> | 2009-02-04 01:02:59 +0000 |
commit | d5d3e1fa9220a9e0da2fd4b5a428dd248d55672d (patch) | |
tree | 72a1b662da782f7f64a954a7cd19c80d5c9f8390 /epan/geoip_db.c | |
parent | 52c567e2b285f7f66b2e0e39964f4d1c1e2ebaba (diff) |
add display of GeoIP latitude/longitude
This is a crude hack, as the current Wireshark interface to GeoIP is not really suitable for reading several values of a single GeoIP database :-(
svn path=/trunk/; revision=27365
Diffstat (limited to 'epan/geoip_db.c')
-rw-r--r-- | epan/geoip_db.c | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/epan/geoip_db.c b/epan/geoip_db.c index db4169afe6..4038982844 100644 --- a/epan/geoip_db.c +++ b/epan/geoip_db.c @@ -47,7 +47,7 @@ #include <wsutil/file_util.h> /* This needs to match NUM_GEOIP_COLS in hostlist_table.h */ -#define MAX_GEOIP_DBS 8 +#define MAX_GEOIP_DBS 13 /* Column names for each database type */ value_string geoip_type_name_vals[] = { @@ -62,6 +62,8 @@ value_string geoip_type_name_vals[] = { { GEOIP_ASNUM_EDITION, "AS Number" }, { GEOIP_NETSPEED_EDITION, "Speed" }, { GEOIP_DOMAIN_EDITION, "Domain" }, + { WS_LAT_FAKE_EDITION, "Latitude" }, /* fake database */ + { WS_LON_FAKE_EDITION, "Longitude" }, /* fake database */ { 0, NULL } }; @@ -159,6 +161,18 @@ geoip_db_init(void) { } } + /* add fake databases for latitude and longitude (using "City" in reality) */ + { + GeoIP *gi_lat; + GeoIP *gi_lon; + + gi_lat = g_malloc(sizeof (GeoIP)); + gi_lat->databaseType = WS_LAT_FAKE_EDITION; + g_array_append_val(geoip_dat_arr, gi_lat); + gi_lon = g_malloc(sizeof (GeoIP)); + gi_lon->databaseType = WS_LON_FAKE_EDITION; + g_array_append_val(geoip_dat_arr, gi_lon); + } } guint @@ -188,6 +202,35 @@ geoip_db_type(guint dbnum) { return -1; } +int +geoip_db_lookup_latlon(guint32 addr, float *lat, float *lon) { + GeoIP *gi; + GeoIPRecord *gir; + guint i; + + for (i = 0; i < geoip_db_num_dbs(); i++) { + gi = g_array_index(geoip_dat_arr, GeoIP *, i); + if (gi) { + switch (gi->databaseType) { + case GEOIP_CITY_EDITION_REV0: + case GEOIP_CITY_EDITION_REV1: + gir = GeoIP_record_by_ipnum(gi, addr); + if(gir) { + *lat = gir->latitude; + *lon = gir->longitude; + return 0; + } + return -1; + /*break;*/ + + default: + break; + } + } + } + return -1; +} + #define VAL_STR_LEN 100 const char * geoip_db_lookup_ipv4(guint dbnum, guint32 addr, char *not_found) { @@ -221,6 +264,34 @@ geoip_db_lookup_ipv4(guint dbnum, guint32 addr, char *not_found) { ret = GeoIP_name_by_ipnum(gi, addr); break; + case WS_LAT_FAKE_EDITION: + { + float lat; + float lon; + char *c; + if(geoip_db_lookup_latlon(addr, &lat, &lon) == 0) { + g_snprintf(val, VAL_STR_LEN, "%f", lat); + c = strchr(val, ','); + if (c != NULL) *c = '.'; + ret = val; + } + } + break; + + case WS_LON_FAKE_EDITION: + { + float lat; + float lon; + char *c; + if(geoip_db_lookup_latlon(addr, &lat, &lon) == 0) { + g_snprintf(val, VAL_STR_LEN, "%f", lon); + c = strchr(val, ','); + if (c != NULL) *c = '.'; + ret = val; + } + } + break; + default: break; } |