/* Set continent data by geoid or record into the given `location` buffer * based on the IP version and currently used database edition. */ void geoip_get_continent (const char *ip, char *location, GTypeIP type_ip) { unsigned char rec = GeoIP_database_edition (geo_location_data); switch (rec) { case GEOIP_COUNTRY_EDITION: if (TYPE_IPV4 == type_ip) geoip_set_continent_by_geoid (ip, location, TYPE_IPV4); else geoip_set_continent (NULL, location); break; case GEOIP_COUNTRY_EDITION_V6: if (TYPE_IPV6 == type_ip) geoip_set_continent_by_geoid (ip, location, TYPE_IPV6); else geoip_set_continent (NULL, location); break; case GEOIP_CITY_EDITION_REV0: case GEOIP_CITY_EDITION_REV1: if (TYPE_IPV4 == type_ip) geoip_set_continent_by_record (ip, location, TYPE_IPV4); else geoip_set_continent (NULL, location); break; case GEOIP_CITY_EDITION_REV0_V6: case GEOIP_CITY_EDITION_REV1_V6: if (TYPE_IPV6 == type_ip) geoip_set_continent_by_record (ip, location, TYPE_IPV6); else geoip_set_continent (NULL, location); break; } }
/* Set continent data by geoid into the given `location` buffer based * on the IP version. */ static void geoip_set_continent_by_geoid (const char *ip, char *location, GTypeIP type_ip) { const char *continent = NULL, *addr = ip; int geoid = 0; if (geo_location_data == NULL) return; if (!(geoid = geoip_get_geoid (addr, type_ip))) goto out; continent = GeoIP_continent_by_id (geoid); out: geoip_set_continent (continent, location); }
/* Set continent data by record into the given `location` buffer based * on the IP version. */ static void geoip_set_continent_by_record (const char *ip, char *location, GTypeIP type_ip) { GeoIPRecord *rec = NULL; const char *continent = NULL, *addr = ip; if (conf.geoip_database == NULL || geo_location_data == NULL) return; /* Custom GeoIP database */ if ((rec = get_geoip_record (addr, type_ip))) continent = rec->continent_code; geoip_set_continent (continent, location); if (rec != NULL) { GeoIPRecord_delete (rec); } }
void geoip_get_continent (const char *ip, char *location) { GeoIPRecord *rec = NULL; const char *continent = NULL, *addr = ip; int geoid = 0; /* Custom GeoIP database */ if (conf.geoip_city_data != NULL && geo_location_data != NULL) { rec = GeoIP_record_by_name (geo_location_data, addr); if (rec) continent = rec->continent_code; } /* Legacy GeoIP database */ else if (geo_location_data != NULL) { geoid = GeoIP_id_by_name (geo_location_data, addr); continent = GeoIP_continent_by_id (geoid); } if (rec != NULL) GeoIPRecord_delete (rec); geoip_set_continent (continent, location); }