aboutsummaryrefslogtreecommitdiffstats
path: root/epan/geoip_db.c
diff options
context:
space:
mode:
authorUlf Lamping <ulf.lamping@web.de>2009-02-04 01:02:59 +0000
committerUlf Lamping <ulf.lamping@web.de>2009-02-04 01:02:59 +0000
commitd5d3e1fa9220a9e0da2fd4b5a428dd248d55672d (patch)
tree72a1b662da782f7f64a954a7cd19c80d5c9f8390 /epan/geoip_db.c
parent52c567e2b285f7f66b2e0e39964f4d1c1e2ebaba (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.c73
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;
}