- some indent stuff

- added support for MODULE_NOT64BIT status
This commit is contained in:
Pavol Marko 2004-04-29 17:16:28 +00:00
parent dd4bc05952
commit 4b517fe1ad

View File

@ -37,8 +37,8 @@ CList<CModule> g_modules;
CList<CScript,AMX*> g_loadedscripts; CList<CScript,AMX*> g_loadedscripts;
CModule *g_CurrentlyCalledModule = NULL; // The module we are in at the moment; NULL otherwise CModule *g_CurrentlyCalledModule = NULL; // The module we are in at the moment; NULL otherwise
// also NULL for non-amxx modules // also NULL for non-amxx modules
// This is needed so we know which module called a function // This is needed so we know which module called a function
ModuleCallReason g_ModuleCallReason; ModuleCallReason g_ModuleCallReason;
extern const char* no_function; // stupid work around extern const char* no_function; // stupid work around
@ -65,13 +65,13 @@ void report_error( int code, char* fmt, ... )
void print_srvconsole( char *fmt, ... ) void print_srvconsole( char *fmt, ... )
{ {
va_list argptr; va_list argptr;
char string[256]; char string[256];
va_start (argptr, fmt); va_start (argptr, fmt);
vsnprintf (string, 255, fmt,argptr); vsnprintf (string, 255, fmt,argptr);
string[255] = 0; string[255] = 0;
va_end (argptr); va_end (argptr);
SERVER_PRINT(string); SERVER_PRINT(string);
} }
void* alloc_amxmemory(void** p, int size) void* alloc_amxmemory(void** p, int size)
@ -88,97 +88,97 @@ void free_amxmemory(void **ptr)
int load_amxscript(AMX *amx, void **program, const char *filename, char error[64]){ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64]){
AMX_HEADER hdr; AMX_HEADER hdr;
int err; int err;
FILE *fp; FILE *fp;
memset(amx, 0, sizeof(*amx)); memset(amx, 0, sizeof(*amx));
*program = 0; *program = 0;
*error = 0; *error = 0;
if ( (fp = fopen( filename, "rb" )) == NULL) if ( (fp = fopen( filename, "rb" )) == NULL)
{ {
strcpy(error,"Plugin file open error"); strcpy(error,"Plugin file open error");
return (amx->error = AMX_ERR_NOTFOUND); return (amx->error = AMX_ERR_NOTFOUND);
} }
fread(&hdr, sizeof(hdr), 1, fp); fread(&hdr, sizeof(hdr), 1, fp);
amx_Align16(&hdr.magic); amx_Align16(&hdr.magic);
if (hdr.magic!=AMX_MAGIC) if (hdr.magic!=AMX_MAGIC)
{ {
strcpy(error,"Invalid plugin"); strcpy(error,"Invalid plugin");
return (amx->error = AMX_ERR_FORMAT); return (amx->error = AMX_ERR_FORMAT);
} }
amx_Align32((uint32_t *)&hdr.stp); amx_Align32((uint32_t *)&hdr.stp);
amx_Align32((uint32_t *)&hdr.size); amx_Align32((uint32_t *)&hdr.size);
if ( (*program = new unsigned char[ (int)hdr.stp ]) == 0 ) if ( (*program = new unsigned char[ (int)hdr.stp ]) == 0 )
//if ( (*program = malloc( (int)hdr.stp )) == 0 ) //if ( (*program = malloc( (int)hdr.stp )) == 0 )
{ {
strcpy(error,"Failed to allocate memory");
return (amx->error = AMX_ERR_MEMORY);
}
rewind(fp);
fread(*program, 1, (size_t)hdr.size, fp);
fclose(fp);
if ((err = amx_Init( amx, *program )) != AMX_ERR_NONE)
{
sprintf(error,"Load error %d (invalid file format or version)", err);
return (amx->error = AMX_ERR_INIT);
}
#ifdef JIT
void *np = new char[ amx->code_size ];
void *rt = new char[ amx->reloc_size ];
if ( !np || (!rt && amx->reloc_size > 0) )
{
delete[] np;
delete[] rt;
strcpy(error,"Failed to initialize plugin");
return (amx->error = AMX_ERR_INIT);
}
if (amx_InitJIT(amx, rt, np) == AMX_ERR_NONE)
{
//amx->base = (unsigned char FAR *)realloc( np, amx->code_size );
amx->base = new unsigned char[ amx->code_size ];
if ( amx->base )
memcpy( amx->base , np , amx->code_size );
delete[] np;
delete[] rt;
delete[] *program;
(*program) = amx->base;
if ( *program == 0 ){
strcpy(error,"Failed to allocate memory"); strcpy(error,"Failed to allocate memory");
return (amx->error = AMX_ERR_MEMORY); return (amx->error = AMX_ERR_MEMORY);
} }
}
else rewind(fp);
{ fread(*program, 1, (size_t)hdr.size, fp);
delete[] np; fclose(fp);
delete[] rt;
strcpy(error,"Failed to initialize plugin"); if ((err = amx_Init( amx, *program )) != AMX_ERR_NONE)
return (amx->error = AMX_ERR_INIT_JIT); {
} sprintf(error,"Load error %d (invalid file format or version)", err);
return (amx->error = AMX_ERR_INIT);
}
#ifdef JIT
void *np = new char[ amx->code_size ];
void *rt = new char[ amx->reloc_size ];
if ( !np || (!rt && amx->reloc_size > 0) )
{
delete[] np;
delete[] rt;
strcpy(error,"Failed to initialize plugin");
return (amx->error = AMX_ERR_INIT);
}
if (amx_InitJIT(amx, rt, np) == AMX_ERR_NONE)
{
//amx->base = (unsigned char FAR *)realloc( np, amx->code_size );
amx->base = new unsigned char[ amx->code_size ];
if ( amx->base )
memcpy( amx->base , np , amx->code_size );
delete[] np;
delete[] rt;
delete[] *program;
(*program) = amx->base;
if ( *program == 0 ){
strcpy(error,"Failed to allocate memory");
return (amx->error = AMX_ERR_MEMORY);
}
}
else
{
delete[] np;
delete[] rt;
strcpy(error,"Failed to initialize plugin");
return (amx->error = AMX_ERR_INIT_JIT);
}
#endif #endif
CScript* aa = new CScript(amx,*program,filename); CScript* aa = new CScript(amx,*program,filename);
if ( aa == 0 ) if ( aa == 0 )
{ {
strcpy(error,"Failed to allocate memory"); strcpy(error,"Failed to allocate memory");
return (amx->error = AMX_ERR_MEMORY); return (amx->error = AMX_ERR_MEMORY);
} }
g_loadedscripts.put( aa ); g_loadedscripts.put( aa );
return set_amxnatives(amx,error); return set_amxnatives(amx,error);
} }
int set_amxnatives(AMX* amx,char error[64]) int set_amxnatives(AMX* amx,char error[64])
@ -210,12 +210,12 @@ int set_amxnatives(AMX* amx,char error[64])
int unload_amxscript(AMX* amx, void** program) int unload_amxscript(AMX* amx, void** program)
{ {
CList<CScript,AMX*>::iterator a = g_loadedscripts.find( amx ); CList<CScript,AMX*>::iterator a = g_loadedscripts.find( amx );
if ( a ) a.remove(); if ( a ) a.remove();
delete[] *program; delete[] *program;
//free( *program ); //free( *program );
*program = 0; *program = 0;
return AMX_ERR_NONE; return AMX_ERR_NONE;
} }
@ -322,86 +322,88 @@ int add_amxnatives(module_info_s* info,AMX_NATIVE_INFO*natives)
++a; ++a;
} }
return AMX_ERR_NATIVE; return AMX_ERR_NATIVE;
} }
bool validFile(const char* file) bool validFile(const char* file)
{ {
const char* a = 0; const char* a = 0;
while(*file) while(*file)
if (*file++=='.') if (*file++=='.')
a = file; a = file;
#ifndef __linux__ #ifndef __linux__
return (a && !strcmp(a,"dll")); return (a && !strcmp(a,"dll"));
#else #else
return (a && !strcmp(a,"so")); return (a && !strcmp(a,"so"));
#endif #endif
} }
int loadModules(const char* filename) int loadModules(const char* filename)
{ {
File fp( build_pathname("%s",filename), "r" ); File fp( build_pathname("%s",filename), "r" );
if ( !fp ) if ( !fp )
{ {
AMXXLOG_Log( "[AMXX] Modules list not found (file \"%s\")",filename); AMXXLOG_Log( "[AMXX] Modules list not found (file \"%s\")",filename);
return 0; return 0;
} }
char line[256], moduleName[256]; char line[256], moduleName[256];
int loaded = 0; int loaded = 0;
while ( fp.getline( line , 255 ) ) while ( fp.getline( line , 255 ) )
{ {
*moduleName = 0; *moduleName = 0;
sscanf(line,"%s",moduleName); sscanf(line,"%s",moduleName);
if (!isalnum(*moduleName) || !validFile(moduleName) ) if (!isalnum(*moduleName) || !validFile(moduleName) )
continue; continue;
char* pathname = build_pathname("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxx/modules"), line); char* pathname = build_pathname("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxx/modules"), line);
CList<CModule>::iterator a = g_modules.find( pathname ); CList<CModule>::iterator a = g_modules.find( pathname );
if ( a ) continue; // already loaded if ( a ) continue; // already loaded
CModule* cc = new CModule( pathname ); CModule* cc = new CModule( pathname );
if ( cc == 0 ) return loaded; if ( cc == 0 ) return loaded;
cc->queryModule(); cc->queryModule();
switch( cc->getStatusValue() ) { switch( cc->getStatusValue() ) {
case MODULE_BADLOAD: case MODULE_BADLOAD:
report_error( 1 , "[AMXX] Module is not a valid library (file \"%s\")",pathname ); report_error( 1 , "[AMXX] Module is not a valid library (file \"%s\")",pathname );
break; break;
case MODULE_NOINFO: case MODULE_NOINFO:
report_error( 1 ,"[AMXX] Couldn't find info. about module (file \"%s\")",pathname ); report_error( 1 ,"[AMXX] Couldn't find info. about module (file \"%s\")",pathname );
break; break;
case MODULE_NOQUERY: case MODULE_NOQUERY:
report_error( 1 , "[AMXX] Couldn't find \"AMX_Query\" or \"AMXX_Query\" (file \"%s\")", pathname ); report_error( 1 , "[AMXX] Couldn't find \"AMX_Query\" or \"AMXX_Query\" (file \"%s\")", pathname );
break; break;
case MODULE_NOATTACH: case MODULE_NOATTACH:
report_error( 1 , "[AMXX] Couldn't find \"%s\" (file \"%s\")", cc->isAmxx() ? "AMXX_Attach" : "AMX_Attach", pathname ); report_error( 1 , "[AMXX] Couldn't find \"%s\" (file \"%s\")", cc->isAmxx() ? "AMXX_Attach" : "AMX_Attach", pathname );
break; break;
case MODULE_OLD: case MODULE_OLD:
report_error( 1 , "[AMXX] Module has a different interface version (file \"%s\")",pathname ); report_error( 1 , "[AMXX] Module has a different interface version (file \"%s\")",pathname );
break; break;
case MODULE_NEWER: case MODULE_NEWER:
report_error(1, "[AMXX] Module has a newer interface version (file \"%s\"). Please download a new amxmodx.", pathname); report_error(1, "[AMXX] Module has a newer interface version (file \"%s\"). Please download a new amxmodx.", pathname);
break; break;
case MODULE_INTERROR: case MODULE_INTERROR:
report_error(1, "[AMXX] Internal error during module load (file \"%s\")", pathname); report_error(1, "[AMXX] Internal error during module load (file \"%s\")", pathname);
break; break;
case MODULE_NOT64BIT:
report_error(1, "[AMXX] Module \"%s\" is not 64 bit compatible.", pathname);
break;
default: default:
++loaded; ++loaded;
} }
g_modules.put( cc );
}
g_modules.put( cc ); return loaded;
}
return loaded;
} }
void dettachModules() void dettachModules()
@ -465,57 +467,57 @@ void attachModules()
const char* strip_name( const char* a ) const char* strip_name( const char* a )
{ {
const char* ret = a; const char* ret = a;
while(*a){ while(*a){
if ( *a== '/' || *a=='\\' ){ if ( *a== '/' || *a=='\\' ){
ret = ++a; ret = ++a;
continue; continue;
} }
++a; ++a;
} }
return ret; return ret;
} }
void attachMetaModModules(PLUG_LOADTIME now, const char* filename) void attachMetaModModules(PLUG_LOADTIME now, const char* filename)
{ {
File fp( build_pathname("%s",filename), "r" ); File fp( build_pathname("%s",filename), "r" );
if ( !fp ) if ( !fp )
{ {
AMXXLOG_Log( "[AMXX] Modules list not found (file \"%s\")",filename); AMXXLOG_Log( "[AMXX] Modules list not found (file \"%s\")",filename);
return; return;
} }
char line[256], moduleName[256]; char line[256], moduleName[256];
DLHANDLE module; DLHANDLE module;
int loaded = 0; int loaded = 0;
while ( fp.getline( line , 255 ) ) while ( fp.getline( line , 255 ) )
{ {
*moduleName = 0; *moduleName = 0;
sscanf(line,"%s",moduleName); sscanf(line,"%s",moduleName);
if (!isalnum(*moduleName) || !validFile(moduleName) ) if (!isalnum(*moduleName) || !validFile(moduleName) )
continue; continue;
char* pathname = build_pathname("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxx/modules"), line); char* pathname = build_pathname("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxx/modules"), line);
char* mmpathname = build_pathname_addons("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxx/modules"), line); char* mmpathname = build_pathname_addons("%s/%s", get_localinfo("amxx_modulesdir", "addons/amxx/modules"), line);
module = DLLOAD( pathname ); // link dll module = DLLOAD( pathname ); // link dll
if ( module ) if ( module )
{
int a = (int)DLPROC(module,"Meta_Attach");
DLFREE(module);
if ( a )
{ {
g_FakeMeta.AddPlugin(mmpathname); int a = (int)DLPROC(module,"Meta_Attach");
g_FakeMeta.Meta_Query(gpMetaUtilFuncs); DLFREE(module);
g_FakeMeta.Meta_Attach(now, gpMetaGlobals, gpGamedllFuncs);
if ( a )
{
g_FakeMeta.AddPlugin(mmpathname);
g_FakeMeta.Meta_Query(gpMetaUtilFuncs);
g_FakeMeta.Meta_Attach(now, gpMetaGlobals, gpGamedllFuncs);
}
} }
} }
}
} }
@ -763,6 +765,16 @@ void MNF_HiddenStuff()
// :TODO: // :TODO:
} }
cell MNF_RealToCell(REAL x)
{
return *(cell*)&x;
}
REAL MNF_CellToReal(cell x)
{
return *(REAL*)&x;
}
// Fnptr Request function for the new interface // Fnptr Request function for the new interface
const char *g_LastRequestedFunc = NULL; const char *g_LastRequestedFunc = NULL;
#define REGISTER_FUNC(name, func) { name, (void*)func }, #define REGISTER_FUNC(name, func) { name, (void*)func },
@ -777,68 +789,70 @@ void *Module_ReqFnptr(const char *funcName)
static Func_s functions[] = { static Func_s functions[] = {
// Misc // Misc
REGISTER_FUNC("BuildPathname", build_pathname) REGISTER_FUNC("BuildPathname", build_pathname)
REGISTER_FUNC("PrintSrvConsole", print_srvconsole) REGISTER_FUNC("PrintSrvConsole", print_srvconsole)
REGISTER_FUNC("GetModname", MNF_GetModname) REGISTER_FUNC("GetModname", MNF_GetModname)
REGISTER_FUNC("Log", AMXXLOG_Log) REGISTER_FUNC("Log", AMXXLOG_Log)
// Amx scripts loading / unloading / managing // Amx scripts loading / unloading / managing
REGISTER_FUNC("GetAmxScript", MNF_GetAmxScript) REGISTER_FUNC("GetAmxScript", MNF_GetAmxScript)
REGISTER_FUNC("GetAmxScriptName", MNF_GetAmxScriptName) REGISTER_FUNC("GetAmxScriptName", MNF_GetAmxScriptName)
REGISTER_FUNC("FindAmxScriptByName", MNF_FindAmxScriptByName) REGISTER_FUNC("FindAmxScriptByName", MNF_FindAmxScriptByName)
REGISTER_FUNC("FindAmxScriptByAmx", MNF_FindAmxScriptByAmx) REGISTER_FUNC("FindAmxScriptByAmx", MNF_FindAmxScriptByAmx)
REGISTER_FUNC("LoadAmxScript", load_amxscript) REGISTER_FUNC("LoadAmxScript", load_amxscript)
REGISTER_FUNC("UnloadAmxScript", unload_amxscript) REGISTER_FUNC("UnloadAmxScript", unload_amxscript)
// String / mem in amx scripts support // String / mem in amx scripts support
REGISTER_FUNC("SetAmxString", set_amxstring) REGISTER_FUNC("SetAmxString", set_amxstring)
REGISTER_FUNC("GetAmxString", MNF_GetAmxString) REGISTER_FUNC("GetAmxString", MNF_GetAmxString)
REGISTER_FUNC("GetAmxStringLen", MNF_GetAmxStringLen) REGISTER_FUNC("GetAmxStringLen", MNF_GetAmxStringLen)
REGISTER_FUNC("FormatAmxString", MNF_FormatAmxString) REGISTER_FUNC("FormatAmxString", MNF_FormatAmxString)
REGISTER_FUNC("CopyAmxMemory", MNF_CopyAmxMemory) REGISTER_FUNC("CopyAmxMemory", MNF_CopyAmxMemory)
REGISTER_FUNC("GetAmxAddr", get_amxaddr) REGISTER_FUNC("GetAmxAddr", get_amxaddr)
// other amx stuff // other amx stuff
REGISTER_FUNC("amx_Exec", amx_Exec) REGISTER_FUNC("amx_Exec", amx_Exec)
REGISTER_FUNC("amx_Execv", amx_Execv) REGISTER_FUNC("amx_Execv", amx_Execv)
REGISTER_FUNC("amx_Allot", amx_Allot) REGISTER_FUNC("amx_Allot", amx_Allot)
REGISTER_FUNC("amx_FindPublic", amx_FindPublic) REGISTER_FUNC("amx_FindPublic", amx_FindPublic)
// Natives / Forwards // Natives / Forwards
REGISTER_FUNC("AddNatives", MNF_AddNatives) REGISTER_FUNC("AddNatives", MNF_AddNatives)
REGISTER_FUNC("RaiseAmxError", amx_RaiseError) REGISTER_FUNC("RaiseAmxError", amx_RaiseError)
REGISTER_FUNC("RegisterForward", registerForward) REGISTER_FUNC("RegisterForward", registerForward)
REGISTER_FUNC("ExecuteForward", executeForwards) REGISTER_FUNC("ExecuteForward", executeForwards)
REGISTER_FUNC("PrepareCellArray", prepareCellArray) REGISTER_FUNC("PrepareCellArray", prepareCellArray)
REGISTER_FUNC("PrepareCharArray", prepareCharArray) REGISTER_FUNC("PrepareCharArray", prepareCharArray)
// Player // Player
REGISTER_FUNC("IsPlayerValid", MNF_IsPlayerValid) REGISTER_FUNC("IsPlayerValid", MNF_IsPlayerValid)
REGISTER_FUNC("GetPlayerName", MNF_GetPlayerName) REGISTER_FUNC("GetPlayerName", MNF_GetPlayerName)
REGISTER_FUNC("GetPlayerIP", MNF_GetPlayerIP) REGISTER_FUNC("GetPlayerIP", MNF_GetPlayerIP)
REGISTER_FUNC("IsPlayerInGame", MNF_IsPlayerInGame) REGISTER_FUNC("IsPlayerInGame", MNF_IsPlayerInGame)
REGISTER_FUNC("IsPlayerBot", MNF_IsPlayerBot) REGISTER_FUNC("IsPlayerBot", MNF_IsPlayerBot)
REGISTER_FUNC("IsPlayerAuthorized", MNF_IsPlayerAuthorized) REGISTER_FUNC("IsPlayerAuthorized", MNF_IsPlayerAuthorized)
REGISTER_FUNC("GetPlayerTime", MNF_GetPlayerTime) REGISTER_FUNC("GetPlayerTime", MNF_GetPlayerTime)
REGISTER_FUNC("GetPlayerPlayTime", MNF_GetPlayerPlayTime) REGISTER_FUNC("GetPlayerPlayTime", MNF_GetPlayerPlayTime)
REGISTER_FUNC("GetPlayerCurweapon", MNF_GetPlayerCurweapon) REGISTER_FUNC("GetPlayerCurweapon", MNF_GetPlayerCurweapon)
REGISTER_FUNC("GetPlayerTeamID", MNF_GetPlayerTeamID) REGISTER_FUNC("GetPlayerTeamID", MNF_GetPlayerTeamID)
REGISTER_FUNC("GetPlayerDeaths", MNF_GetPlayerDeaths) REGISTER_FUNC("GetPlayerDeaths", MNF_GetPlayerDeaths)
REGISTER_FUNC("GetPlayerFrags", MNF_GetPlayerFrags) REGISTER_FUNC("GetPlayerFrags", MNF_GetPlayerFrags)
REGISTER_FUNC("GetPlayerMenu", MNF_GetPlayerMenu) REGISTER_FUNC("GetPlayerMenu", MNF_GetPlayerMenu)
REGISTER_FUNC("GetPlayerKeys", MNF_GetPlayerKeys) REGISTER_FUNC("GetPlayerKeys", MNF_GetPlayerKeys)
REGISTER_FUNC("IsPlayerAlive", MNF_IsPlayerAlive) REGISTER_FUNC("IsPlayerAlive", MNF_IsPlayerAlive)
REGISTER_FUNC("IsPlayerConnecting", MNF_IsPlayerConnecting) REGISTER_FUNC("IsPlayerConnecting", MNF_IsPlayerConnecting)
REGISTER_FUNC("IsPlayerHLTV", MNF_IsPlayerHLTV) REGISTER_FUNC("IsPlayerHLTV", MNF_IsPlayerHLTV)
REGISTER_FUNC("GetPlayerArmor", MNF_GetPlayerArmor) REGISTER_FUNC("GetPlayerArmor", MNF_GetPlayerArmor)
REGISTER_FUNC("GetPlayerHealth", MNF_GetPlayerHealth) REGISTER_FUNC("GetPlayerHealth", MNF_GetPlayerHealth)
REGISTER_FUNC("CellToReal", MNF_CellToReal)
REGISTER_FUNC("RealToCell", MNF_RealToCell)
#ifdef MEMORY_TEST #ifdef MEMORY_TEST
REGISTER_FUNC("Allocator", m_allocator) REGISTER_FUNC("Allocator", m_allocator)
REGISTER_FUNC("Deallocator", m_deallocator) REGISTER_FUNC("Deallocator", m_deallocator)
REGISTER_FUNC("Reallocator", m_reallocator) REGISTER_FUNC("Reallocator", m_reallocator)
#endif // MEMORY_TEST #endif // MEMORY_TEST
REGISTER_FUNC("Haha_HiddenStuff", MNF_HiddenStuff) REGISTER_FUNC("Haha_HiddenStuff", MNF_HiddenStuff)
}; };
// code // code