dvander@560: /**
ds@653: * vim: set ts=4 :
ds@1330: * =============================================================================
dvander@1231: * SourceMod
ds@1947: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
ds@1330: * =============================================================================
dvander@560: *
ds@1330: * This program is free software; you can redistribute it and/or modify it under
ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330: * Free Software Foundation.
dvander@1231: *
ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
ds@1330: * details.
dvander@1231: *
ds@1330: * You should have received a copy of the GNU General Public License along with
ds@1330: * this program. If not, see .
dvander@1231: *
ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in
ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants
ds@1330: * this exception to all derivative works. AlliedModders LLC defines further
ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330: * or .
dvander@560: *
dvander@560: * Version: $Id$
dvander@560: */
dvander@560:
dvander@595: #include
dvander@978: #include
dvander@1333: #include
dvander@978: #include "sm_stringutil.h"
dvander@560: #include "sm_globals.h"
dvander@560: #include "sourcemod.h"
dvander@618: #include "PluginSys.h"
dvander@618: #include "HandleSys.h"
dvander@978: #include "LibrarySys.h"
dvander@1371: #include "TimerSys.h"
dvander@1378: #include "ForwardSys.h"
dvander@1378: #include "Logger.h"
dvander@1419: #include "ExtensionSys.h"
dvander@618:
dvander@886: #if defined PLATFORM_WINDOWS
dvander@886: #include
dvander@886: #elif defined PLATFORM_LINUX
dvander@886: #include
dvander@886: #include
dvander@886: #include
dvander@886: #endif
dvander@886:
dvander@618: HandleType_t g_PlIter;
faluco@1359: ConVar sm_datetime_format("sm_datetime_format", "%m/%d/%Y - %H:%M:%S", 0, "Default formatting time rules");
dvander@1378: IForward *g_OnLogAction = NULL;
dvander@618:
dvander@618: class CoreNativeHelpers :
dvander@618: public SMGlobalClass,
dvander@618: public IHandleTypeDispatch
dvander@618: {
dvander@618: public:
dvander@618: void OnSourceModAllInitialized()
dvander@618: {
dvander@618: HandleAccess hacc;
dvander@618: g_HandleSys.InitAccessDefaults(NULL, &hacc);
dvander@618: hacc.access[HandleAccess_Clone] = HANDLE_RESTRICT_IDENTITY|HANDLE_RESTRICT_OWNER;
dvander@618:
dvander@618: g_PlIter = g_HandleSys.CreateType("PluginIterator", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@1378:
dvander@1378: g_OnLogAction = g_Forwards.CreateForward("OnLogAction",
dvander@1378: ET_Hook,
dvander@1378: 5,
dvander@1378: NULL,
dvander@1378: Param_Cell,
dvander@1378: Param_Cell,
dvander@1378: Param_Cell,
dvander@1378: Param_Cell,
dvander@1378: Param_String);
dvander@618: }
dvander@618: void OnHandleDestroy(HandleType_t type, void *object)
dvander@618: {
dvander@618: IPluginIterator *iter = (IPluginIterator *)object;
dvander@618: iter->Release();
dvander@618: }
dvander@618: void OnSourceModShutdown()
dvander@618: {
dvander@1378: g_Forwards.ReleaseForward(g_OnLogAction);
dvander@618: g_HandleSys.RemoveType(g_PlIter, g_pCoreIdent);
dvander@618: }
dvander@618: } g_CoreNativeHelpers;
dvander@618:
dvander@1378: void LogAction(Handle_t hndl, int type, int client, int target, const char *message)
dvander@1378: {
dvander@1458: if (g_OnLogAction->GetFunctionCount())
dvander@1378: {
dvander@1458: cell_t result = 0;
dvander@1458: g_OnLogAction->PushCell(hndl);
dvander@1458: g_OnLogAction->PushCell(type);
dvander@1458: g_OnLogAction->PushCell(client);
dvander@1458: g_OnLogAction->PushCell(target);
dvander@1458: g_OnLogAction->PushString(message);
dvander@1458: g_OnLogAction->Execute(&result);
dvander@1378:
dvander@1458: if (result >= (ResultType)Pl_Handled)
dvander@1458: {
dvander@1458: return;
dvander@1458: }
dvander@1378: }
dvander@1378:
dvander@1378: const char *logtag = "SM";
dvander@1378: if (type == 2)
dvander@1378: {
dvander@1378: HandleError err;
dvander@1378: IPlugin *pPlugin = g_PluginSys.PluginFromHandle(hndl, &err);
dvander@1378: if (pPlugin)
dvander@1378: {
dvander@1378: logtag = pPlugin->GetFilename();
dvander@1378: }
dvander@1378: }
dvander@1378:
dvander@1378: g_Logger.LogMessage("[%s] %s", logtag, message);
dvander@1378: }
dvander@560:
dvander@560: static cell_t ThrowError(IPluginContext *pContext, const cell_t *params)
dvander@560: {
dvander@560: char buffer[512];
dvander@560:
dvander@2042: g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
dvander@1011:
dvander@560: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
dvander@560:
dvander@2193: if (pContext->GetLastNativeError() == SP_ERROR_NONE)
dvander@560: {
dvander@560: pContext->ThrowNativeErrorEx(SP_ERROR_ABORTED, "%s", buffer);
dvander@560: }
dvander@560:
dvander@560: return 0;
dvander@560: }
dvander@560:
dvander@595: static cell_t GetTime(IPluginContext *pContext, const cell_t *params)
dvander@595: {
dvander@1371: time_t t = GetAdjustedTime();
dvander@595: cell_t *addr;
dvander@595: pContext->LocalToPhysAddr(params[1], &addr);
dvander@595:
dvander@595: *(time_t *)addr = t;
dvander@595:
dvander@595: return static_cast(t);
dvander@595: }
dvander@595:
dvander@1333: #if defined SUBPLATFORM_SECURECRT
dvander@1333: void _ignore_invalid_parameter(
dvander@1333: const wchar_t * expression,
dvander@1333: const wchar_t * function,
dvander@1333: const wchar_t * file,
dvander@1333: unsigned int line,
dvander@1333: uintptr_t pReserved
dvander@1333: )
dvander@1333: {
dvander@1333: /* Wow we don't care, thanks Microsoft. */
dvander@1333: }
dvander@1333: #endif
dvander@1333:
faluco@1037: static cell_t FormatTime(IPluginContext *pContext, const cell_t *params)
faluco@1037: {
faluco@1037: char *format, *buffer;
faluco@1037: pContext->LocalToString(params[1], &buffer);
faluco@1359: pContext->LocalToStringNULL(params[3], &format);
faluco@1359:
faluco@1359: if (format == NULL)
faluco@1359: {
faluco@1359: format = const_cast(sm_datetime_format.GetString());
faluco@1359: }
faluco@1037:
dvander@1333: #if defined SUBPLATFORM_SECURECRT
dvander@1333: _invalid_parameter_handler handler = _set_invalid_parameter_handler(_ignore_invalid_parameter);
dvander@1333: #endif
dvander@1333:
dvander@1371: time_t t = (params[4] == -1) ? GetAdjustedTime() : (time_t)params[4];
dvander@1333: size_t written = strftime(buffer, params[2], format, localtime(&t));
dvander@1333:
dvander@1333: #if defined SUBPLATFORM_SECURECRT
dvander@1333: _set_invalid_parameter_handler(handler);
dvander@1333: #endif
dvander@1333:
dvander@1333: if (params[2] && format[0] != '\0' && !written)
dvander@1333: {
dvander@1333: pContext->ThrowNativeError("Invalid time format or buffer too small");
dvander@1333: return 0;
dvander@1333: }
faluco@1037:
faluco@1037: return 1;
faluco@1037: }
faluco@1037:
dvander@618: static cell_t GetPluginIterator(IPluginContext *pContext, const cell_t *params)
dvander@618: {
dvander@618: IPluginIterator *iter = g_PluginSys.GetPluginIterator();
dvander@618:
dvander@618: Handle_t hndl = g_HandleSys.CreateHandle(g_PlIter, iter, pContext->GetIdentity(), g_pCoreIdent, NULL);
dvander@618:
dvander@618: if (hndl == BAD_HANDLE)
dvander@618: {
dvander@618: iter->Release();
dvander@618: }
dvander@618:
dvander@618: return hndl;
dvander@618: }
dvander@618:
dvander@618: static cell_t MorePlugins(IPluginContext *pContext, const cell_t *params)
dvander@618: {
dvander@618: Handle_t hndl = (Handle_t)params[1];
dvander@618: HandleError err;
dvander@618: IPluginIterator *pIter;
dvander@618:
dvander@618: HandleSecurity sec;
dvander@618: sec.pIdentity = g_pCoreIdent;
dvander@618: sec.pOwner = pContext->GetIdentity();
dvander@618:
dvander@618: if ((err=g_HandleSys.ReadHandle(hndl, g_PlIter, &sec, (void **)&pIter)) != HandleError_None)
dvander@618: {
dvander@618: return pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err);
dvander@618: }
dvander@618:
dvander@618: return pIter->MorePlugins() ? 1 : 0;
dvander@618: }
dvander@618:
dvander@618: static cell_t ReadPlugin(IPluginContext *pContext, const cell_t *params)
dvander@618: {
dvander@618: Handle_t hndl = (Handle_t)params[1];
dvander@618: HandleError err;
dvander@618: IPluginIterator *pIter;
dvander@618:
dvander@618: HandleSecurity sec;
dvander@618: sec.pIdentity = g_pCoreIdent;
dvander@618: sec.pOwner = pContext->GetIdentity();
dvander@618:
dvander@618: if ((err=g_HandleSys.ReadHandle(hndl, g_PlIter, &sec, (void **)&pIter)) != HandleError_None)
dvander@618: {
dvander@618: return pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err);
dvander@618: }
dvander@618:
dvander@618: CPlugin *pPlugin = (CPlugin *)pIter->GetPlugin();
dvander@618: if (!pPlugin)
dvander@618: {
dvander@618: return BAD_HANDLE;
dvander@618: }
dvander@618:
dvander@618: pIter->NextPlugin();
dvander@618:
dvander@618: return pPlugin->GetMyHandle();
dvander@618: }
dvander@618:
dvander@618: CPlugin *GetPluginFromHandle(IPluginContext *pContext, Handle_t hndl)
dvander@618: {
dvander@618: if (hndl == BAD_HANDLE)
dvander@618: {
dvander@618: return g_PluginSys.GetPluginByCtx(pContext->GetContext());
dvander@618: } else {
dvander@618: HandleError err;
dvander@618: CPlugin *pPlugin = (CPlugin *)g_PluginSys.PluginFromHandle(hndl, &err);
dvander@618: if (!pPlugin)
dvander@618: {
dvander@618: pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err);
dvander@618: }
dvander@618: return pPlugin;
dvander@618: }
dvander@618: }
dvander@618:
dvander@618: static cell_t GetPluginStatus(IPluginContext *pContext, const cell_t *params)
dvander@618: {
dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]);
dvander@618: if (!pPlugin)
dvander@618: {
dvander@618: return 0;
dvander@618: }
dvander@618:
dvander@618: return pPlugin->GetStatus();
dvander@618: }
dvander@618:
dvander@618: static cell_t GetPluginFilename(IPluginContext *pContext, const cell_t *params)
dvander@618: {
dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]);
dvander@618: if (!pPlugin)
dvander@618: {
dvander@618: return 0;
dvander@618: }
dvander@618:
dvander@618: pContext->StringToLocalUTF8(params[2], params[3], pPlugin->GetFilename(), NULL);
dvander@618:
dvander@618: return 1;
dvander@618: }
dvander@618:
dvander@618: static cell_t IsPluginDebugging(IPluginContext *pContext, const cell_t *params)
dvander@618: {
dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]);
dvander@618: if (!pPlugin)
dvander@618: {
dvander@618: return 0;
dvander@618: }
dvander@618:
dvander@618: return pPlugin->IsDebugging() ? 1 : 0;
dvander@618: }
dvander@618:
dvander@618: /* Local to plugins only */
dvander@618: enum PluginInfo
dvander@618: {
dvander@618: PlInfo_Name, /**< Plugin name */
dvander@618: PlInfo_Author, /**< Plugin author */
dvander@618: PlInfo_Description, /**< Plugin description */
dvander@618: PlInfo_Version, /**< Plugin verison */
dvander@618: PlInfo_URL, /**< Plugin URL */
dvander@618: };
dvander@618:
dvander@618: static cell_t GetPluginInfo(IPluginContext *pContext, const cell_t *params)
dvander@618: {
dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]);
dvander@618: if (!pPlugin)
dvander@618: {
dvander@618: return 0;
dvander@618: }
dvander@618:
dvander@618: const sm_plugininfo_t *info = pPlugin->GetPublicInfo();
dvander@618:
dvander@618: if (!info)
dvander@618: {
dvander@618: return 0;
dvander@618: }
dvander@618:
dvander@618: const char *str = NULL;
dvander@618:
dvander@618: switch ((PluginInfo)params[2])
dvander@618: {
dvander@618: case PlInfo_Name:
dvander@618: {
dvander@618: str = info->name;
dvander@618: break;
dvander@618: }
dvander@618: case PlInfo_Author:
dvander@618: {
dvander@618: str = info->author;
dvander@618: break;
dvander@618: }
dvander@618: case PlInfo_Description:
dvander@618: {
dvander@618: str = info->description;
dvander@618: break;
dvander@618: }
dvander@618: case PlInfo_Version:
dvander@618: {
dvander@618: str = info->version;
dvander@618: break;
dvander@618: }
dvander@618: case PlInfo_URL:
dvander@618: {
dvander@618: str = info->url;
dvander@618: break;
dvander@618: }
dvander@618: }
dvander@618:
dvander@618: if (!str || str[0] == '\0')
dvander@618: {
dvander@618: return 0;
dvander@618: }
dvander@618:
dvander@618: pContext->StringToLocalUTF8(params[3], params[4], str, NULL);
dvander@618:
dvander@618: return 1;
dvander@618: }
dvander@618:
dvander@837: static cell_t SetFailState(IPluginContext *pContext, const cell_t *params)
dvander@837: {
dvander@837: char *str;
dvander@1833: CPlugin *pPlugin;
dvander@1833:
dvander@837: pContext->LocalToString(params[1], &str);
dvander@1833: pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext());
dvander@1833:
dvander@1833: if (params[0] == 1)
dvander@1833: {
dvander@1833: pPlugin->SetErrorState(Plugin_Error, "%s", str);
dvander@1833:
dvander@1833: return pContext->ThrowNativeErrorEx(SP_ERROR_ABORTED, "%s", str);
dvander@1833: }
dvander@1833: else
dvander@1833: {
dvander@1833: char buffer[2048];
dvander@837:
dvander@1833: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
dvander@2193: if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1833: {
dvander@1833: pPlugin->SetErrorState(Plugin_Error, "%s", str);
dvander@1833: return pContext->ThrowNativeErrorEx(SP_ERROR_ABORTED, "Formatting error (%s)", str);
dvander@1833: }
dvander@1833: else
dvander@1833: {
dvander@1833: pPlugin->SetErrorState(Plugin_Error, "%s", buffer);
dvander@1833: return pContext->ThrowNativeErrorEx(SP_ERROR_ABORTED, "%s", buffer);
dvander@1833: }
dvander@1833: }
dvander@837:
dvander@1833: return 0;
dvander@837: }
dvander@837:
dvander@886: static cell_t GetSysTickCount(IPluginContext *pContext, const cell_t *params)
dvander@886: {
dvander@886: #if defined PLATFORM_WINDOWS
dvander@886: return (cell_t)GetTickCount();
dvander@886: #elif defined PLATFORM_LINUX
dvander@886: tms tm;
dvander@886: clock_t ticks = times(&tm);
dvander@886: long ticks_per_sec = sysconf(_SC_CLK_TCK);
ds@889: double fticks = (double)ticks / (double)ticks_per_sec;
dvander@886: fticks *= 1000.0f;
dvander@886: if (fticks > INT_MAX)
dvander@886: {
dvander@886: double r = (int)(fticks / INT_MAX) * (double)INT_MAX;
dvander@886: fticks -= r;
dvander@886: }
dvander@886: return (cell_t)fticks;
dvander@2471: #elif defined PLATFORM_APPLE
dvander@2471: assert(false);
dvander@2471: return 0;
dvander@886: #endif
dvander@886: }
dvander@886:
dvander@978: static cell_t AutoExecConfig(IPluginContext *pContext, const cell_t *params)
dvander@978: {
dvander@978: CPlugin *plugin = g_PluginSys.GetPluginByCtx(pContext->GetContext());
dvander@978:
dvander@978: char *cfg, *folder;
dvander@978: pContext->LocalToString(params[2], &cfg);
dvander@978: pContext->LocalToString(params[3], &folder);
dvander@978:
dvander@978: if (cfg[0] == '\0')
dvander@978: {
dvander@978: static char temp_str[255];
dvander@978: static char temp_file[PLATFORM_MAX_PATH];
dvander@978: char *ptr;
dvander@978:
dvander@978: g_LibSys.GetFileFromPath(temp_str, sizeof(temp_str), plugin->GetFilename());
dvander@978: if ((ptr = strstr(temp_str, ".smx")) != NULL)
dvander@978: {
dvander@978: *ptr = '\0';
dvander@978: }
dvander@978:
dvander@978: /* We have the raw filename! */
dvander@978: UTIL_Format(temp_file, sizeof(temp_file), "plugin.%s", temp_str);
dvander@978: cfg = temp_file;
dvander@978: }
dvander@978:
dvander@978: plugin->AddConfig(params[1] ? true : false, cfg, folder);
dvander@978:
dvander@978: return 1;
dvander@978: }
dvander@978:
faluco@1089: static cell_t MarkNativeAsOptional(IPluginContext *pContext, const cell_t *params)
faluco@1089: {
faluco@1089: char *name;
faluco@1089: uint32_t idx;
dvander@2193: sp_native_t *native;
faluco@1089:
faluco@1089: pContext->LocalToString(params[1], &name);
faluco@1089: if (pContext->FindNativeByName(name, &idx) != SP_ERROR_NONE)
faluco@1089: {
dvander@1124: /* Oops! This HAS to silently fail! */
dvander@1124: return 0;
faluco@1089: }
faluco@1089:
dvander@2193: pContext->GetNativeByIndex(idx, &native);
dvander@2193:
dvander@2193: native->flags |= SP_NTVFLAG_OPTIONAL;
faluco@1089:
faluco@1089: return 1;
faluco@1089: }
faluco@1089:
faluco@1112: static cell_t RegPluginLibrary(IPluginContext *pContext, const cell_t *params)
faluco@1112: {
faluco@1112: char *name;
faluco@1112: CPlugin *pl = g_PluginSys.GetPluginByCtx(pContext->GetContext());
faluco@1112:
faluco@1112: pContext->LocalToString(params[1], &name);
faluco@1112:
faluco@1112: pl->AddLibrary(name);
faluco@1112:
faluco@1112: return 1;
faluco@1112: }
faluco@1112:
dvander@1124: static cell_t LibraryExists(IPluginContext *pContext, const cell_t *params)
dvander@1124: {
dvander@1124: char *str;
dvander@1124: pContext->LocalToString(params[1], &str);
dvander@1124:
dvander@1573: if (g_PluginSys.LibraryExists(str))
dvander@1573: {
dvander@1573: return 1;
dvander@1573: }
dvander@1573:
dvander@1573: if (g_Extensions.LibraryExists(str))
dvander@1573: {
dvander@1573: return 1;
dvander@1573: }
dvander@1573:
dvander@1573: return 0;
dvander@1124: }
dvander@1124:
dvander@1378: static cell_t sm_LogAction(IPluginContext *pContext, const cell_t *params)
dvander@1378: {
dvander@1378: char buffer[2048];
dvander@2042: g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
dvander@1378: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 3);
dvander@1378:
dvander@2193: if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1378: {
dvander@1378: return 0;
dvander@1378: }
dvander@1378:
dvander@1378: CPlugin *pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext());
dvander@1378:
dvander@1378: LogAction(pPlugin->GetMyHandle(), 2, params[1], params[2], buffer);
dvander@1378:
dvander@1378: return 1;
dvander@1378: }
dvander@1378:
dvander@1378: static cell_t LogToFile(IPluginContext *pContext, const cell_t *params)
dvander@1378: {
dvander@1378: char *file;
dvander@1378: pContext->LocalToString(params[1], &file);
dvander@1378:
dvander@1378: char path[PLATFORM_MAX_PATH];
dvander@1378: g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "%s", file);
dvander@1378:
dvander@1378: FILE *fp = fopen(path, "at");
dvander@1378: if (!fp)
dvander@1378: {
dvander@1378: return pContext->ThrowNativeError("Could not open file \"%s\"", path);
dvander@1378: }
dvander@1378:
dvander@1378: char buffer[2048];
dvander@2042: g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
dvander@1378: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
dvander@1378:
dvander@2193: if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1378: {
dvander@1378: fclose(fp);
dvander@1378: return 0;
dvander@1378: }
dvander@1378:
dvander@1378: CPlugin *pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext());
dvander@1378:
dvander@1378: g_Logger.LogToOpenFile(fp, "[%s] %s", pPlugin->GetFilename(), buffer);
dvander@1378:
dvander@1378: fclose(fp);
dvander@1378:
dvander@1378: return 1;
dvander@1378: }
dvander@1378:
dvander@1378: static cell_t LogToFileEx(IPluginContext *pContext, const cell_t *params)
dvander@1378: {
dvander@1378: char *file;
dvander@1378: pContext->LocalToString(params[1], &file);
dvander@1378:
dvander@1378: char path[PLATFORM_MAX_PATH];
dvander@1378: g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "%s", file);
dvander@1378:
dvander@1378: FILE *fp = fopen(path, "at");
dvander@1378: if (!fp)
dvander@1378: {
dvander@1378: return pContext->ThrowNativeError("Could not open file \"%s\"", path);
dvander@1378: }
dvander@1378:
dvander@1378: char buffer[2048];
dvander@2042: g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
dvander@1378: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
dvander@1378:
dvander@2193: if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1378: {
dvander@1378: fclose(fp);
dvander@1378: return 0;
dvander@1378: }
dvander@1378:
dvander@1378: g_Logger.LogToOpenFile(fp, "%s", buffer);
dvander@1378:
dvander@1378: fclose(fp);
dvander@1378:
dvander@1378: return 1;
dvander@1378: }
dvander@1378:
dvander@1419: static cell_t GetExtensionFileStatus(IPluginContext *pContext, const cell_t *params)
dvander@1419: {
dvander@1419: char *str;
dvander@1419: pContext->LocalToString(params[1], &str);
dvander@1419:
dvander@1419: IExtension *pExtension = g_Extensions.FindExtensionByFile(str);
dvander@1419:
dvander@1419: if (!pExtension)
dvander@1419: {
dvander@1419: return -2;
dvander@1419: }
dvander@1419:
dvander@1419: if (!pExtension->IsLoaded())
dvander@1419: {
dvander@1419: return -1;
dvander@1419: }
dvander@1419:
dvander@1419: char *error;
dvander@1419: pContext->LocalToString(params[2], &error);
dvander@1419: if (!pExtension->IsRunning(error, params[3]))
dvander@1419: {
dvander@1419: return 0;
dvander@1419: }
dvander@1419:
dvander@1419: return 1;
dvander@1419: }
dvander@1419:
dvander@1798: static cell_t FindPluginByNumber(IPluginContext *pContext, const cell_t *params)
dvander@1798: {
dvander@1798: CPlugin *pPlugin = g_PluginSys.GetPluginByOrder(params[1]);
dvander@1798:
dvander@1798: if (pPlugin == NULL)
dvander@1798: {
dvander@1798: return BAD_HANDLE;
dvander@1798: }
dvander@1798:
dvander@1798: return pPlugin->GetMyHandle();
dvander@1798: }
dvander@1798:
dvander@2342: static cell_t VerifyCoreVersion(IPluginContext *pContext, const cell_t *params)
dvander@2342: {
dvander@2342: return 4;
dvander@2342: }
dvander@2342:
dvander@560: REGISTER_NATIVES(coreNatives)
dvander@560: {
faluco@1089: {"AutoExecConfig", AutoExecConfig},
faluco@1089: {"GetPluginFilename", GetPluginFilename},
faluco@1089: {"GetPluginInfo", GetPluginInfo},
faluco@1089: {"GetPluginIterator", GetPluginIterator},
faluco@1089: {"GetPluginStatus", GetPluginStatus},
faluco@1089: {"GetSysTickCount", GetSysTickCount},
faluco@1089: {"GetTime", GetTime},
faluco@1089: {"IsPluginDebugging", IsPluginDebugging},
faluco@1089: {"MorePlugins", MorePlugins},
faluco@1089: {"ReadPlugin", ReadPlugin},
faluco@1089: {"ThrowError", ThrowError},
faluco@1089: {"SetFailState", SetFailState},
faluco@1089: {"FormatTime", FormatTime},
faluco@1089: {"MarkNativeAsOptional", MarkNativeAsOptional},
faluco@1112: {"RegPluginLibrary", RegPluginLibrary},
dvander@1124: {"LibraryExists", LibraryExists},
dvander@1378: {"LogAction", sm_LogAction},
dvander@1378: {"LogToFile", LogToFile},
dvander@1378: {"LogToFileEx", LogToFileEx},
dvander@1419: {"GetExtensionFileStatus", GetExtensionFileStatus},
dvander@1798: {"FindPluginByNumber", FindPluginByNumber},
dvander@2342: {"VerifyCoreVersion", VerifyCoreVersion},
faluco@1089: {NULL, NULL},
dvander@560: };
dvander@1419: