diff --git a/SphereSvr.vcxproj b/SphereSvr.vcxproj index ccd31e1e..c3ad670d 100644 --- a/SphereSvr.vcxproj +++ b/SphereSvr.vcxproj @@ -194,7 +194,6 @@ if defined GitRev ( - @@ -303,7 +302,6 @@ if defined GitRev ( - diff --git a/SphereSvr.vcxproj.filters b/SphereSvr.vcxproj.filters index 7f1cb5e4..5a557fb3 100644 --- a/SphereSvr.vcxproj.filters +++ b/SphereSvr.vcxproj.filters @@ -10,9 +10,6 @@ {353e7db8-874b-4551-8e15-0fcc9875d06e} - - {bfcf28bb-2d0c-48a1-a304-037fb69f178b} - {19b83913-ef63-4820-9ae0-158e0c75d5b8} @@ -165,9 +162,6 @@ sphere - - common\crashdump - common @@ -512,9 +506,6 @@ sphere - - common\crashdump - common diff --git a/src/common/CException.cpp b/src/common/CException.cpp index 08275ff4..7d922549 100644 --- a/src/common/CException.cpp +++ b/src/common/CException.cpp @@ -8,7 +8,6 @@ void Assert_CheckFail(LPCTSTR pszExp, LPCTSTR pszFile, long lLine) #ifdef _WIN32 #ifndef _DEBUG - #include "./crashdump/crashdump.h" extern "C" { @@ -21,11 +20,7 @@ void Assert_CheckFail(LPCTSTR pszExp, LPCTSTR pszFile, long lLine) void _cdecl Sphere_Exception_Win32(unsigned int id, struct _EXCEPTION_POINTERS *pData) { - #ifndef _NO_CRASHDUMP - if ( CrashDump::IsEnabled() ) - CrashDump::StartCrashDump(GetCurrentProcessId(), GetCurrentThreadId(), pData); - #endif - // WIN32 gets an exception. + // WIN32 gets an exception DWORD dwCodeStart = (DWORD_PTR)&globalstartsymbol; // sync up to MAP file DWORD dwAddr = (DWORD_PTR)pData->ExceptionRecord->ExceptionAddress; dwAddr -= dwCodeStart; diff --git a/src/common/CWindow.h b/src/common/CWindow.h index cb7746db..4f839147 100644 --- a/src/common/CWindow.h +++ b/src/common/CWindow.h @@ -210,7 +210,6 @@ public: static const char *m_sClassName; LPCTSTR m_pszAppName; // Specifies the name of the application. (display freindly) HINSTANCE m_hInstance; // Identifies the current instance of the application. - LPTSTR m_lpCmdLine; // Points to a null-terminated string that specifies the command line for the application. CWindow * m_pMainWnd; // Holds a pointer to the application's main window. For an example of how to initialize m_pMainWnd, see InitInstance. CGString m_pszExeName; // The module name of the application. CGString m_pszProfileName; // the path to the profile. @@ -220,7 +219,6 @@ public: { m_pszAppName = ""; m_hInstance = NULL; - m_lpCmdLine = NULL; m_pMainWnd = NULL; } @@ -233,11 +231,10 @@ private: CWinApp& operator=(const CWinApp& other); public: - void InitInstance( LPCTSTR pszAppName, HINSTANCE hInstance, LPTSTR lpszCmdLine ) + void InitInstance(LPCTSTR pszAppName, HINSTANCE hInstance) { m_pszAppName = pszAppName; // assume this is a static data pointer valid forever. m_hInstance = hInstance; - m_lpCmdLine = lpszCmdLine; char szFileName[ _MAX_PATH ]; if ( ! GetModuleFileName( m_hInstance, szFileName, sizeof( szFileName ))) diff --git a/src/common/crashdump/crashdump.cpp b/src/common/crashdump/crashdump.cpp deleted file mode 100644 index c44f0db0..00000000 --- a/src/common/crashdump/crashdump.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#if defined(_WIN32) && !defined(_DEBUG) && !defined(_NO_CRASHDUMP) - -#include "crashdump.h" - -bool CrashDump::m_bEnabled = false; -HMODULE CrashDump::m_hDll = NULL; -MINIDUMPWRITEDUMP CrashDump::m_tDumpFunction = NULL; - -bool CrashDump::IsEnabled() -{ - return m_bEnabled; -} - -void CrashDump::Enable() -{ - TCHAR szLibPath[MAX_PATH]; - GetSystemDirectory(szLibPath, sizeof(szLibPath)); - strncat(szLibPath, "\\dbghelp.dll", sizeof(szLibPath) - strlen(szLibPath) - 1); - - m_hDll = LoadLibrary(szLibPath); - if (!m_hDll) - { - m_bEnabled = false; - return; - } - - m_tDumpFunction = reinterpret_cast(GetProcAddress(m_hDll, "MiniDumpWriteDump")); - if (!m_tDumpFunction) - { - m_bEnabled = false; - FreeLibrary(m_hDll); - return; - } - - m_bEnabled = true; -} - -void CrashDump::Disable() -{ - m_bEnabled = false; - - if (m_tDumpFunction != NULL) - m_tDumpFunction = NULL; - - if (m_hDll != NULL) - { - FreeLibrary(m_hDll); - m_hDll = NULL; - } -} - -void CrashDump::StartCrashDump( DWORD processID, DWORD threadID, struct _EXCEPTION_POINTERS* pExceptionData ) -{ - if (!processID || !threadID || !pExceptionData) - return; - - HANDLE process = GetCurrentProcess(); - if (process == NULL) - return; - - SYSTEMTIME st; - GetSystemTime(&st); - - char szFileName[FILENAME_MAX]; - snprintf(szFileName, sizeof(szFileName), "sphereCrash_%02hu%02hu-%02hu%02hu%02hu%04hu.dmp", st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); - - HANDLE dumpFile = CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0); - if (dumpFile == INVALID_HANDLE_VALUE) - return; - - MINIDUMP_EXCEPTION_INFORMATION eInfo; - eInfo.ThreadId = threadID; - eInfo.ExceptionPointers = pExceptionData; - eInfo.ClientPointers = true; - - m_tDumpFunction(process, processID, dumpFile, MiniDumpWithDataSegs, &eInfo, NULL, NULL); - - CloseHandle(dumpFile); - return; -} - -#endif \ No newline at end of file diff --git a/src/common/crashdump/crashdump.h b/src/common/crashdump/crashdump.h deleted file mode 100644 index 2d75eb37..00000000 --- a/src/common/crashdump/crashdump.h +++ /dev/null @@ -1,40 +0,0 @@ -#if !defined(_CRASHDUMP_H) && defined(_WIN32) && !defined(_DEBUG) && !defined(_NO_CRASHDUMP) -#define _CRASHDUMP_H - -#include "../os_windows.h" -#ifdef __MINGW32__ -#include "mingwdbghelp.h" -#else // __MINGW32__ -#pragma warning(disable:4091) -#include -#pragma warning(default:4091) -#endif // __MINGW32__ -#include - -typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, - DWORD dwPid, - HANDLE hFile, - MINIDUMP_TYPE DumpType, - CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, - CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, - CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); -class CrashDump -{ - private: - static bool m_bEnabled; - static HMODULE m_hDll; - static MINIDUMPWRITEDUMP m_tDumpFunction; - - public: - static void StartCrashDump( DWORD , DWORD , struct _EXCEPTION_POINTERS* ); - static bool IsEnabled(); - static void Enable(); - static void Disable(); - - private: - CrashDump(void); - CrashDump(const CrashDump& copy); - CrashDump& operator=(const CrashDump& other); -}; - -#endif \ No newline at end of file diff --git a/src/common/crashdump/mingwdbghelp.h b/src/common/crashdump/mingwdbghelp.h deleted file mode 100644 index 53589efe..00000000 --- a/src/common/crashdump/mingwdbghelp.h +++ /dev/null @@ -1,187 +0,0 @@ -/** -* @file mingwdbghelp.h -* This file is needed for mingw32 because dbghelp.h do not exists. -*/ - -#ifdef __MINGW32__ -#ifndef SPHERESERVER_MINGWDBGHELP_H_H -#define SPHERESERVER_MINGWDBGHELP_H_H -#include - -typedef enum _MINIDUMP_TYPE { - MiniDumpNormal = 0x00000000, - MiniDumpWithDataSegs = 0x00000001, - MiniDumpWithFullMemory = 0x00000002, - MiniDumpWithHandleData = 0x00000004, - MiniDumpFilterMemory = 0x00000008, - MiniDumpScanMemory = 0x00000010, - MiniDumpWithUnloadedModules = 0x00000020, - MiniDumpWithIndirectlyReferencedMemory = 0x00000040, - MiniDumpFilterModulePaths = 0x00000080, - MiniDumpWithProcessThreadData = 0x00000100, - MiniDumpWithPrivateReadWriteMemory = 0x00000200, - MiniDumpWithoutOptionalData = 0x00000400, - MiniDumpWithFullMemoryInfo = 0x00000800, - MiniDumpWithThreadInfo = 0x00001000, - MiniDumpWithCodeSegs = 0x00002000, - MiniDumpWithoutAuxiliaryState = 0x00004000, - MiniDumpWithFullAuxiliaryState = 0x00008000, - MiniDumpWithPrivateWriteCopyMemory = 0x00010000, - MiniDumpIgnoreInaccessibleMemory = 0x00020000, - MiniDumpWithTokenInformation = 0x00040000, - MiniDumpWithModuleHeaders = 0x00080000, - MiniDumpFilterTriage = 0x00100000, - MiniDumpValidTypeFlags = 0x001fffff -} MINIDUMP_TYPE; - - -typedef struct _MINIDUMP_EXCEPTION_INFORMATION { - DWORD ThreadId; - PEXCEPTION_POINTERS ExceptionPointers; - BOOL ClientPointers; -} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION; - - -typedef struct _MINIDUMP_USER_STREAM { - ULONG32 Type; - ULONG BufferSize; - PVOID Buffer; -} MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM; - - -typedef struct _MINIDUMP_USER_STREAM_INFORMATION { - ULONG UserStreamCount; - PMINIDUMP_USER_STREAM UserStreamArray; -} MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION; - - -typedef struct _MINIDUMP_THREAD_CALLBACK { - ULONG ThreadId; - HANDLE ThreadHandle; - CONTEXT Context; - ULONG SizeOfContext; - ULONG64 StackBase; - ULONG64 StackEnd; -} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK; - - -typedef struct _MINIDUMP_THREAD_EX_CALLBACK { - ULONG ThreadId; - HANDLE ThreadHandle; - CONTEXT Context; - ULONG SizeOfContext; - ULONG64 StackBase; - ULONG64 StackEnd; - ULONG64 BackingStoreBase; - ULONG64 BackingStoreEnd; -} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK; - - -typedef struct _MINIDUMP_MODULE_CALLBACK { - PWCHAR FullPath; - ULONG64 BaseOfImage; - ULONG SizeOfImage; - ULONG CheckSum; - ULONG TimeDateStamp; - VS_FIXEDFILEINFO VersionInfo; - PVOID CvRecord; - ULONG SizeOfCvRecord; - PVOID MiscRecord; - ULONG SizeOfMiscRecord; -} MINIDUMP_MODULE_CALLBACK, *PMINIDUMP_MODULE_CALLBACK; - - -typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK { - ULONG ThreadId; -} MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK; - - -typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK { - ULONG64 BaseOfImage; -} MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK; - - -typedef struct _MINIDUMP_IO_CALLBACK { - HANDLE Handle; - ULONG64 Offset; - PVOID Buffer; - ULONG BufferBytes; -} MINIDUMP_IO_CALLBACK, *PMINIDUMP_IO_CALLBACK; - - -typedef struct _MINIDUMP_READ_MEMORY_FAILURE_CALLBACK { - ULONG64 Offset; - ULONG Bytes; - HRESULT FailureStatus; -} MINIDUMP_READ_MEMORY_FAILURE_CALLBACK, *PMINIDUMP_READ_MEMORY_FAILURE_CALLBACK; - - -typedef struct _MINIDUMP_CALLBACK_INPUT { - ULONG ProcessId; - HANDLE ProcessHandle; - ULONG CallbackType; - union { - HRESULT Status; - MINIDUMP_THREAD_CALLBACK Thread; - MINIDUMP_THREAD_EX_CALLBACK ThreadEx; - MINIDUMP_MODULE_CALLBACK Module; - MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread; - MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule; - MINIDUMP_IO_CALLBACK Io; - MINIDUMP_READ_MEMORY_FAILURE_CALLBACK ReadMemoryFailure; - ULONG SecondaryFlags; - }; -} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT; - - -typedef struct _MINIDUMP_MEMORY_INFO { - ULONG64 BaseAddress; - ULONG64 AllocationBase; - ULONG32 AllocationProtect; - ULONG32 __alignment1; - ULONG64 RegionSize; - ULONG32 State; - ULONG32 Protect; - ULONG32 Type; - ULONG32 __alignment2; -} MINIDUMP_MEMORY_INFO, *PMINIDUMP_MEMORY_INFO; - - -typedef struct _MINIDUMP_CALLBACK_OUTPUT { - union { - ULONG ModuleWriteFlags; - ULONG ThreadWriteFlags; - ULONG SecondaryFlags; - struct { - ULONG64 MemoryBase; - ULONG MemorySize; - }; - struct { - BOOL CheckCancel; - BOOL Cancel; - }; - HANDLE Handle; - }; - struct { - MINIDUMP_MEMORY_INFO VmRegion; - BOOL Continue; - }; - HRESULT Status; -} MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT; - - -typedef BOOL (WINAPI * MINIDUMP_CALLBACK_ROUTINE) ( -IN PVOID CallbackParam, -IN CONST PMINIDUMP_CALLBACK_INPUT CallbackInput, - IN OUT PMINIDUMP_CALLBACK_OUTPUT CallbackOutput -); - - -typedef struct _MINIDUMP_CALLBACK_INFORMATION { - MINIDUMP_CALLBACK_ROUTINE CallbackRoutine; - PVOID CallbackParam; -} MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION; - - -#endif //SPHERESERVER_MINGWDBGHELP_H_H -#endif // __MINGW32__ \ No newline at end of file diff --git a/src/common/os_windows.h b/src/common/os_windows.h index 9c74388b..5f14fd92 100644 --- a/src/common/os_windows.h +++ b/src/common/os_windows.h @@ -13,7 +13,7 @@ #include #include -extern bool NTWindow_Init(HINSTANCE hInstance, LPTSTR lpCmdLinel, int nCmdShow); +extern bool NTWindow_Init(HINSTANCE hInstance, int nCmdShow); extern void NTWindow_Exit(); extern void NTWindow_DeleteIcon(); extern bool NTWindow_OnTick(int iWaitmSec); diff --git a/src/graysvr/CLog.cpp b/src/graysvr/CLog.cpp index 766d83da..b98f2a22 100644 --- a/src/graysvr/CLog.cpp +++ b/src/graysvr/CLog.cpp @@ -9,8 +9,6 @@ bool CLog::OpenLog( LPCTSTR pszBaseDirName ) // name set previously. { - if ( m_fLockOpen ) // the log is already locked open - return false; if ( m_sBaseDir == NULL ) return false; diff --git a/src/graysvr/CLog.h b/src/graysvr/CLog.h index 547eef7e..a206ab92 100644 --- a/src/graysvr/CLog.h +++ b/src/graysvr/CLog.h @@ -115,7 +115,6 @@ extern struct CLog : public CFileText, public CEventLog public: CLog() { - m_fLockOpen = false; m_dwMsgMask = (LOGM_ACCOUNTS|LOGM_INIT|LOGM_SAVE|LOGM_CLIENTS_LOG|LOGM_GM_PAGE|LOGM_PLAYER_SPEAK|LOGM_GM_CMDS|LOGM_CHEAT|LOGM_KILLS|LOGM_HTTP); m_pScriptContext = NULL; m_pObjectContext = NULL; @@ -123,7 +122,6 @@ public: } public: - bool m_fLockOpen; SimpleMutex m_mutex; private: diff --git a/src/graysvr/CNTWindow.cpp b/src/graysvr/CNTWindow.cpp index 3aabad67..f2ad02f0 100644 --- a/src/graysvr/CNTWindow.cpp +++ b/src/graysvr/CNTWindow.cpp @@ -755,30 +755,15 @@ LRESULT WINAPI CNTWindow::WindowProc( HWND hWnd, UINT message, WPARAM wParam, LP //************************************ -bool NTWindow_Init(HINSTANCE hInstance, LPTSTR lpCmdLine, int nCmdShow) +bool NTWindow_Init(HINSTANCE hInstance, int nCmdShow) { - theApp.InitInstance(SPHERE_TITLE "Server V" SPHERE_VER_STR_FULL, hInstance, lpCmdLine); + theApp.InitInstance(SPHERE_TITLE "Server V" SPHERE_VER_STR_FULL, hInstance); - // read target window name from the arguments - char className[32] = SPHERE_TITLE "Svr"; - TCHAR *argv[32]; - argv[0] = NULL; - size_t argc = Str_ParseCmds(lpCmdLine, &argv[1], COUNTOF(argv)-1, " \t") + 1; - if (( argc > 1 ) && _IS_SWITCH(*argv[1]) ) - { - if ( argv[1][1] == 'c' ) - { - if ( argv[1][2] ) - { - strncpy(className, &argv[1][2], sizeof(className)); - className[sizeof(className) - 1] = '\0'; - } - } - } - CNTWindow::RegisterClass(className); + char *pszClassName = SPHERE_TITLE "Svr"; + CNTWindow::RegisterClass(pszClassName); theApp.m_wndMain.m_hWnd = ::CreateWindow( - className, + pszClassName, SPHERE_TITLE_VER, // window name WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // horizontal position of window diff --git a/src/graysvr/CServer.cpp b/src/graysvr/CServer.cpp index ac8d942e..e5a4a8d4 100644 --- a/src/graysvr/CServer.cpp +++ b/src/graysvr/CServer.cpp @@ -2,9 +2,7 @@ #include "../network/network.h" #include "../graysvr/CPingServer.h" -#ifdef _WIN32 - #include "../common/crashdump/crashdump.h" -#else +#ifndef _WIN32 #include "CUnixTerminal.h" #ifdef _LIBEV extern LinuxEv g_NetworkEvent; @@ -442,121 +440,6 @@ int CServer::PrintPercent(long iCount, long iTotal) return iPercent; } -extern void defragSphere(char *); - -bool CServer::CommandLine(int argc, TCHAR *argv[]) -{ - // Console command line - // This runs after script file enum but before loading the world file - // RETURN: - // true = keep running after this - - for ( int argn = 1; argn < argc; ++argn ) - { - TCHAR *pszArg = argv[argn]; - if ( !_IS_SWITCH(pszArg[0]) ) - continue; - - ++pszArg; - switch ( toupper(pszArg[0]) ) - { - case '?': - { - PrintStr(SPHERE_TITLE " \n" - "Command line switches:\n" -#ifdef _WIN32 - "-cClassName Setup custom window class name for " SPHERE_TITLE " (default: " SPHERE_TITLE "Svr)\n" -#else - "-c Use colored console output (default: off)\n" -#endif - "-D Dump global variable DEFNAMEs to defs.txt\n" -#if defined(_WIN32) && !defined(_DEBUG) && !defined(_NO_CRASHDUMP) - "-E Enable crash dumper\n" -#endif - "-Gpath/to/saves/ Defrag " SPHERE_TITLE " saves\n" -#ifdef _WIN32 - "-K install/remove Installs or removes NT Service\n" -#endif - "-Nstring Set the " SPHERE_TITLE " name\n" - "-Ofilename Output console to this file name\n" - "-P# Set the port number\n" - "-Q Quit when finished\n" - ); - return false; - } -#ifdef _WIN32 - case 'C': - case 'K': - { - // These are parsed in other places (NT service, NT window part, etc) - continue; - } -#else - case 'C': - { - g_UnixTerminal.setColorEnabled(true); - continue; - } -#endif - case 'P': - { - m_ip.SetPortStr(pszArg + 1); - continue; - } - case 'N': - { - SetName(pszArg + 1); - continue; - } - case 'D': - { - CFileText ft; - if ( !ft.Open("defs.txt", OF_WRITE|OF_TEXT) ) - return false; - - for ( size_t i = 0; i < g_Exp.m_VarDefs.GetCount(); ++i ) - { - if ( (i % 0x1FF) == 0 ) - PrintPercent(i, g_Exp.m_VarDefs.GetCount()); - - CVarDefCont *pCont = g_Exp.m_VarDefs.GetAt(i); - if ( pCont ) - ft.Printf("%s=%s\n", pCont->GetKey(), pCont->GetValStr()); - } - continue; - } -#if defined(_WIN32) && !defined(_DEBUG) && !defined(_NO_CRASHDUMP) - case 'E': - { - CrashDump::Enable(); - if ( CrashDump::IsEnabled() ) - PrintStr("Crash dump enabled\n"); - else - PrintStr("Crash dump NOT enabled\n"); - continue; - } -#endif - case 'G': - { - defragSphere(pszArg + 1); - continue; - } - case 'O': - { - if ( g_Log.Open(pszArg + 1, OF_SHARE_DENY_WRITE|OF_READWRITE|OF_TEXT) ) - g_Log.m_fLockOpen = true; - continue; - } - case 'Q': - return false; - default: - g_Log.Event(LOGL_CRIT, "Don't recognize command line data '%s'\n", static_cast(argv[argn])); - break; - } - } - return true; -} - bool CServer::OnConsoleCmd(CGString &sText, CTextConsole *pSrc) { ADDTOCALLSTACK("CServer::OnConsoleCmd"); diff --git a/src/graysvr/CServer.h b/src/graysvr/CServer.h index 08f32454..b4816da9 100644 --- a/src/graysvr/CServer.h +++ b/src/graysvr/CServer.h @@ -69,7 +69,6 @@ public: void PrintStr(LPCTSTR pszMsg) const; int PrintPercent(long iCount, long iTotal); - bool CommandLine(int argc, TCHAR *argv[]); bool OnConsoleCmd(CGString &sText, CTextConsole *pSrc); void ListClients(CTextConsole *pConsole) const; diff --git a/src/graysvr/CUnixTerminal.h b/src/graysvr/CUnixTerminal.h index 050e530a..07d30507 100644 --- a/src/graysvr/CUnixTerminal.h +++ b/src/graysvr/CUnixTerminal.h @@ -50,10 +50,6 @@ public: void print(LPCTSTR pszText); void prepare(); - void setColorEnabled(bool fSet) - { - m_fColorEnabled = fSet; - } bool isColorEnabled() const { return m_fColorEnabled; diff --git a/src/graysvr/graysvr.cpp b/src/graysvr/graysvr.cpp index 4986cbcb..7a7053af 100644 --- a/src/graysvr/graysvr.cpp +++ b/src/graysvr/graysvr.cpp @@ -563,10 +563,10 @@ extern CDataBaseAsyncHelper g_asyncHdb; //******************************************************************* -int Sphere_InitServer( int argc, char *argv[] ) +int Sphere_InitServer() { #ifdef EXCEPTIONS_DEBUG - const char *m_sClassName = "Sphere"; + const char *m_sClassName = SPHERE_TITLE; #endif EXC_TRY("Init"); ASSERT(MAX_BUFFER >= sizeof(CEvent)); @@ -593,13 +593,6 @@ int Sphere_InitServer( int argc, char *argv[] ) if ( !g_Serv.Load() ) return -3; - if ( argc > 1 ) - { - EXC_SET("cmdline"); - if ( !g_Serv.CommandLine(argc, argv) ) - return -1; - } - WritePidFile(2); EXC_SET("load world"); @@ -627,9 +620,6 @@ int Sphere_InitServer( int argc, char *argv[] ) return g_Serv.m_iExitFlag; EXC_CATCH; - EXC_DEBUG_START; - g_Log.EventDebug("cmdline argc=%d starting with %p (argv1='%s')\n", argc, static_cast(argv), ( argc > 2 ) ? argv[1] : ""); - EXC_DEBUG_END; return -10; } @@ -733,7 +723,7 @@ void CServer::ShipTimers_Delete(CItemShip *pShip) static void Sphere_MainMonitorLoop() { #ifdef EXCEPTIONS_DEBUG - const char *m_sClassName = "Sphere"; + const char *m_sClassName = SPHERE_TITLE; #endif // Just make sure the main loop is alive every so often. // This should be the parent thread. try to restart it if it is not. @@ -770,337 +760,26 @@ static void Sphere_MainMonitorLoop() } -//****************************************************** -void dword_q_sort(DWORD numbers[], DWORD left, DWORD right) -{ - DWORD pivot, l_hold, r_hold; - - l_hold = left; - r_hold = right; - pivot = numbers[left]; - while (left < right) - { - while ( (numbers[right] >= pivot) && (left < right) ) - --right; - if (left != right) - { - numbers[left] = numbers[right]; - ++left; - } - - while ( (numbers[left] <= pivot) && (left < right) ) - ++left; - if (left != right) - { - numbers[right] = numbers[left]; - --right; - } - } - numbers[left] = pivot; - pivot = left; - left = l_hold; - right = r_hold; - if (left < pivot) dword_q_sort(numbers, left, pivot-1); - if (right > pivot) dword_q_sort(numbers, pivot+1, right); -} - -void defragSphere(char *path) -{ - ASSERT(path != NULL); - - CFileText inf; - CGFile ouf; - char z[256], z1[256], buf[1024]; - size_t i; - DWORD uid = UID_CLEAR; - char *p = NULL, *p1 = NULL; - DWORD dBytesRead; - DWORD dTotalMb; - DWORD mb10 = 10 * 1024 * 1024; - DWORD mb5 = 5 * 1024 * 1024; - bool bSpecial; - DWORD dTotalUIDs; - - char c,c1,c2; - DWORD d; - - // NOTE: Sure I could use CVarDefArray, but it is extremely slow with memory allocation, takes hours - // to read and save the data. Moreover, it takes less memory in this case and does less convertations. - - g_Log.Event(LOGL_EVENT, "Defragmentation (UID alteration) of " SPHERE_TITLE " saves.\n" - "Use it at your own risk and if you know what you are doing, since it can possibly harm your server.\n" - "The process can take up to several hours depending on the CPU you have.\n" - "After finished, you will have your '" SPHERE_FILE "*" SPHERE_SCRIPT "' save files converted to '" SPHERE_FILE "*" SPHERE_SCRIPT ".new'.\n"); - - DWORD *uids = static_cast(calloc((SIZE_MAX / 2) / sizeof(DWORD), sizeof(DWORD))); - for ( i = 0; i < 3; ++i ) - { - strncpy(z, path, sizeof(z)); - z[sizeof(z) - 1] = '\0'; - if ( i == 0 ) - strncat(z, SPHERE_FILE "statics" SPHERE_SCRIPT, sizeof(z) - strlen(z) - 1); - else if ( i == 1 ) - strncat(z, SPHERE_FILE "world" SPHERE_SCRIPT, sizeof(z) - strlen(z) - 1); - else - strncat(z, SPHERE_FILE "chars" SPHERE_SCRIPT, sizeof(z) - strlen(z) - 1); - - g_Log.Event(LOGL_EVENT, "Reading %s\n", z); - if ( !inf.Open(z, OF_READ|OF_TEXT|OF_DEFAULTMODE) ) - { - g_Log.Event(LOGL_EVENT, "Can't open file '%s' for reading. Skipped!\n", z); - continue; - } - dBytesRead = dTotalMb = 0; - while ( !feof(inf.m_pStream) ) - { - fgets(buf, sizeof(buf), inf.m_pStream); - dBytesRead += strlen(buf); - if ( dBytesRead > mb10 ) - { - dBytesRead -= mb10; - dTotalMb += 10; - g_Log.Event(LOGL_EVENT, "Total read %" FMTDWORD " Mb\n", dTotalMb); - } - if (( buf[0] == 'S' ) && ( strstr(buf, "SERIAL=") == buf )) - { - p = buf + 7; - p1 = p; - while ( *p1 && ( *p1 != '\r' ) && ( *p1 != '\n' )) - ++p1; - *p1 = 0; - - // prepare new uid - *(p-1) = '0'; - *p = 'x'; - --p; - uids[uid++] = strtoul(p, &p1, 16); - } - } - inf.Close(); - } - - dTotalUIDs = uid; - if ( dTotalUIDs <= 0 ) - { - g_Log.Event(LOGL_EVENT, "Save files are empty, defragmentation is not needed\n"); - free(uids); - return; - } - - g_Log.Event(LOGL_EVENT, "Found %" FMTDWORD " UIDs (latest: 0%" FMTDWORDH ")\n", uid, uids[dTotalUIDs - 1]); - g_Log.Event(LOGL_EVENT, "Quick-sorting UIDs array...\n"); - dword_q_sort(uids, 0, dTotalUIDs - 1); - - for ( i = 0; i < 5; ++i ) - { - strncpy(z, path, sizeof(z)); - z[sizeof(z) - 1] = '\0'; - if ( i == 0 ) - strncat(z, SPHERE_FILE "accu" SPHERE_SCRIPT, sizeof(z) - strlen(z) - 1); - else if ( i == 1 ) - strncat(z, SPHERE_FILE "chars" SPHERE_SCRIPT, sizeof(z) - strlen(z) - 1); - else if ( i == 2 ) - strncat(z, SPHERE_FILE "data" SPHERE_SCRIPT, sizeof(z) - strlen(z) - 1); - else if ( i == 3 ) - strncat(z, SPHERE_FILE "world" SPHERE_SCRIPT, sizeof(z) - strlen(z) - 1); - else if ( i == 4 ) - strncat(z, SPHERE_FILE "statics" SPHERE_SCRIPT, sizeof(z) - strlen(z) - 1); - - g_Log.Event(LOGL_EVENT, "Updating UIDs in '%s' to '%s.new'\n", z, z); - if ( !inf.Open(z, OF_READ|OF_TEXT|OF_DEFAULTMODE) ) - { - g_Log.Event(LOGL_EVENT, "Can't open file '%s' for reading. Skipped!\n", z); - continue; - } - strncat(z, ".new", sizeof(z) - strlen(z) - 1); - if ( !ouf.Open(z, OF_WRITE|OF_CREATE|OF_DEFAULTMODE) ) - { - g_Log.Event(LOGL_EVENT, "Can't open file '%s' for writing. Skipped!\n", z); - continue; - } - dBytesRead = dTotalMb = 0; - while ( inf.ReadString(buf, sizeof(buf)) ) - { - uid = strlen(buf); - if ( uid > sizeof(buf) - 3 ) - uid = sizeof(buf) - 3; - - buf[uid] = buf[uid+1] = buf[uid+2] = 0; // just to be sure to be in line always - // NOTE: it is much faster than to use memcpy to clear before reading - bSpecial = false; - dBytesRead += uid; - if ( dBytesRead > mb5 ) - { - dBytesRead -= mb5; - dTotalMb += 5; - g_Log.Event(LOGL_EVENT, "Total processed %" FMTDWORD " Mb\n", dTotalMb); - } - p = buf; - - // Note 28-Jun-2004 - // mounts seems having ACTARG1 > 0x30000000. The actual UID is ACTARG1-0x30000000. The - // new also should be new+0x30000000. need investigation if this can help making mounts - // not to disappear after the defrag - if (( buf[0] == 'A' ) && ( strstr(buf, "ACTARG1=0") == buf )) // ACTARG1= - p += 8; - else if (( buf[0] == 'C' ) && ( strstr(buf, "CONT=0") == buf )) // CONT= - p += 5; - else if (( buf[0] == 'C' ) && ( strstr(buf, "CHARUID=0") == buf )) // CHARUID= - p += 8; - else if (( buf[0] == 'L' ) && ( strstr(buf, "LASTCHARUID=0") == buf )) // LASTCHARUID= - p += 12; - else if (( buf[0] == 'L' ) && ( strstr(buf, "LINK=0") == buf )) // LINK= - p += 5; - else if (( buf[0] == 'M' ) && ( strstr(buf, "MEMBER=0") == buf )) // MEMBER= - { - p += 7; - bSpecial = true; - } - else if (( buf[0] == 'M' ) && ( strstr(buf, "MORE1=0") == buf )) // MORE1= - p += 6; - else if (( buf[0] == 'M' ) && ( strstr(buf, "MORE2=0") == buf )) // MORE2= - p += 6; - else if (( buf[0] == 'S' ) && ( strstr(buf, "SERIAL=0") == buf )) // SERIAL= - p += 7; - else if ((( buf[0] == 'T' ) && ( strstr(buf, "TAG.") == buf )) || // TAG.= - (( buf[0] == 'R' ) && ( strstr(buf, "REGION.TAG") == buf ))) - { - while ( *p && (*p != '=') ) - ++p; - ++p; - } - else if (( i == 2 ) && strchr(buf, '=')) // spheredata.scp - plain VARs - { - while ( *p && (*p != '=') ) - ++p; - ++p; - } - else p = NULL; - - // UIDs are always hex, so prefixed by 0 - if ( p && ( *p != '0' )) p = NULL; - - // here we got potentialy UID-contained variable - // check if it really is only UID-like var containing - if ( p ) - { - p1 = p; - while ( *p1 && (((*p1 >= '0') && (*p1 <= '9')) || ((*p1 >= 'a') && (*p1 <= 'f'))) ) - ++p1; - - if ( !bSpecial ) - { - if ( *p1 && ( *p1 != '\r' ) && ( *p1 != '\n' )) // some more text in line - p = NULL; - } - } - - // here we definitely know that this is very uid-like - if ( p ) - { - c = *p1; - - *p1 = 0; - // here in p we have the current value of the line. - // check if it is a valid UID - - // prepare converting 0.. to 0x.. - c1 = *(p-1); - c2 = *p; - *(p-1) = '0'; - *p = 'x'; - --p; - uid = strtoul(p, &p1, 16); - ++p; - *(p-1) = c1; - *p = c2; - // Note 28-Jun-2004 - // The search algourytm is very simple and fast. But maybe integrate some other, at least /2 algorythm - // since has amount/2 tryes at worst chance to get the item and never scans the whole array - // It should improve speed since defragmenting 150Mb saves takes ~2:30 on 2.0Mhz CPU - { - DWORD dStep = dTotalUIDs/2; - d = dStep; - for (;;) - { - dStep /= 2; - - if ( uids[d] == uid ) - { - uid = d | (uids[d]&0xF0000000); // do not forget attach item and special flags like 04.. - break; - } - else if ( uids[d] < uid ) d += dStep; - else d -= dStep; - - if ( dStep == 1 ) - { - uid = DWORD_MAX; - break; // did not find the UID - } - } - } - - // Search for this uid in the table - /*for ( d = 0; d < dTotalUIDs; ++d ) - { - if ( !uids[d] ) // end of array - { - uid = DWORD_MAX; - break; - } - else if ( uids[d] == uid ) - { - uid = d | (uids[d]&0xF0000000); // do not forget attach item and special flags like 04.. - break; - } - }*/ - - // replace UID by the new one since it has been found - *p1 = c; - if ( uid != DWORD_MAX ) - { - *p = 0; - strncpy(z, p1, sizeof(z)); - z[sizeof(z) - 1] = '\0'; - snprintf(z1, sizeof(z1), "0%" FMTDWORDH, uid); - strncat(buf, z1, sizeof(buf) - strlen(buf) - 1); - strncat(buf, z, sizeof(buf) - strlen(buf) - 1); - } - } - // output the resulting line - ouf.Write(buf, strlen(buf)); - } - inf.Close(); - ouf.Close(); - } - free(uids); - g_Log.Event(LOGL_EVENT, "Defragmentation complete\n"); -} - #ifdef _WIN32 -int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) +int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { UNREFERENCED_PARAMETER(hPrevInstance); + UNREFERENCED_PARAMETER(lpCmdLine); - TCHAR *argv[32]; - argv[0] = NULL; - int argc = Str_ParseCmds(lpCmdLine, &argv[1], COUNTOF(argv) - 1, " \t") + 1; - - NTWindow_Init(hInstance, lpCmdLine, nCmdShow); - int iRet = Sphere_MainEntryPoint(argc, argv); + NTWindow_Init(hInstance, nShowCmd); + int iRet = Sphere_MainEntryPoint(); NTWindow_Exit(); TerminateProcess(GetCurrentProcess(), iRet); return iRet; } -int Sphere_MainEntryPoint( int argc, char *argv[] ) +int Sphere_MainEntryPoint() #else int _cdecl main( int argc, char * argv[] ) #endif { #ifdef EXCEPTIONS_DEBUG - const char *m_sClassName = "Sphere"; + const char *m_sClassName = SPHERE_TITLE; #endif EXC_TRY("Main"); @@ -1109,7 +788,7 @@ int _cdecl main( int argc, char * argv[] ) g_UnixTerminal.prepare(); #endif - g_Serv.m_iExitFlag = Sphere_InitServer( argc, argv ); + g_Serv.m_iExitFlag = Sphere_InitServer(); if ( ! g_Serv.m_iExitFlag ) { WritePidFile(0); diff --git a/src/graysvr/graysvr.h b/src/graysvr/graysvr.h index 8f902886..7e8d6940 100644 --- a/src/graysvr/graysvr.h +++ b/src/graysvr/graysvr.h @@ -237,9 +237,9 @@ private: const LPCTSTR g_szCompiledDate = __DATE__; -extern int Sphere_InitServer( int argc, char *argv[] ); +extern int Sphere_InitServer(); extern void Sphere_ExitServer(); -extern int Sphere_MainEntryPoint( int argc, char *argv[] ); +extern int Sphere_MainEntryPoint(); /////////////////////////////////////////////////////////////// // -CGrayUID