- 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);