void geo_ipv4_lookup(struct in_addr ip, char **country, char **city, char **coord) { GeoIP *gi; GeoIPRecord *gir; int country_id; const char *p; if (geo_setup() != 0) return; ip.s_addr = ntohl(ip.s_addr); gi = pGeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD | GEOIP_SILENCE); if (gi != NULL) { gi->charset = GEOIP_CHARSET_UTF8; country_id = pGeoIP_id_by_ipnum(gi, ip.s_addr); if (country_id < 0) { return; } p = pGeoIP_country_name_by_id(gi, country_id); if (p) *country = strdup(p); pGeoIP_delete(gi); } gi = pGeoIP_open_type(GEOIP_CITY_EDITION_REV1, GEOIP_STANDARD | GEOIP_SILENCE); if (gi != NULL) { gi->charset = GEOIP_CHARSET_UTF8; gir = pGeoIP_record_by_ipnum(gi, ip.s_addr); if (gir && gir->city) *city = strdup(gir->city); if (gir && gir->longitude != 0 && gir->longitude != 0) asprintf(coord, "%f,%f", gir->latitude, gir->longitude); pGeoIP_delete(gi); } else { gi = pGeoIP_open_type(GEOIP_CITY_EDITION_REV0, GEOIP_STANDARD | GEOIP_SILENCE); if (gi != NULL) { gi->charset = GEOIP_CHARSET_UTF8; gir = pGeoIP_record_by_ipnum(gi, ip.s_addr); if (gir && gir->city) *city = strdup(gir->city); if (gir && gir->longitude != 0 && gir->longitude != 0) asprintf(coord, "%f,%f", gir->latitude, gir->longitude); pGeoIP_delete(gi); } } return; }
void geo_ipv6_lookup(struct in6_addr *ip, char **country, char **ccode, char **city, char **coord) { GeoIP *gi; GeoIPRecord *gir; int country_id; const char *p; if (geo_setup() != 0) return; p_GeoIP_setup_dbfilename(); gi = pGeoIP_open_type(GEOIP_COUNTRY_EDITION_V6, GEOIP_STANDARD | GEOIP_SILENCE); if (gi != NULL) { gi->charset = GEOIP_CHARSET_UTF8; country_id = pGeoIP_id_by_ipnum_v6(gi, (geoipv6_t)*ip); if (country_id < 0) { return; } p = pGeoIP_country_name_by_id(gi, country_id); if (p) *country = strdup(p); p = pGeoIP_code_by_id(country_id); if (p) *ccode = strdup(p); pGeoIP_delete(gi); } gi = pGeoIP_open_type(GEOIP_CITY_EDITION_REV1_V6, GEOIP_STANDARD | GEOIP_SILENCE); if (gi != NULL) { gi->charset = GEOIP_CHARSET_UTF8; gir = pGeoIP_record_by_ipnum_v6(gi, (geoipv6_t)*ip); if (gir && gir->city) *city = strdup(gir->city); if (gir && gir->longitude != 0 && gir->longitude != 0) asprintf(coord, "%f,%f", gir->latitude, gir->longitude); pGeoIP_delete(gi); } else { gi = pGeoIP_open_type(GEOIP_CITY_EDITION_REV0_V6, GEOIP_STANDARD | GEOIP_SILENCE); if (gi != NULL) { gi->charset = GEOIP_CHARSET_UTF8; gir = pGeoIP_record_by_ipnum_v6(gi, (geoipv6_t)*ip); if (gir && gir->city) *city = strdup(gir->city); if (gir && gir->longitude != 0 && gir->longitude != 0) asprintf(coord, "%f,%f", gir->latitude, gir->longitude); pGeoIP_delete(gi); } } return; }