From 07aa44992bacafe643d2d0cdafa427f79a149378 Mon Sep 17 00:00:00 2001 From: XTZGZoReX Date: Mon, 9 Nov 2009 02:24:12 +0100 Subject: [PATCH] [8797] Merge WorldLog class into Log class. * Added AuthSocket::SendPacket() function. * Packet logging now also possible in realmd. * realmd.conf.dist.in updated (added "WorldLogFile" setting). --- src/game/Makefile.am | 2 - src/game/WorldLog.cpp | 47 --------------------- src/game/WorldLog.h | 76 ---------------------------------- src/game/WorldSocket.cpp | 52 +++++++++++------------ src/realmd/AuthSocket.cpp | 68 ++++++++++++++++++++++++++---- src/realmd/AuthSocket.h | 3 ++ src/realmd/realmd.conf.dist.in | 5 +++ src/shared/Log.cpp | 17 +++++++- src/shared/Log.h | 10 ++++- src/shared/revision_nr.h | 2 +- win/VC100/game.vcxproj | 2 - win/VC80/game.vcproj | 8 ---- win/VC90/game.vcproj | 8 ---- 13 files changed, 117 insertions(+), 183 deletions(-) delete mode 100644 src/game/WorldLog.cpp delete mode 100644 src/game/WorldLog.h diff --git a/src/game/Makefile.am b/src/game/Makefile.am index 39a6cb5b8..d13bc32af 100644 --- a/src/game/Makefile.am +++ b/src/game/Makefile.am @@ -283,8 +283,6 @@ libmangosgame_a_SOURCES = \ Weather.h \ World.cpp \ World.h \ - WorldLog.cpp \ - WorldLog.h \ WorldSession.cpp \ WorldSession.h \ WorldSocket.cpp \ diff --git a/src/game/WorldLog.cpp b/src/game/WorldLog.cpp deleted file mode 100644 index 6b6f6f337..000000000 --- a/src/game/WorldLog.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** \file - \ingroup u2w -*/ - -#include "WorldLog.h" -#include "Policies/SingletonImp.h" -#include "Config/ConfigEnv.h" - -#define CLASS_LOCK MaNGOS::ClassLevelLockable -INSTANTIATE_SINGLETON_2(WorldLog, CLASS_LOCK); -INSTANTIATE_CLASS_MUTEX(WorldLog, ACE_Thread_Mutex); - -/// Open the log file (if specified so in the configuration file) -void WorldLog::Initialize() -{ - std::string logsDir = sConfig.GetStringDefault("LogsDir",""); - - if(!logsDir.empty()) - { - if((logsDir.at(logsDir.length()-1)!='/') && (logsDir.at(logsDir.length()-1)!='\\')) - logsDir.append("/"); - } - - std::string logname = sConfig.GetStringDefault("WorldLogFile", ""); - if(!logname.empty()) - { - i_file = fopen((logsDir+logname).c_str(), "w"); - } -} diff --git a/src/game/WorldLog.h b/src/game/WorldLog.h deleted file mode 100644 index eb11b48a5..000000000 --- a/src/game/WorldLog.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/// \addtogroup u2w -/// @{ -/// \file - -#ifndef MANGOS_WORLDLOG_H -#define MANGOS_WORLDLOG_H - -#include "Common.h" -#include "Policies/Singleton.h" -#include "Errors.h" - -#include - -/// %Log packets to a file -class MANGOS_DLL_DECL WorldLog : public MaNGOS::Singleton > -{ - friend class MaNGOS::OperatorNew; - WorldLog() : i_file(NULL) { Initialize(); } - WorldLog(const WorldLog &); - WorldLog& operator=(const WorldLog &); - typedef MaNGOS::ClassLevelLockable::Lock Guard; - - /// Close the file in destructor - ~WorldLog() - { - if( i_file != NULL ) - fclose(i_file); - i_file = NULL; - } - - public: - void Initialize(); - /// Is the world logger active? - bool LogWorld(void) const { return (i_file != NULL); } - /// %Log to the file - void Log(char const *fmt, ...) - { - if( LogWorld() ) - { - Guard guard(*this); - ASSERT(i_file); - - va_list args; - va_start(args, fmt); - vfprintf(i_file, fmt, args); - va_end(args); - - fflush(i_file); - } - } - - private: - FILE *i_file; -}; - -#define sWorldLog WorldLog::Instance() -#endif -/// @} diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp index 1de190ba5..886755359 100644 --- a/src/game/WorldSocket.cpp +++ b/src/game/WorldSocket.cpp @@ -42,7 +42,6 @@ #include "WorldSession.h" #include "WorldSocketMgr.h" #include "Log.h" -#include "WorldLog.h" #if defined( __GNUC__ ) #pragma pack(1) @@ -166,24 +165,21 @@ int WorldSocket::SendPacket (const WorldPacket& pct) return -1; // Dump outgoing packet. - if (sWorldLog.LogWorld ()) + if (sLog.IsLogWorld()) { - sWorldLog.Log ("SERVER:\nSOCKET: %u\nLENGTH: %u\nOPCODE: %s (0x%.4X)\nDATA:\n", - (uint32) get_handle (), - pct.size (), - LookupOpcodeName (pct.GetOpcode ()), - pct.GetOpcode ()); + sLog.outWorld("S->C - SOCKET: %u LENGTH: %u OPCODE: %s (0x%.4X)\n", + uint32(get_handle()), pct.size (), LookupOpcodeName(pct.GetOpcode()), pct.GetOpcode()); - uint32 p = 0; - while (p < pct.size ()) + size_t p = 0; + while (p < pct.size()) { - for (uint32 j = 0; j < 16 && p < pct.size (); j++) - sWorldLog.Log ("%.2X ", const_cast(pct)[p++]); + for (size_t j = 0; j < 16 && p < pct.size(); ++j) + sLog.outWorld("%.2X ", const_cast(pct)[p++]); - sWorldLog.Log ("\n"); + sLog.outWorld("\n"); } - sWorldLog.Log ("\n\n"); + sLog.outWorld("\n\n"); } ServerPktHeader header(pct.size()+2, pct.GetOpcode()); @@ -682,25 +678,25 @@ int WorldSocket::ProcessIncoming (WorldPacket* new_pct) return -1; // Dump received packet. - if (sWorldLog.LogWorld ()) + if (sLog.IsLogWorld()) { - sWorldLog.Log ("CLIENT:\nSOCKET: %u\nLENGTH: %u\nOPCODE: %s (0x%.4X)\nDATA:\n", - (uint32) get_handle (), - new_pct->size (), - LookupOpcodeName (new_pct->GetOpcode ()), - new_pct->GetOpcode ()); + sLog.outWorld("C->S - SOCKET: %u LENGTH: %u OPCODE: %s (0x%.4X)\n", + uint32(get_handle()), new_pct->size(), LookupOpcodeName(new_pct->GetOpcode()), new_pct->GetOpcode()); - uint32 p = 0; - while (p < new_pct->size ()) + size_t p = 0; + while (p < new_pct->size()) { - for (uint32 j = 0; j < 16 && p < new_pct->size (); j++) - sWorldLog.Log ("%.2X ", (*new_pct)[p++]); - sWorldLog.Log ("\n"); + for (size_t j = 0; j < 16 && p < new_pct->size(); ++j) + sLog.outWorld("%.2X ", (*new_pct)[p++]); + + sLog.outWorld("\n"); } - sWorldLog.Log ("\n\n"); + + sLog.outWorld("\n\n"); } - try { + try + { switch(opcode) { case CMSG_PING: @@ -738,13 +734,13 @@ int WorldSocket::ProcessIncoming (WorldPacket* new_pct) } } } - catch(ByteBufferException &) + catch (ByteBufferException &) { sLog.outError("WorldSocket::ProcessIncoming ByteBufferException occured while parsing an instant handled packet (opcode: %u) from client %s, accountid=%i. Disconnected client.", opcode, GetRemoteAddress().c_str(), m_Session?m_Session->GetAccountId():-1); if(sLog.IsOutDebug()) { - sLog.outDebug("Dumping error causing packet:"); + sLog.outDebug("Dumping error-causing packet:"); new_pct->hexlike(); } diff --git a/src/realmd/AuthSocket.cpp b/src/realmd/AuthSocket.cpp index f1c1027b6..2c344fe24 100644 --- a/src/realmd/AuthSocket.cpp +++ b/src/realmd/AuthSocket.cpp @@ -22,7 +22,6 @@ #include "Common.h" #include "Database/DatabaseEnv.h" -#include "ByteBuffer.h" #include "Config/ConfigEnv.h" #include "Log.h" #include "RealmList.h" @@ -252,14 +251,37 @@ void AuthSocket::OnRead() ///- Read the packet TcpSocket::OnRead(); uint8 _cmd; - while (1) + while (true) { if (!ibuf.GetLength()) return; - ///- Get the command out of it + ///- Get the command out of it. We can assume it's there, since length is not 0. ibuf.SoftRead((char *)&_cmd, 1); // UQ1: No longer exists in new net code ??? + // Dump incoming packet. + if (sLog.IsLogWorld()) + { + sLog.outWorld ("C->S - SOCKET: %u LENGTH: %u OPCODE: 0x%.4X\n", + GetSocket(), ibuf.GetLength(), _cmd); + + size_t p = 0; + while (p < ibuf.GetLength()) + { + char dest; + for (size_t j = 0; j < 16 && p < ibuf.GetLength(); ++j) + { + ibuf.SoftRead(&dest, 1); + sLog.outWorld("%.2X ", *((uint8*)dest)); + p++; + } + + sLog.outWorld("\n"); + } + + sLog.outWorld("\n\n"); + } + size_t i; ///- Circle through known commands and call the correct command handler @@ -289,7 +311,34 @@ void AuthSocket::OnRead() } } -/// Make the SRP6 calculation from hash in dB +void AuthSocket::SendPacket(ByteBuffer* buf) +{ + // TODO: Also handle outgoing structs? + + uint8 _cmd = buf->read(); + + // Dump outgoing packet. + if (sLog.IsLogWorld()) + { + sLog.outWorld ("S->C - SOCKET: %u LENGTH: %u OPCODE: 0x%.4X\n", + GetSocket(), buf->size(), _cmd); + + size_t p = 0; + while (p < buf->size()) + { + for (size_t j = 0; j < 16 && p < buf->size(); ++j) + sLog.outWorld("%.2X ", (*buf)[p++]); + + sLog.outWorld("\n"); + } + + sLog.outWorld("\n\n"); + } + + SendBuf((char const*)buf->contents(), buf->size()); +} + +/// Make the SRP6 calculation from hash in DB void AuthSocket::_SetVSFields(const std::string& rI) { s.SetRand(s_BYTE_SIZE * 8); @@ -521,7 +570,8 @@ bool AuthSocket::_HandleLogonChallenge() pkt<< (uint8) REALM_AUTH_NO_MATCH; } } - SendBuf((char const*)pkt.contents(), pkt.size()); + + SendPacket(&pkt); return true; } @@ -567,7 +617,7 @@ bool AuthSocket::_HandleLogonProof() pkt << (uint8) REALM_AUTH_WRONG_BUILD_NUMBER; DEBUG_LOG("[AuthChallenge] %u is not a valid client version!", _build); DEBUG_LOG("[AuthChallenge] Patch %s not found", tmp); - SendBuf((char const*)pkt.contents(), pkt.size()); + SendPacket(&pkt); return true; } else // have patch @@ -807,7 +857,7 @@ bool AuthSocket::_HandleReconnectChallenge() _reconnectProof.SetRand(16 * 8); pkt.append(_reconnectProof.AsByteArray(16),16); // 16 bytes random pkt << (uint64) 0x00 << (uint64) 0x00; // 16 bytes zeros - SendBuf((char const*)pkt.contents(), pkt.size()); + SendPacket(&pkt); return true; } @@ -839,7 +889,7 @@ bool AuthSocket::_HandleReconnectProof() pkt << (uint8) AUTH_RECONNECT_PROOF; pkt << (uint8) 0x00; pkt << (uint16) 0x00; // 2 bytes zeros - SendBuf((char const*)pkt.contents(), pkt.size()); + SendPacket(&pkt); ///- Set _authed to true! _authed = true; @@ -921,7 +971,7 @@ bool AuthSocket::_HandleRealmList() hdr << (uint16)pkt.size(); hdr.append(pkt); - SendBuf((char const*)hdr.contents(), hdr.size()); + SendPacket(&pkt); return true; } diff --git a/src/realmd/AuthSocket.h b/src/realmd/AuthSocket.h index cf82f34f7..be91a99cd 100644 --- a/src/realmd/AuthSocket.h +++ b/src/realmd/AuthSocket.h @@ -24,6 +24,7 @@ #define _AUTHSOCKET_H #include "Common.h" +#include "ByteBuffer.h" #include "Auth/BigNumber.h" #include "sockets/TcpSocket.h" #include "sockets/SocketHandler.h" @@ -55,6 +56,8 @@ class AuthSocket: public TcpSocket bool _HandleXferCancel(); bool _HandleXferAccept(); + void SendPacket(ByteBuffer* buf); + void _SetVSFields(const std::string& rI); FILE *pPatch; diff --git a/src/realmd/realmd.conf.dist.in b/src/realmd/realmd.conf.dist.in index 217cb15d2..286cd900a 100644 --- a/src/realmd/realmd.conf.dist.in +++ b/src/realmd/realmd.conf.dist.in @@ -49,6 +49,10 @@ ConfVersion=2007062001 # Default: "Realmd.log" # "" - empty name disable creating log file # +# WorldLogFile +# Packet logging file for the realmserver +# Default: "world.log" +# # LogTimestamp # Logfile with timestamp of server start in name # Default: 0 - no timestamp in name @@ -105,6 +109,7 @@ PidFile = "" LogLevel = 0 LogTime = 0 LogFile = "Realmd.log" +WorldLogFile = "" LogTimestamp = 0 LogFileLevel = 0 LogColors = "" diff --git a/src/shared/Log.cpp b/src/shared/Log.cpp index 15600ed7a..c46cb0d4e 100644 --- a/src/shared/Log.cpp +++ b/src/shared/Log.cpp @@ -225,9 +225,9 @@ void Log::Initialize() } charLogfile = openLogFile("CharLogFile","CharLogTimestamp","a"); - dberLogfile = openLogFile("DBErrorLogFile",NULL,"a"); raLogfile = openLogFile("RaLogFile",NULL,"a"); + worldLogfile = openLogFile("WorldLogFile",NULL,"a"); // Main log file settings m_includeTime = sConfig.GetBoolDefault("LogTime", false); @@ -698,6 +698,21 @@ void Log::outChar(const char * str, ... ) } } +void Log::outWorld( const char * str, ... ) +{ + if (!str) + return; + + if (worldLogfile) + { + va_list args; + va_start(args, str); + vfprintf(worldLogfile, str, args); + va_end(args); + fflush(worldLogfile); + } +} + void Log::outCharDump( const char * str, uint32 account_id, uint32 guid, const char * name ) { if(charLogfile) diff --git a/src/shared/Log.h b/src/shared/Log.h index c9c004512..e4c596979 100644 --- a/src/shared/Log.h +++ b/src/shared/Log.h @@ -80,6 +80,10 @@ class Log : public MaNGOS::Singleton 2 || (m_logFileLevel > 2 && logfile); } bool IsOutCharDump() const { return m_charLog_Dump; } + bool IsLogWorld() const { return (worldLogfile); } bool IsIncludeTime() const { return m_includeTime; } private: FILE* openLogFile(char const* configFileName,char const* configTimeStampFlag, char const* mode); @@ -128,6 +135,7 @@ class Log : public MaNGOS::Singleton::Instance() #ifdef MANGOS_DEBUG -#define DEBUG_LOG MaNGOS::Singleton::Instance().outDebug +#define DEBUG_LOG sLog.outDebug #else #define DEBUG_LOG #endif diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index e9537ab6a..dacf6c37f 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8796" + #define REVISION_NR "8797" #endif // __REVISION_NR_H__ diff --git a/win/VC100/game.vcxproj b/win/VC100/game.vcxproj index 6b648c5ac..eaa5566eb 100644 --- a/win/VC100/game.vcxproj +++ b/win/VC100/game.vcxproj @@ -488,7 +488,6 @@ - @@ -621,7 +620,6 @@ - diff --git a/win/VC80/game.vcproj b/win/VC80/game.vcproj index a7b62a9f2..590a5dc25 100644 --- a/win/VC80/game.vcproj +++ b/win/VC80/game.vcproj @@ -1485,14 +1485,6 @@ RelativePath="..\..\src\game\SharedDefines.h" > - - - - diff --git a/win/VC90/game.vcproj b/win/VC90/game.vcproj index 613c6f080..d860b9f9f 100644 --- a/win/VC90/game.vcproj +++ b/win/VC90/game.vcproj @@ -1486,14 +1486,6 @@ RelativePath="..\..\src\game\SharedDefines.h" > - - - -