Improve stopping control of the service Modified: trunk/reactos/services/tcpsvcs/chargen.c Modified: trunk/reactos/services/tcpsvcs/discard.c Modified: trunk/reactos/services/tcpsvcs/echo.c Modified: trunk/reactos/services/tcpsvcs/qotd.c Modified: trunk/reactos/services/tcpsvcs/skelserver.c Modified: trunk/reactos/services/tcpsvcs/tcpsvcs.c _____
Modified: trunk/reactos/services/tcpsvcs/chargen.c --- trunk/reactos/services/tcpsvcs/chargen.c 2005-11-17 21:12:27 UTC (rev 19311) +++ trunk/reactos/services/tcpsvcs/chargen.c 2005-11-17 21:35:56 UTC (rev 19312) @@ -17,6 +17,8 @@
#include <tchar.h> #include "tcpsvcs.h"
+extern BOOL bShutDown; + DWORD WINAPI ChargenHandler(VOID* Sock_) { DWORD RetVal = 0; @@ -60,7 +62,7 @@
/* where we will start output from */ loopIndex = 0; - while (1) + while (! bShutDown) { /* if the loop index is equal to the last char, * start the loop again from the beginning */ @@ -82,14 +84,17 @@ Line[LINESIZ - 2] = L'\r'; Line[LINESIZ - 1] = L'\n';
- if (!SendLine(Sock, Line)) + if (! SendLine(Sock, Line)) break;
/* increment loop index to start printing from next char in ring */ loopIndex++; } - - return TRUE; + + if (bShutDown) + return FALSE; + else + return TRUE; }
BOOL SendLine(SOCKET Sock, TCHAR* Line) @@ -121,7 +126,7 @@ } else LogEvent(_T("Chargen: unknown error\n"), 0, FALSE); - //WSAGetLastError() + // return FALSE;
LogEvent(_T("Chargen: Connection closed by peer.\n"), 0, FALSE); return TRUE; _____
Modified: trunk/reactos/services/tcpsvcs/discard.c --- trunk/reactos/services/tcpsvcs/discard.c 2005-11-17 21:12:27 UTC (rev 19311) +++ trunk/reactos/services/tcpsvcs/discard.c 2005-11-17 21:35:56 UTC (rev 19312) @@ -14,6 +14,8 @@
#include "tcpsvcs.h"
+extern BOOL bShutDown; + DWORD WINAPI DiscardHandler(VOID* Sock_) { DWORD RetVal = 0; @@ -43,7 +45,7 @@ BOOL RecieveIncomingPackets(SOCKET Sock) { TCHAR ReadBuffer[BUF]; - TCHAR temp[512]; // temp for holding LogEvent text + TCHAR buf[256]; INT ReadBytes;
do @@ -51,17 +53,19 @@ ReadBytes = recv(Sock, ReadBuffer, BUF, 0); if (ReadBytes > 0) { - _stprintf(temp, _T("Received %d bytes from client\n"), ReadBytes); - LogEvent(temp, 0, FALSE); + _stprintf(buf, _T("Received %d bytes from client\n"), ReadBytes); + LogEvent(buf, 0, FALSE); } else if (ReadBytes == SOCKET_ERROR) { - _stprintf(temp, ("Socket Error: %d\n"), WSAGetLastError()); - LogEvent(temp, 0, TRUE); + _stprintf(buf, ("Socket Error: %d\n"), WSAGetLastError()); + LogEvent(buf, 0, TRUE); return FALSE; } - } while (ReadBytes > 0); + } while ((ReadBytes > 0) && (! bShutDown));
- LogEvent(_T("Discard: Connection closed by peer.\n"), 0, FALSE); + if (! bShutDown) + LogEvent(_T("Discard: Connection closed by peer.\n"), 0, FALSE); + return TRUE; } _____
Modified: trunk/reactos/services/tcpsvcs/echo.c --- trunk/reactos/services/tcpsvcs/echo.c 2005-11-17 21:12:27 UTC (rev 19311) +++ trunk/reactos/services/tcpsvcs/echo.c 2005-11-17 21:35:56 UTC (rev 19312) @@ -14,6 +14,8 @@
#include "tcpsvcs.h"
+extern BOOL bShutDown; + DWORD WINAPI EchoHandler(VOID* Sock_) { DWORD RetVal = 0; @@ -43,7 +45,7 @@ BOOL EchoIncomingPackets(SOCKET Sock) { TCHAR ReadBuffer[BUF]; - TCHAR temp[512]; // temp for holding LogEvent text + TCHAR buf[256]; // temp for holding LogEvent text INT Temp; INT ReadBytes; INT SentBytes; @@ -52,8 +54,8 @@ ReadBytes = recv(Sock, ReadBuffer, BUF, 0); if (ReadBytes > 0) { - _stprintf(temp, _T("Received %d bytes from client\n"), ReadBytes); - LogEvent(temp, 0, FALSE); + _stprintf(buf, _T("Received %d bytes from client\n"), ReadBytes); + LogEvent(buf, 0, FALSE);
SentBytes = 0; while (SentBytes < ReadBytes) @@ -62,8 +64,8 @@ ReadBytes - SentBytes, 0); if (Temp > 0) { - _stprintf(temp, _T("Sent %d bytes back to client\n"), Temp); - LogEvent(temp, 0, FALSE); + _stprintf(buf, _T("Sent %d bytes back to client\n"), Temp); + LogEvent(buf, 0, FALSE); SentBytes += Temp; } else if (Temp == SOCKET_ERROR) @@ -72,8 +74,8 @@ { /* Client closed connection before we could reply to all the data it sent, so quit early. */ - _stprintf(temp, _T("Peer unexpectedly dropped connection!\n")); - LogEvent(temp, 0, FALSE); + _stprintf(buf, _T("Peer unexpectedly dropped connection!\n")); + LogEvent(buf, 0, FALSE); return FALSE; } } @@ -81,8 +83,10 @@ else if (ReadBytes == SOCKET_ERROR) return FALSE;
- } while (ReadBytes != 0); + } while ((ReadBytes != 0) && (! bShutDown));
- LogEvent(_T("Echo: Connection closed by peer.\n"), 0, FALSE); + if (! bShutDown) + LogEvent(_T("Echo: Connection closed by peer.\n"), 0, FALSE); + return TRUE; } _____
Modified: trunk/reactos/services/tcpsvcs/qotd.c --- trunk/reactos/services/tcpsvcs/qotd.c 2005-11-17 21:12:27 UTC (rev 19311) +++ trunk/reactos/services/tcpsvcs/qotd.c 2005-11-17 21:35:56 UTC (rev 19312) @@ -44,10 +44,10 @@
LogEvent(_T("QOTD: Opening quotes file\n"), 0, FALSE); if ((fp = _tfopen(Sys, "r")) == NULL) { - TCHAR temp[512]; + TCHAR buf[256];
- _stprintf(temp, _T("QOTD: Error opening quote file : %s\n"), Sys); - LogEvent(temp, 0, TRUE); + _stprintf(buf, _T("QOTD: Error opening quote file : %s\n"), Sys); + LogEvent(buf, 0, TRUE); LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE); ExitThread(-1); } _____
Modified: trunk/reactos/services/tcpsvcs/skelserver.c --- trunk/reactos/services/tcpsvcs/skelserver.c 2005-11-17 21:12:27 UTC (rev 19311) +++ trunk/reactos/services/tcpsvcs/skelserver.c 2005-11-17 21:35:56 UTC (rev 19312) @@ -14,18 +14,18 @@
#include "tcpsvcs.h"
-extern BOOL bShutDownFlag; -extern BOOL bPauseFlag; +extern BOOL bShutDown; +extern BOOL bPause;
DWORD WINAPI StartServer(LPVOID lpParam) { SOCKET ListeningSocket; PSERVICES pServices; const TCHAR* HostIP = "127.0.0.1"; - TCHAR temp[512]; + TCHAR buf[256];
pServices = (PSERVICES)lpParam; - + //DebugBreak(); ListeningSocket = SetUpListener(HostIP, htons(pServices->Port)); if (ListeningSocket == INVALID_SOCKET) @@ -34,15 +34,14 @@ return 3; }
- _stprintf(temp, _T("%s is waiting for connections on port %d...\n"), + _stprintf(buf, _T("%s is waiting for connections on port %d...\n"), pServices->Name, pServices->Port); - LogEvent(temp, 0, FALSE); + LogEvent(buf, 0, FALSE);
- AcceptConnections(ListeningSocket, pServices->Service, pServices->Name); + if (! bShutDown) + AcceptConnections(ListeningSocket, pServices->Service, pServices->Name);
- LogEvent(_T("Detaching Winsock2...\n"), 0, FALSE); - WSACleanup(); - return 0; + ExitThread(0); }
@@ -72,7 +71,7 @@ /* note: consider allowing a maximum number of connections * A number of threads can be allocated and worker threads will * only be spawned if a free space is available - + typedef struct _WORKER_THREAD { DWORD num; BOOL available; @@ -91,7 +90,7 @@ FD_SET ReadFDS; INT nAddrSize = sizeof(Client); DWORD ThreadID; - TCHAR temp[512]; + TCHAR buf[256]; INT TimeOut = 2000; // 2 seconds
//DebugBreak(); @@ -102,7 +101,7 @@ TimeVal.tv_sec = TimeOut / 1000; TimeVal.tv_usec = TimeOut % 1000;
- while (! bShutDownFlag) // (i<MAX_CLIENTS && !bShutDownFlag) + while (! bShutDown) // (i<MAX_CLIENTS && !bShutDown) { FD_SET(ListeningSocket, &ReadFDS); if (select(0, &ReadFDS, NULL, NULL, &TimeVal) == SOCKET_ERROR) @@ -110,31 +109,32 @@ LogEvent(_T("select failed\n"), 0, TRUE); return; } - - if (FD_ISSET(ListeningSocket, &ReadFDS)) + + /* don't call FD_ISSET if bShutDown flag is set */ + if ((! bShutDown) || (FD_ISSET(ListeningSocket, &ReadFDS))) { Sock = accept(ListeningSocket, (SOCKADDR*)&Client, &nAddrSize); if (Sock != INVALID_SOCKET) { - _stprintf(temp, _T("Accepted connection to %s server from %s:%d\n"), + _stprintf(buf, _T("Accepted connection to %s server from %s:%d\n"), Name, inet_ntoa(Client.sin_addr), ntohs(Client.sin_port)); - LogEvent(temp, 0, FALSE); - _stprintf(temp, _T("Creating new thread for %s\n"), Name); - LogEvent(temp, 0, FALSE); + LogEvent(buf, 0, FALSE); + _stprintf(buf, _T("Creating new thread for %s\n"), Name); + LogEvent(buf, 0, FALSE);
hThread = CreateThread(0, 0, Service, (void*)Sock, 0, &ThreadID);
- /* Check the return value for success. */ + /* Check the return value for success. */ if (hThread == NULL) { - _stprintf(temp, _T("Failed to start worker thread for " + _stprintf(buf, _T("Failed to start worker thread for " "the %s server....\n"), Name); - LogEvent(temp, 0, TRUE); + LogEvent(buf, 0, TRUE); }
- //Do we need to wait, or just kill it? WaitForSingleObject(hThread, INFINITE); - + + CloseHandle(hThread); } else { @@ -147,7 +147,7 @@
BOOL ShutdownConnection(SOCKET Sock, BOOL bRec) { - TCHAR temp[512]; + TCHAR buf[256];
/* Disallow any further data sends. This will tell the other side that we want to go away now. If we skip this step, we don't @@ -171,8 +171,8 @@ return FALSE; else if (NewBytes != 0) { - _stprintf(temp, _T("FYI, received %d unexpected bytes during shutdown\n"), NewBytes); - LogEvent(temp, 0, FALSE); + _stprintf(buf, _T("FYI, received %d unexpected bytes during shutdown\n"), NewBytes); + LogEvent(buf, 0, FALSE); } }
_____
Modified: trunk/reactos/services/tcpsvcs/tcpsvcs.c --- trunk/reactos/services/tcpsvcs/tcpsvcs.c 2005-11-17 21:12:27 UTC (rev 19311) +++ trunk/reactos/services/tcpsvcs/tcpsvcs.c 2005-11-17 21:35:56 UTC (rev 19312) @@ -17,8 +17,8 @@
* - write debugging function and print all dbg info via that. * - change 'temp' to something meaningfull */ -
+ #include "tcpsvcs.h"
//#define NDEBUG @@ -34,8 +34,8 @@ static SERVICE_STATUS_HANDLE hSStat;
FILE *hLogFile; -BOOL bShutDownFlag = FALSE; -BOOL bPauseFlag = FALSE; +BOOL bShutDown = FALSE; +BOOL bPause = FALSE;
LPCTSTR LogFileName = "\tcpsvcs_log.log"; LPTSTR ServiceName = _T("Simp Tcp"); @@ -60,7 +60,7 @@ {ServiceName, ServiceMain}, {NULL, NULL} }; - + //DPRINT("Starting tcpsvcs service. See \system32%s for logs\n", LogFileName);
if (! StartServiceCtrlDispatcher(ServiceTable)) @@ -79,19 +79,19 @@
if(! GetSystemDirectory(LogFilePath, MAX_PATH)) return; - + _tcscat(LogFilePath, LogFileName);
hLogFile = fopen(LogFilePath, _T("w")); if (hLogFile == NULL) { - TCHAR *temp = NULL; - - _stprintf(temp, _T("Could not open log file: %s"), LogFilePath); - MessageBox(NULL, temp, NULL, MB_OK); + TCHAR buf[50]; + + _stprintf(buf, _T("Could not open log file: %s"), LogFilePath); + MessageBox(NULL, buf, NULL, MB_OK); return; } - + LogEvent(_T("Entering ServiceMain"), 0, FALSE);
hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; @@ -102,7 +102,7 @@ hServStatus.dwServiceSpecificExitCode = NO_ERROR; hServStatus.dwCheckPoint = 0; hServStatus.dwWaitHint = 2*CS_TIMEOUT; - + hSStat = RegisterServiceCtrlHandler(ServiceName, ServerCtrlHandler); if (hSStat == 0) LogEvent(_T("Failed to register service\n"), -1, TRUE); @@ -118,7 +118,7 @@ SetServiceStatus(hSStat, &hServStatus); return; } - + LogEvent(_T("Service threads shut down. Set SERVICE_STOPPED status"), 0, FALSE); /* We will only return here when the ServiceSpecific function completes, indicating system shutdown. */ @@ -137,14 +137,14 @@ { case SERVICE_CONTROL_SHUTDOWN: /* fall through */ case SERVICE_CONTROL_STOP: - bShutDownFlag = TRUE; + bShutDown = TRUE; UpdateStatus(SERVICE_STOP_PENDING, -1); break; case SERVICE_CONTROL_PAUSE: - bPauseFlag = TRUE; + bPause = TRUE; break; case SERVICE_CONTROL_CONTINUE: - bPauseFlag = FALSE; + bPause = FALSE; break; case SERVICE_CONTROL_INTERROGATE: break; @@ -164,13 +164,13 @@ hServStatus.dwCheckPoint++; else hServStatus.dwCheckPoint = Check; - + if (NewStatus >= 0) hServStatus.dwCurrentState = NewStatus; - + if (! SetServiceStatus (hSStat, &hServStatus)) LogEvent(_T("Cannot set service status"), -1, TRUE); - + return; }
@@ -180,17 +180,17 @@ DWORD dwThreadId[NUM_SERVICES]; HANDLE hThread[NUM_SERVICES]; WSADATA wsaData; - TCHAR temp[512]; // temp for holding LogEvent text + TCHAR buf[256]; // temp for holding LogEvent text INT i; DWORD RetVal; - + if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) { - _stprintf(temp, _T("WSAStartup() failed : %lu\n"), RetVal); - LogEvent(temp, RetVal, TRUE); + _stprintf(buf, _T("WSAStartup() failed : %lu\n"), RetVal); + LogEvent(buf, RetVal, TRUE); return -1; } - + UpdateStatus(-1, -1); /* increment checkpoint */
LogEvent(_T("Creating server Threads\n"), 0, FALSE); @@ -198,8 +198,8 @@ /* Create MAX_THREADS worker threads. */ for( i=0; i<NUM_SERVICES; i++ ) { - _stprintf(temp, _T("Starting %s server....\n"), Services[i].Name); - LogEvent(temp, 0, FALSE); + _stprintf(buf, _T("Starting %s server....\n"), Services[i].Name); + LogEvent(buf, 0, FALSE);
hThread[i] = CreateThread( NULL, // default security attributes @@ -212,14 +212,14 @@ /* Check the return value for success. */ if (hThread[i] == NULL) { - _stprintf(temp, _T("Failed to start %s server....\n"), Services[i].Name); + _stprintf(buf, _T("Failed to start %s server....\n"), Services[i].Name); /* don't exit process via LogEvent. We want to exit via the server * which failed to start, which could mean i=0 */ - LogEvent(temp, 0, TRUE); + LogEvent(buf, 0, TRUE); ExitProcess(i); } } - + LogEvent(_T("setting service status to running\n"), 0, FALSE);
UpdateStatus(SERVICE_RUNNING, 0); @@ -232,6 +232,10 @@ { CloseHandle(hThread[i]); } + + LogEvent(_T("Detaching Winsock2...\n"), 0, FALSE); + WSACleanup(); + return 0; }