diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index c676a0d35..9a00dc0a5 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -42,7 +42,7 @@ #include #include #include -#include +#include #include @@ -2652,6 +2652,10 @@ void CClient::Run() // process pending commands m_pConsole->StoreCommands(false); +#if defined(CONF_FAMILY_UNIX) + m_Fifo.Init(m_pConsole, g_Config.m_ClInputFifo, CFGFLAG_CLIENT); +#endif + bool LastD = false; bool LastQ = false; bool LastE = false; @@ -2796,6 +2800,10 @@ void CClient::Run() if(State() == IClient::STATE_QUITING) break; +#if defined(CONF_FAMILY_UNIX) + m_Fifo.Update(); +#endif + // beNice if(g_Config.m_ClCpuThrottle) net_socket_read_wait(m_NetClient[0].m_Socket, g_Config.m_ClCpuThrottle * 1000); @@ -2813,6 +2821,10 @@ void CClient::Run() m_LocalTime = (time_get()-m_LocalStartTime)/(float)time_freq(); } +#if defined(CONF_FAMILY_UNIX) + m_Fifo.Shutdown(); +#endif + GameClient()->OnShutdown(); Disconnect(); @@ -3444,10 +3456,6 @@ int main(int argc, const char **argv) // ignore_convention pClient->Engine()->InitLogfile(); -#if defined(CONF_FAMILY_UNIX) - FifoConsole *fifoConsole = new FifoConsole(pConsole, g_Config.m_ClInputFifo, CFGFLAG_CLIENT); -#endif - #if defined(CONF_FAMILY_WINDOWS) if(!g_Config.m_ClShowConsole) FreeConsole(); @@ -3460,10 +3468,6 @@ int main(int argc, const char **argv) // ignore_convention dbg_msg("client", "starting..."); pClient->Run(); -#if defined(CONF_FAMILY_UNIX) - delete fifoConsole; -#endif - // write down the config and quit pConfig->Save(); diff --git a/src/engine/client/client.h b/src/engine/client/client.h index 8c45f0f28..7bed98ad6 100644 --- a/src/engine/client/client.h +++ b/src/engine/client/client.h @@ -194,6 +194,10 @@ class CClient : public IClient, public CDemoPlayer::IListener char m_aDDNetSrvListToken[4]; bool m_DDNetSrvListTokenSet; +#if defined(CONF_FAMILY_UNIX) + CFifo m_Fifo; +#endif + public: IEngine *Engine() { return m_pEngine; } IEngineGraphics *Graphics() { return m_pGraphics; } diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 3b8ec7d7b..dd9847ee2 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include @@ -1522,6 +1522,9 @@ void CServer::PumpNetwork() m_ServerBan.Update(); m_Econ.Update(); +#if defined(CONF_FAMILY_UNIX) + m_Fifo.Update(); +#endif } char *CServer::GetMapName() @@ -1642,6 +1645,10 @@ int CServer::Run() m_Econ.Init(Console(), &m_ServerBan); +#if defined(CONF_FAMILY_UNIX) + m_Fifo.Init(Console(), g_Config.m_SvInputFifo, CFGFLAG_SERVER); +#endif + char aBuf[256]; str_format(aBuf, sizeof(aBuf), "server name is '%s'", g_Config.m_SvName); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); @@ -1802,10 +1809,14 @@ int CServer::Run() { if(m_aClients[i].m_State != CClient::STATE_EMPTY) m_NetServer.Drop(i, "Server shutdown"); - - m_Econ.Shutdown(); } + m_Econ.Shutdown(); + +#if defined(CONF_FAMILY_UNIX) + m_Fifo.Shutdown(); +#endif + GameServer()->OnShutdown(); m_pMap->Unload(); @@ -2237,10 +2248,6 @@ int main(int argc, const char **argv) // ignore_convention pConsole->Register("sv_rescue", "", CFGFLAG_SERVER, CServer::ConRescue, pConsole, "Allow /rescue command so players can teleport themselves out of freeze"); pEngine->InitLogfile(); - -#if defined(CONF_FAMILY_UNIX) - FifoConsole *fifoConsole = new FifoConsole(pConsole, g_Config.m_SvInputFifo, CFGFLAG_SERVER); -#endif pServer->InitRconPasswordIfEmpty(); // run the server @@ -2248,9 +2255,6 @@ int main(int argc, const char **argv) // ignore_convention pServer->Run(); // free -#if defined(CONF_FAMILY_UNIX) - delete fifoConsole; -#endif delete pServer; delete pKernel; delete pEngineMap; diff --git a/src/engine/server/server.h b/src/engine/server/server.h index 6c4c9d307..03b66c67f 100644 --- a/src/engine/server/server.h +++ b/src/engine/server/server.h @@ -15,6 +15,7 @@ #include #include #include +#include #include class CSnapIDPool @@ -154,6 +155,9 @@ public: CSnapIDPool m_IDPool; CNetServer m_NetServer; CEcon m_Econ; +#if defined(CONF_FAMILY_UNIX) + CFifo m_Fifo; +#endif CServerBan m_ServerBan; IEngineMap *m_pMap; diff --git a/src/engine/shared/fifo.cpp b/src/engine/shared/fifo.cpp new file mode 100644 index 000000000..bffc2eb45 --- /dev/null +++ b/src/engine/shared/fifo.cpp @@ -0,0 +1,70 @@ +#include "fifo.h" + +#if defined(CONF_FAMILY_UNIX) + +#include + +#include +#include +#include +#include +#include + +void CFifo::Init(IConsole *pConsole, char *pFifoFile, int Flag) +{ + m_File = NULL; + + m_pConsole = pConsole; + if(pFifoFile[0] == '\0') + return; + + m_Flag = Flag; + + mkfifo(pFifoFile, 0600); + + struct stat attribute; + stat(pFifoFile, &attribute); + + if(!S_ISFIFO(attribute.st_mode)) + { + dbg_msg("fifo", "'%s' is not a fifo, removing", pFifoFile); + fs_remove(pFifoFile); + mkfifo(pFifoFile, 0600); + stat(pFifoFile, &attribute); + + if(!S_ISFIFO(attribute.st_mode)) + { + dbg_msg("fifo", "can't remove file '%s', quitting", pFifoFile); + exit(2); + } + } + + int fileFD = open(pFifoFile, O_RDONLY|O_NONBLOCK); + if(fileFD >= 0) + m_File = fdopen(fileFD, "r"); + if(m_File == NULL) + dbg_msg("fifo", "can't open file '%s'", pFifoFile); +} + +void CFifo::Shutdown() +{ + fclose(m_File); +} + +void CFifo::Update() +{ + if(m_File == NULL) + return; + + char aBuf[8192]; + + while(true) + { + char *pResult = fgets(aBuf, sizeof(aBuf), m_File); + if(pResult != NULL) + m_pConsole->ExecuteLineFlag(pResult, m_Flag, -1); + else + break; + } +} +#endif diff --git a/src/engine/shared/fifo.h b/src/engine/shared/fifo.h new file mode 100644 index 000000000..e8c85f275 --- /dev/null +++ b/src/engine/shared/fifo.h @@ -0,0 +1,24 @@ +#ifndef ENGINE_SHARED_FIFO_H +#define ENGINE_SHARED_FIFO_H + +#include + +#if defined(CONF_FAMILY_UNIX) + +#include // FILE + +class CFifo +{ + IConsole *m_pConsole; + int m_Flag; + FILE *m_File; + +public: + void Init(IConsole *pConsole, char *pFifoFile, int Flag); + void Update(); + void Shutdown(); +}; + +#endif + +#endif diff --git a/src/engine/shared/fifoconsole.cpp b/src/engine/shared/fifoconsole.cpp deleted file mode 100644 index 6231da5f3..000000000 --- a/src/engine/shared/fifoconsole.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "fifoconsole.h" - -#if defined(CONF_FAMILY_UNIX) - -#include - -#include - -#include -#include -#include -#include - -static LOCK gs_FifoLock = 0; -static volatile bool gs_stopFifoThread = false; - -FifoConsole::FifoConsole(IConsole *pConsole, char *pFifoFile, int flag) -{ - m_pFifoFile = pFifoFile; - if(m_pFifoFile[0] == '\0') - return; - - gs_stopFifoThread = false; - if(gs_FifoLock == 0) - gs_FifoLock = lock_create(); - - m_pFifoThread = thread_init(ListenFifoThread, this); - m_pConsole = pConsole; - m_flag = flag; - - thread_detach(m_pFifoThread); -} - -FifoConsole::~FifoConsole() -{ - if(m_pFifoFile[0] == '\0') - return; - - lock_wait(gs_FifoLock); - gs_stopFifoThread = true; - lock_unlock(gs_FifoLock); - gs_FifoLock = 0; -} - -void FifoConsole::ListenFifoThread(void *pUser) -{ - FifoConsole *pData = (FifoConsole *)pUser; - - if(!gs_FifoLock) - { - dbg_msg("fifo", "fifo not properly initialized"); - exit(2); - } - - lock_wait(gs_FifoLock); - if(gs_stopFifoThread) - return; - - mkfifo(pData->m_pFifoFile, 0600); - - struct stat attribute; - stat(pData->m_pFifoFile, &attribute); - - if(!S_ISFIFO(attribute.st_mode)) - { - dbg_msg("fifo", "'%s' is not a fifo, removing", pData->m_pFifoFile); - fs_remove(pData->m_pFifoFile); - mkfifo(pData->m_pFifoFile, 0600); - stat(pData->m_pFifoFile, &attribute); - - if(!S_ISFIFO(attribute.st_mode)) - { - dbg_msg("fifo", "can't remove file, quitting"); - exit(2); - } - } - - lock_unlock(gs_FifoLock); - - std::ifstream f; - char aBuf[8192]; - - while (true) - { - f.open(pData->m_pFifoFile); - while (f.getline(aBuf, sizeof(aBuf))) - pData->m_pConsole->ExecuteLineFlag(aBuf, pData->m_flag, -1); - f.close(); - } -} -#endif diff --git a/src/engine/shared/fifoconsole.h b/src/engine/shared/fifoconsole.h deleted file mode 100644 index 83d14bc01..000000000 --- a/src/engine/shared/fifoconsole.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef ENGINE_FIFOCONSOLE_H -#define ENGINE_FIFOCONSOLE_H - -#include - -#if defined(CONF_FAMILY_UNIX) - -class FifoConsole -{ - static void ListenFifoThread(void *pUser); - IConsole *m_pConsole; - void *m_pFifoThread; - char *m_pFifoFile; - int m_flag; - -public: - FifoConsole(IConsole *pConsole, char *pFifoFile, int flag); - ~FifoConsole(); -}; -#endif - -#endif // FILE_ENGINE_FIFOCONSOLE_H