/** * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= * SourceMod * Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved. * ============================================================================= * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License, version 3.0, as published by the * Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . * * As a special exception, AlliedModders LLC gives you permission to link the * code of this program (as well as its derivative works) to "Half-Life 2," the * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software * by the Valve Corporation. You must obey the GNU General Public License in * all respects for all other code used. Additionally, AlliedModders LLC grants * this exception to all derivative works. AlliedModders LLC defines further * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), * or . * * Version: $Id$ */ #include "sourcemod.h" #include "sourcemm_api.h" #include "logic_bridge.h" #include "sm_globals.h" #include "CoreConfig.h" #include "command_args.h" #include #include CON_COMMAND(sm, "SourceMod Menu") { #if SOURCE_ENGINE <= SE_DARKMESSIAH CCommand args; #endif EngineArgs cargs(args); if (cargs.ArgC() >= 2) { const char *cmdname = cargs.Arg(1); if (strcmp(cmdname, "internal") == 0) { if (cargs.ArgC() >= 3) { const char *arg = cargs.Arg(2); if (strcmp(arg, "1") == 0) { SM_ConfigsExecuted_Global(); } else if (strcmp(arg, "2") == 0) { if (cargs.ArgC() >= 4) { SM_ConfigsExecuted_Plugin(atoi(cargs.Arg(3))); } } } return; } } logicore.OnRootCommand(&cargs); } FILE *g_pHndlLog = NULL; void write_handles_to_log(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(g_pHndlLog, fmt, ap); fprintf(g_pHndlLog, "\n"); va_end(ap); } void write_handles_to_game(const char *fmt, ...) { size_t len; va_list ap; char buffer[1024]; va_start(ap, fmt); len = ke::SafeSprintf(buffer, sizeof(buffer)-2, fmt, ap); va_end(ap); buffer[len] = '\n'; buffer[len+1] = '\0'; engine->LogPrint(buffer); } CON_COMMAND(sm_dump_handles, "Dumps Handle usage to a file for finding Handle leaks") { #if SOURCE_ENGINE <= SE_DARKMESSIAH CCommand args; #endif if (args.ArgC() < 2) { UTIL_ConsolePrint("Usage: sm_dump_handles or for game logs"); return; } if (strcmp(args.Arg(1), "log") != 0) { char filename[PLATFORM_MAX_PATH]; const char *arg = args.Arg(1); g_SourceMod.BuildPath(Path_Game, filename, sizeof(filename), "%s", arg); FILE *fp = fopen(filename, "wt"); if (!fp) { UTIL_ConsolePrint("Failed to open \"%s\" for writing", filename); return; } g_pHndlLog = fp; logicore.DumpHandles(write_handles_to_log); g_pHndlLog = NULL; fclose(fp); } else { logicore.DumpHandles(write_handles_to_game); } } CON_COMMAND(sm_reload_translations, "Reparses all loaded translation files") { translator->RebuildLanguageDatabase(); } CON_COMMAND(sm_dump_admcache, "Dumps the admin cache for debugging") { char buffer[PLATFORM_MAX_PATH]; g_SourceMod.BuildPath(Path_SM, buffer, sizeof(buffer), "data/admin_cache_dump.txt"); if (!logicore.DumpAdminCache(buffer)) { UTIL_ConsolePrint("Could not open file for writing: %s", buffer); return; } UTIL_ConsolePrint("Admin cache dumped to: %s", buffer); }