#ifdef __cplusplus extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include "GeoIP.h" #include "GeoIPCity.h" /* if we're built against a version of geoip-api-c that doesn't define this, * the flag should be harmless (as long as it doesn't clash with another * flag using the same bit position). */ #ifndef GEOIP_SILENCE #define GEOIP_SILENCE 16 #endif #ifdef __cplusplus } #endif MODULE = Geo::IP PACKAGE = Geo::IP PROTOTYPES: DISABLE const char * region_name_by_code(CLASS, country_code, region) char * CLASS char * country_code char * region CODE: RETVAL = (const char *) GeoIP_region_name_by_code(country_code, region); OUTPUT: RETVAL const char * continent_code_by_country_code(CLASS, country_code) char * CLASS char * country_code CODE: RETVAL = (const char *) GeoIP_country_continent[GeoIP_id_by_code(country_code)]; OUTPUT: RETVAL const char * time_zone(CLASS, country_code, region) char * CLASS char * country_code char * region CODE: RETVAL = (const char *) GeoIP_time_zone_by_country_and_region(country_code, region); OUTPUT: RETVAL GeoIP * new(CLASS,flags = 0) char * CLASS int flags PREINIT: GeoIP * gi; CODE: gi = GeoIP_new(flags | GEOIP_SILENCE); if ( gi ) GeoIP_set_charset(gi, GEOIP_CHARSET_ISO_8859_1); RETVAL = gi; OUTPUT: RETVAL GeoIP * open_type(CLASS,type,flags = 0) char * CLASS int type int flags PREINIT: GeoIP * gi; CODE: gi = GeoIP_open_type(type, flags | GEOIP_SILENCE); if ( gi ) GeoIP_set_charset(gi, GEOIP_CHARSET_ISO_8859_1); RETVAL = gi; OUTPUT: RETVAL GeoIP * open(CLASS,filename,flags = 0) char * CLASS char * filename int flags PREINIT: GeoIP * gi; CODE: gi = ( filename != NULL ) ? GeoIP_open(filename, flags | GEOIP_SILENCE) : NULL; if ( gi ) GeoIP_set_charset(gi, GEOIP_CHARSET_ISO_8859_1); RETVAL = gi; OUTPUT: RETVAL int id_by_addr(gi, addr) GeoIP *gi char * addr CODE: RETVAL = GeoIP_id_by_addr(gi,addr); OUTPUT: RETVAL int id_by_name(gi, name) GeoIP *gi char * name CODE: RETVAL = GeoIP_id_by_name(gi,name); OUTPUT: RETVAL int database_edition (gi) GeoIP *gi CODE: RETVAL = GeoIP_database_edition(gi); OUTPUT: RETVAL char * database_info (gi) GeoIP *gi CODE: RETVAL = GeoIP_database_info(gi); OUTPUT: RETVAL const char * country_code_by_ipnum_v6(gi, ptr) GeoIP *gi char *ptr CODE: RETVAL = GeoIP_country_code_by_ipnum_v6(gi,*(geoipv6_t*)ptr); OUTPUT: RETVAL const char * country_code_by_addr_v6(gi, addr) GeoIP *gi char * addr CODE: RETVAL = GeoIP_country_code_by_addr_v6(gi,addr); OUTPUT: RETVAL const char * country_code_by_name_v6(gi, name) GeoIP *gi char * name CODE: RETVAL = GeoIP_country_code_by_name_v6(gi,name); OUTPUT: RETVAL const char * country_code3_by_ipnum_v6(gi, ptr) GeoIP *gi char *ptr CODE: RETVAL = GeoIP_country_code3_by_ipnum_v6(gi,*(geoipv6_t*)ptr); OUTPUT: RETVAL const char * country_code3_by_addr_v6(gi, addr) GeoIP *gi char * addr CODE: RETVAL = GeoIP_country_code3_by_addr_v6(gi,addr); OUTPUT: RETVAL const char * country_code3_by_name_v6(gi, name) GeoIP *gi char * name CODE: RETVAL = GeoIP_country_code3_by_name_v6(gi,name); OUTPUT: RETVAL const char * country_name_by_name_v6(gi, name) GeoIP *gi char * name CODE: RETVAL = GeoIP_country_name_by_name_v6(gi,name); OUTPUT: RETVAL const char * country_name_by_ipnum_v6(gi, ptr) GeoIP *gi char *ptr CODE: RETVAL = GeoIP_country_name_by_ipnum_v6(gi,*(geoipv6_t*)ptr); OUTPUT: RETVAL const char * country_name_by_addr_v6(gi, addr) GeoIP *gi char * addr CODE: RETVAL = GeoIP_country_name_by_addr_v6(gi,addr); OUTPUT: RETVAL const char * country_code_by_addr(gi, addr) GeoIP *gi char * addr CODE: RETVAL = GeoIP_country_code_by_addr(gi,addr); OUTPUT: RETVAL const char * country_code_by_name(gi, name) GeoIP *gi char * name CODE: RETVAL = GeoIP_country_code_by_name(gi,name); OUTPUT: RETVAL const char * country_code3_by_addr(gi, addr) GeoIP *gi char * addr CODE: RETVAL = GeoIP_country_code3_by_addr(gi,addr); OUTPUT: RETVAL const char * country_code3_by_name(gi, name) GeoIP *gi char * name CODE: RETVAL = GeoIP_country_code3_by_name(gi,name); OUTPUT: RETVAL const char * country_name_by_addr(gi, addr) GeoIP *gi char * addr CODE: RETVAL = GeoIP_country_name_by_addr(gi,addr); OUTPUT: RETVAL const char * country_name_by_name(gi, name) GeoIP *gi char * name CODE: RETVAL = GeoIP_country_name_by_name(gi,name); OUTPUT: RETVAL void name_by_ipnum_v6(gi, ptr) GeoIP *gi char * ptr PREINIT: char * n; PPCODE: ST(0) = sv_newmortal(); n = GeoIP_name_by_ipnum_v6(gi,*(geoipv6_t*)ptr); if ( n != NULL ) { ST(0) = newSVpv(n, strlen(n)); free(n); #if defined(sv_utf8_decode) if ( GeoIP_charset(gi) == GEOIP_CHARSET_UTF8 ) SvUTF8_on(ST(0)); #endif sv_2mortal(ST(0)); } XSRETURN(1); void name_by_addr_v6(gi, addr) GeoIP *gi char * addr PREINIT: char * n; PPCODE: ST(0) = sv_newmortal(); n = GeoIP_name_by_addr_v6(gi,addr); if ( n != NULL ) { ST(0) = newSVpv(n, strlen(n)); free(n); #if defined(sv_utf8_decode) if ( GeoIP_charset(gi) == GEOIP_CHARSET_UTF8 ) SvUTF8_on(ST(0)); #endif sv_2mortal(ST(0)); } XSRETURN(1); void name_by_name_v6(gi, name) GeoIP *gi char * name PREINIT: char * n; PPCODE: ST(0) = sv_newmortal(); n = GeoIP_name_by_name_v6(gi,name); if ( n != NULL ) { ST(0) = newSVpv(n, strlen(n)); free(n); #if defined(sv_utf8_decode) if ( GeoIP_charset(gi) == GEOIP_CHARSET_UTF8 ) SvUTF8_on(ST(0)); #endif sv_2mortal(ST(0)); } XSRETURN(1); void org_by_addr(gi, addr) GeoIP *gi char * addr PREINIT: char * n; PPCODE: ST(0) = sv_newmortal(); n = GeoIP_org_by_addr(gi,addr); if ( n != NULL ) { ST(0) = newSVpv(n, strlen(n)); free(n); #if defined(sv_utf8_decode) if ( GeoIP_charset(gi) == GEOIP_CHARSET_UTF8 ) SvUTF8_on(ST(0)); #endif sv_2mortal(ST(0)); } XSRETURN(1); void org_by_name(gi, name) GeoIP *gi char * name PREINIT: char * n; PPCODE: ST(0) = sv_newmortal(); n = GeoIP_org_by_name(gi,name); if ( n != NULL ) { ST(0) = newSVpv(n, strlen(n)); free(n); #if defined(sv_utf8_decode) if ( GeoIP_charset(gi) == GEOIP_CHARSET_UTF8 ) SvUTF8_on(ST(0)); #endif sv_2mortal(ST(0)); } XSRETURN(1); void range_by_ip(gi, addr) GeoIP *gi const char * addr PREINIT: char ** r; PPCODE: r = GeoIP_range_by_ip(gi,addr); if (r != NULL){ EXTEND(SP,2); PUSHs( sv_2mortal( newSVpv(r[0], 0) ) ); PUSHs( sv_2mortal( newSVpv(r[1], 0) ) ); if ( r[0] ) free(r[0]); if ( r[1] ) free(r[1]); free(r); } void region_by_addr(gi, addr) GeoIP *gi char * addr PREINIT: GeoIPRegion * gir; PPCODE: gir = GeoIP_region_by_addr(gi,addr); if (gir){ EXTEND(SP,2); ( gir->country_code[0] == '\0' && gir->country_code[1] == '\0' ) ? PUSHs ( sv_newmortal() ) : PUSHs ( sv_2mortal( newSVpv(gir->country_code, 2) ) ); ( gir->region[0] == '\0' && gir->region[1] == '\0' ) ? PUSHs ( sv_newmortal() ) : PUSHs( sv_2mortal( newSVpv(gir->region, 2) ) ); GeoIPRegion_delete(gir); } void region_by_name(gi, name) GeoIP *gi char * name PREINIT: GeoIPRegion * gir; PPCODE: gir = GeoIP_region_by_name(gi,name); if (gir){ EXTEND(SP,2); ( gir->country_code[0] == '\0' && gir->country_code[1] == '\0' ) ? PUSHs ( sv_newmortal() ) : PUSHs ( sv_2mortal( newSVpv(gir->country_code, 2) ) ); ( gir->region[0] == '\0' && gir->region[1] == '\0' ) ? PUSHs ( sv_newmortal() ) : PUSHs( sv_2mortal( newSVpv(gir->region, 2) ) ); GeoIPRegion_delete(gir); } GeoIPRecord * record_by_ipnum_v6(gi, ipnum) GeoIP *gi char * ipnum PREINIT: char * CLASS = "Geo::IP::Record"; CODE: RETVAL = GeoIP_record_by_ipnum_v6(gi,*(geoipv6_t*)ipnum); OUTPUT: RETVAL GeoIPRecord * record_by_addr_v6(gi, addr) GeoIP *gi char * addr PREINIT: char * CLASS = "Geo::IP::Record"; CODE: RETVAL = GeoIP_record_by_addr_v6(gi,addr); OUTPUT: RETVAL GeoIPRecord * record_by_name_v6(gi, addr) GeoIP *gi char * addr PREINIT: char * CLASS = "Geo::IP::Record"; CODE: RETVAL = GeoIP_record_by_name_v6(gi,addr); OUTPUT: RETVAL GeoIPRecord * record_by_addr(gi, addr) GeoIP *gi char * addr PREINIT: char * CLASS = "Geo::IP::Record"; CODE: RETVAL = GeoIP_record_by_addr(gi,addr); OUTPUT: RETVAL GeoIPRecord * record_by_name(gi, addr) GeoIP *gi char * addr PREINIT: char * CLASS = "Geo::IP::Record"; CODE: RETVAL = GeoIP_record_by_name(gi,addr); OUTPUT: RETVAL int enable_teredo(gi, tf) GeoIP *gi int tf CODE: RETVAL = GeoIP_enable_teredo(gi, tf); OUTPUT: RETVAL int teredo(gi) GeoIP *gi CODE: RETVAL = GeoIP_teredo(gi); OUTPUT: RETVAL int set_charset(gi, charset) GeoIP *gi int charset CODE: RETVAL = GeoIP_set_charset(gi, charset); OUTPUT: RETVAL const char * lib_version(CLASS) char * CLASS CODE: RETVAL = GeoIP_lib_version(); OUTPUT: RETVAL int charset(gi) GeoIP *gi CODE: RETVAL = GeoIP_charset(gi); OUTPUT: RETVAL int last_netmask(gi) GeoIP *gi CODE: RETVAL = GeoIP_last_netmask(gi); OUTPUT: RETVAL void DESTROY(gi) GeoIP *gi CODE: GeoIP_delete(gi); MODULE = Geo::IP PACKAGE = Geo::IP::Record const char * country_code(gir) GeoIPRecord *gir CODE: RETVAL = (const char *)gir->country_code; OUTPUT: RETVAL const char * country_code3(gir) GeoIPRecord *gir CODE: RETVAL = (const char *)gir->country_code3; OUTPUT: RETVAL const char * country_name(gir) GeoIPRecord *gir CODE: RETVAL = (const char *)gir->country_name; OUTPUT: RETVAL const char * region(gir) GeoIPRecord *gir CODE: RETVAL = (const char *)gir->region; OUTPUT: RETVAL const char * region_name(gir) GeoIPRecord *gir CODE: RETVAL = (const char *) GeoIP_region_name_by_code(gir->country_code, gir->region); OUTPUT: RETVAL const char * time_zone(gir) GeoIPRecord *gir CODE: RETVAL = (const char *) GeoIP_time_zone_by_country_and_region(gir->country_code, gir->region); OUTPUT: RETVAL void city(gir) GeoIPRecord *gir PREINIT: SV * n; PPCODE: n = newSVpv( gir->city ? gir->city : "", 0); #if defined(sv_utf8_decode) if ( gir->charset == GEOIP_CHARSET_UTF8 ) SvUTF8_on(n); #endif sv_2mortal(n); ST(0) = n; XSRETURN(1); const char * postal_code(gir) GeoIPRecord *gir CODE: RETVAL = (const char *)gir->postal_code; OUTPUT: RETVAL float _latitude(gir) GeoIPRecord *gir CODE: RETVAL = gir->latitude; OUTPUT: RETVAL float _longitude(gir) GeoIPRecord *gir CODE: RETVAL = gir->longitude; OUTPUT: RETVAL int dma_code(gir) GeoIPRecord *gir CODE: RETVAL = gir->dma_code; OUTPUT: RETVAL int metro_code(gir) GeoIPRecord *gir CODE: RETVAL = gir->dma_code; /* we can NOT use metro_code here. metro_code may be not present in older CAPI's */ OUTPUT: RETVAL int area_code(gir) GeoIPRecord *gir CODE: RETVAL = gir->area_code; OUTPUT: RETVAL const char * continent_code(gir) GeoIPRecord *gir CODE: RETVAL = (const char *)gir->continent_code; OUTPUT: RETVAL void DESTROY(gir) GeoIPRecord *gir CODE: GeoIPRecord_delete(gir); void _XScompiled () CODE: XSRETURN_YES;