- use InterlockedExchange for setting shutdown flag - fix bug in select() which was stopping the service from shutting down - add more event logs Modified: trunk/reactos/services/tcpsvcs/echo.c Modified: trunk/reactos/services/tcpsvcs/skelserver.c Modified: trunk/reactos/services/tcpsvcs/tcpsvcs.c _____
Modified: trunk/reactos/services/tcpsvcs/echo.c --- trunk/reactos/services/tcpsvcs/echo.c 2005-11-18 22:32:44 UTC (rev 19331) +++ trunk/reactos/services/tcpsvcs/echo.c 2005-11-18 22:55:30 UTC (rev 19332) @@ -88,5 +88,8 @@
if (! bShutDown) LogEvent(_T("Echo: Connection closed by peer.\n"), 0, FALSE);
+ if (bShutDown) + LogEvent(_T("Echo: thread recieved shutdown signal\n"), 0, FALSE); + return TRUE; } _____
Modified: trunk/reactos/services/tcpsvcs/skelserver.c --- trunk/reactos/services/tcpsvcs/skelserver.c 2005-11-18 22:32:44 UTC (rev 19331) +++ trunk/reactos/services/tcpsvcs/skelserver.c 2005-11-18 22:55:30 UTC (rev 19332) @@ -30,7 +30,7 @@
ListeningSocket = SetUpListener(HostIP, htons(pServices->Port)); if (ListeningSocket == INVALID_SOCKET) { - LogEvent("Socket error when setting up listener", 0, TRUE); + LogEvent("Socket error when setting up listener\n", 0, TRUE); return 3; }
@@ -94,8 +94,6 @@ INT TimeOut = 2000; // 2 seconds
//DebugBreak(); - /* monitor for incomming connections */ - FD_ZERO(&ReadFDS);
/* set timeout values */ TimeVal.tv_sec = TimeOut / 1000; @@ -103,45 +101,52 @@
while (! bShutDown) // (i<MAX_CLIENTS && !bShutDown) { + INT SelRet = 0; + + FD_ZERO(&ReadFDS); FD_SET(ListeningSocket, &ReadFDS); - if (select(0, &ReadFDS, NULL, NULL, &TimeVal) == SOCKET_ERROR) + + SelRet = select(0, &ReadFDS, NULL, NULL, &TimeVal); + if (SelRet == SOCKET_ERROR) { LogEvent(_T("select failed\n"), 0, TRUE); return; } + else if (SelRet > 0) + { + /* 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(buf, _T("Accepted connection to %s server from %s:%d\n"), + Name, inet_ntoa(Client.sin_addr), ntohs(Client.sin_port)); + LogEvent(buf, 0, FALSE); + _stprintf(buf, _T("Creating new thread for %s\n"), Name); + LogEvent(buf, 0, FALSE);
- /* 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(buf, _T("Accepted connection to %s server from %s:%d\n"), - Name, inet_ntoa(Client.sin_addr), ntohs(Client.sin_port)); - 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);
- hThread = CreateThread(0, 0, Service, (void*)Sock, 0, &ThreadID); + /* Check the return value for success. */ + if (hThread == NULL) + { + _stprintf(buf, _T("Failed to start worker thread for " + "the %s server....\n"), Name); + LogEvent(buf, 0, TRUE); + }
- /* Check the return value for success. */ - if (hThread == NULL) - { - _stprintf(buf, _T("Failed to start worker thread for " - "the %s server....\n"), Name); - LogEvent(buf, 0, TRUE); - } - - WaitForSingleObject(hThread, INFINITE); - - CloseHandle(hThread); - } - else - { - LogEvent(_T("accept failed\n"), 0, TRUE); - return; - } - } + WaitForSingleObject(hThread, INFINITE); + + CloseHandle(hThread); + } + else + { + LogEvent(_T("accept failed\n"), 0, TRUE); + return; + } + } + } } }
_____
Modified: trunk/reactos/services/tcpsvcs/tcpsvcs.c --- trunk/reactos/services/tcpsvcs/tcpsvcs.c 2005-11-18 22:32:44 UTC (rev 19331) +++ trunk/reactos/services/tcpsvcs/tcpsvcs.c 2005-11-18 22:55:30 UTC (rev 19332) @@ -75,25 +75,26 @@
VOID WINAPI ServiceMain(DWORD argc, LPTSTR argv[]) { - TCHAR LogFilePath[MAX_PATH]; + TCHAR LogFilePath[MAX_PATH];
if(! GetSystemDirectory(LogFilePath, MAX_PATH)) return;
_tcscat(LogFilePath, LogFileName);
- hLogFile = fopen(LogFilePath, _T("w")); + hLogFile = fopen(LogFilePath, _T("a+")); if (hLogFile == NULL) { TCHAR buf[50];
- _stprintf(buf, _T("Could not open log file: %s"), LogFilePath); + _stprintf(buf, _T("Could not open log file: %s\n"), LogFilePath); MessageBox(NULL, buf, NULL, MB_OK); return; }
- LogEvent(_T("Entering ServiceMain"), 0, FALSE);
+ LogEvent(_T("Entering ServiceMain\n"), 0, FALSE); + hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; hServStatus.dwCurrentState = SERVICE_START_PENDING; hServStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | @@ -107,9 +108,9 @@ if (hSStat == 0) LogEvent(_T("Failed to register service\n"), -1, TRUE);
- LogEvent(_T("Control handler registered successfully"), 0, FALSE); + LogEvent(_T("Control handler registered successfully\n"), 0, FALSE); SetServiceStatus (hSStat, &hServStatus); - LogEvent(_T("Service status set to SERVICE_START_PENDING"), 0, FALSE); + LogEvent(_T("Service status set to SERVICE_START_PENDING\n"), 0, FALSE);
if (CreateServers() != 0) { @@ -119,13 +120,15 @@ return; }
- LogEvent(_T("Service threads shut down. Set SERVICE_STOPPED status"), 0, FALSE); + LogEvent(_T("Service threads shut down. Set SERVICE_STOPPED status\n"), 0, FALSE); /* We will only return here when the ServiceSpecific function completes, indicating system shutdown. */ UpdateStatus (SERVICE_STOPPED, 0); - LogEvent(_T("Service status set to SERVICE_STOPPED"), 0, FALSE); - LogEvent(_T("Leaving ServiceMain"), 0, FALSE); - fclose(hLogFile); /* Clean up everything, in general */ + LogEvent(_T("Service status set to SERVICE_STOPPED\n"), 0, FALSE); + LogEvent(_T("Leaving ServiceMain\n"), 0, FALSE); + + fclose(hLogFile); + return;
} @@ -133,18 +136,23 @@ VOID WINAPI ServerCtrlHandler(DWORD Control) { + TCHAR buf[256]; + switch (Control) { case SERVICE_CONTROL_SHUTDOWN: /* fall through */ case SERVICE_CONTROL_STOP: - bShutDown = TRUE; + LogEvent(_T("stopping service\n"), 0, FALSE); + InterlockedExchange((LONG *)&bShutDown, TRUE); UpdateStatus(SERVICE_STOP_PENDING, -1); break; - case SERVICE_CONTROL_PAUSE: - bPause = TRUE; + case SERVICE_CONTROL_PAUSE: /* not yet implemented */ + LogEvent(_T("pausing service\n"), 0, FALSE); + InterlockedExchange((LONG *)&bPause, TRUE); break; case SERVICE_CONTROL_CONTINUE: - bPause = FALSE; + LogEvent(_T("continuing service\n"), 0, FALSE); + InterlockedExchange((LONG *)&bPause, FALSE); break; case SERVICE_CONTROL_INTERROGATE: break; @@ -169,7 +177,7 @@ hServStatus.dwCurrentState = NewStatus;
if (! SetServiceStatus (hSStat, &hServStatus)) - LogEvent(_T("Cannot set service status"), -1, TRUE); + LogEvent(_T("Cannot set service status\n"), -1, TRUE);
return; } @@ -180,7 +188,7 @@ DWORD dwThreadId[NUM_SERVICES]; HANDLE hThread[NUM_SERVICES]; WSADATA wsaData; - TCHAR buf[256]; // temp for holding LogEvent text + TCHAR buf[256]; INT i; DWORD RetVal;
@@ -251,6 +259,8 @@ LPTSTR lpvSysMsg; TCHAR MessageBuffer[512];
+ + if (PrintErrorMsg) { eMsgLen = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | @@ -258,13 +268,13 @@ ErrNum, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpvSysMsg, 0, NULL);
- _stprintf(MessageBuffer, _T("\n%s %s ErrNum = %lu. ExitCode = %lu."), + _stprintf(MessageBuffer, _T("%s %s ErrNum = %lu. ExitCode = %lu."), UserMessage, lpvSysMsg, ErrNum, ExitCode); HeapFree(GetProcessHeap (), 0, lpvSysMsg); } else { - _stprintf(MessageBuffer, _T("\n%s"), UserMessage); + _stprintf(MessageBuffer, _T("%s"), UserMessage); }
fputs (MessageBuffer, hLogFile);