From 47e5064885a6dc700196e70aa28372b1d2bb6781 Mon Sep 17 00:00:00 2001 From: def Date: Fri, 14 Aug 2015 23:15:42 +0200 Subject: Add fifo console support for server (from DDNet) --- src/engine/shared/fifoconsole.cpp | 91 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/engine/shared/fifoconsole.cpp (limited to 'src/engine/shared/fifoconsole.cpp') diff --git a/src/engine/shared/fifoconsole.cpp b/src/engine/shared/fifoconsole.cpp new file mode 100644 index 00000000..e031b142 --- /dev/null +++ b/src/engine/shared/fifoconsole.cpp @@ -0,0 +1,91 @@ +#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_create(ListenFifoThread, this); + m_pConsole = pConsole; + m_flag = flag; + + pthread_detach((pthread_t)m_pFifoThread); +} + +FifoConsole::~FifoConsole() +{ + if(m_pFifoFile[0] == '\0') + return; + + lock_wait(gs_FifoLock); + gs_stopFifoThread = true; + lock_release(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_release(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); + f.close(); + } +} +#endif -- cgit 1.4.1