extensions/geoip/extension.cpp
author David Anderson <dvander@alliedmods.net>
Thu Jan 25 20:34:27 2007 +0000 (2007-01-25)
changeset 355 bbe250abf402
parent 321 f8b0e8ecea14
child 373 bf3335acefdd
permissions -rw-r--r--
updated sdk
added linux support
faluco@316
     1
#include "extension.h"
faluco@316
     2
#include "GeoIP.h"
faluco@316
     3
faluco@316
     4
GeoIP_Extension g_GeoIP;
faluco@316
     5
GeoIP *gi = NULL;
faluco@316
     6
faluco@316
     7
SMEXT_LINK(&g_GeoIP);
faluco@316
     8
faluco@316
     9
bool GeoIP_Extension::SDK_OnLoad(char *error, size_t err_max, bool late)
faluco@316
    10
{
faluco@321
    11
	char path[PLATFORM_MAX_PATH+1];
faluco@321
    12
faluco@321
    13
	g_pSM->BuildPath(Path_SM, path, sizeof(path), "configs/geoip/GeoIP.dat");
faluco@316
    14
	gi = GeoIP_open(path, GEOIP_MEMORY_CACHE);
faluco@316
    15
faluco@316
    16
	if (!gi)
faluco@316
    17
	{
faluco@321
    18
		snprintf(error, err_max, "Failed to instantiate GeoIP!");
faluco@316
    19
		return false;
faluco@316
    20
	}
faluco@321
    21
faluco@321
    22
	g_pShareSys->AddNatives(myself, geoip_natives);
faluco@321
    23
	g_pSM->LogMessage(myself, "GeoIP database info: %s", GeoIP_database_info(gi));
faluco@321
    24
faluco@316
    25
	return true;
faluco@316
    26
}
faluco@316
    27
faluco@316
    28
void GeoIP_Extension::SDK_OnUnload()
faluco@316
    29
{
faluco@316
    30
	GeoIP_delete(gi);
faluco@316
    31
	gi = NULL;
faluco@316
    32
}
faluco@316
    33
faluco@316
    34
/*******************************
faluco@316
    35
*                              *
faluco@316
    36
* GEOIP NATIVE IMPLEMENTATIONS *
faluco@316
    37
*                              *
faluco@316
    38
*******************************/
faluco@316
    39
faluco@316
    40
inline void StripPort(char *ip)
faluco@316
    41
{
faluco@316
    42
	char *tmp = strchr(ip, ':');
faluco@316
    43
	if (!tmp)
faluco@316
    44
		return;
faluco@316
    45
	*tmp = '\0';
faluco@316
    46
}
faluco@316
    47
faluco@316
    48
static cell_t sm_Geoip_Code2(IPluginContext *pCtx, const cell_t *params)
faluco@316
    49
{
faluco@316
    50
	char *ip;
faluco@316
    51
	const char *ccode;
faluco@316
    52
faluco@316
    53
	pCtx->LocalToString(params[1], &ip);
faluco@316
    54
	StripPort(ip);
faluco@316
    55
faluco@316
    56
	ccode = GeoIP_country_code_by_addr(gi, ip);
faluco@316
    57
	pCtx->StringToLocal(params[2], 3, (ccode) ? ccode : "er");
faluco@316
    58
faluco@316
    59
	return 1;
faluco@316
    60
}
faluco@316
    61
faluco@316
    62
static cell_t sm_Geoip_Code3(IPluginContext *pCtx, const cell_t *params)
faluco@316
    63
{
faluco@316
    64
	char *ip;
faluco@316
    65
	const char *ccode;
faluco@316
    66
faluco@316
    67
	pCtx->LocalToString(params[1], &ip);
faluco@316
    68
	StripPort(ip);
faluco@316
    69
faluco@316
    70
	ccode = GeoIP_country_code3_by_addr(gi, ip);
faluco@316
    71
	pCtx->StringToLocal(params[2], 4, (ccode) ? ccode : "err");
faluco@316
    72
faluco@316
    73
	return 1;
faluco@316
    74
}
faluco@316
    75
faluco@316
    76
static cell_t sm_Geoip_Country(IPluginContext *pCtx, const cell_t *params)
faluco@316
    77
{
faluco@316
    78
	char *ip;
faluco@316
    79
	const char *ccode;
faluco@316
    80
faluco@316
    81
	pCtx->LocalToString(params[1], &ip);
faluco@316
    82
	StripPort(ip);
faluco@316
    83
faluco@316
    84
	ccode = GeoIP_country_name_by_addr(gi, ip);
faluco@316
    85
	pCtx->StringToLocal(params[2], params[3], (ccode) ? ccode : "error");
faluco@316
    86
faluco@316
    87
	return 1;
faluco@316
    88
}
faluco@321
    89
faluco@321
    90
const sp_nativeinfo_t geoip_natives[] = 
faluco@321
    91
{
faluco@321
    92
	{"GeoipCode2",			sm_Geoip_Code2},
faluco@321
    93
	{"GeoipCode3",			sm_Geoip_Code3},
faluco@321
    94
	{"GeoipCountry",		sm_Geoip_Country},
faluco@321
    95
	{NULL,					NULL},
dvander@355
    96
};
dvander@355
    97