+/*
+ * ReactOS Services
+ * Copyright (C) 2005 ReactOS Team
+ *
+ * LICENCE: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS simple TCP/IP services
+ * FILE: apps/utils/net/tcpsvcs/tcpsvcs.c
+ * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
+ * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
+ * REVISIONS:
+ * GM 04/10/05 Created
+ *
+ */
+/*
+ * TODO:
+ * - Start tcpsvcs as a service.
+ * - write debugging function and print all dbg info via that.
+ *
+ */
+
#include <stdio.h>
#include <winsock2.h>
#include <tchar.h>
FILE *hLogFile;
BOOL bLogEvents = TRUE;
BOOL ShutDown, PauseFlag;
-LPTSTR LogFileName = "tcpsvcs_log.txt";
+LPCTSTR LogFileName = "tcpsvcs_log.log";
static SERVICE_TABLE_ENTRY
ServiceTable[2] =
WSADATA wsaData;
DWORD RetVal;
INT i;
-
+
if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
_tprintf(_T("WSAStartup() failed : %lu\n"), RetVal);
if (hThread[i] == NULL)
{
_tprintf(_T("Failed to start %s server....\n"), Services[i].Name);
- ExitProcess(i);
+ //ExitProcess(i);
}
}
-/* code to run tcpsvcs as a service */
+/* code to run tcpsvcs as a service through services.msc */
#if 0
int
main(int argc, char *argv[])
hLogFile = fopen(LogFileName, _T("w+"));
if (hLogFile == NULL)
return;
-
+
LogEvent(_T("Entering ServiceMain"), 0, FALSE);
hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
hServStatus.dwServiceSpecificExitCode = 0;
hServStatus.dwCheckPoint = 0;
hServStatus.dwWaitHint = 2*CS_TIMEOUT;
-
+
hSStat = RegisterServiceCtrlHandler("tcpsvcs", ServerCtrlHandler);
if (hSStat == 0)
LogEvent(_T("Failed to register service\n"), 100, TRUE);
- LogEvent(_T("Control handler registered successfully"), 0, FALSE);
- SetServiceStatus (hSStat, &hServStatus);
- LogEvent(_T("Service status set to SERVICE_START_PENDING"), 0, FALSE);
+ LogEvent(_T("Control handler registered successfully"), 0, FALSE);
+ SetServiceStatus (hSStat, &hServStatus);
+ LogEvent(_T("Service status set to SERVICE_START_PENDING"), 0, FALSE);
if (CreateServers() != 0)
{
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. */
- UpdateStatus (SERVICE_STOPPED, 0);
- LogEvent(_T("Service status set to SERVICE_STOPPED"), 0, FALSE);
- fclose(hLogFile); /* Clean up everything, in general */
- 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. */
+ UpdateStatus (SERVICE_STOPPED, 0);
+ LogEvent(_T("Service status set to SERVICE_STOPPED"), 0, FALSE);
+ fclose(hLogFile); /* Clean up everything, in general */
+ return;
}
void UpdateStatus (int NewStatus, int Check)
/* Set a new service status and checkpoint (either specific value or increment) */
{
- if (Check < 0 ) hServStatus.dwCheckPoint++;
- else hServStatus.dwCheckPoint = Check;
- if (NewStatus >= 0) hServStatus.dwCurrentState = NewStatus;
- if (!SetServiceStatus (hSStat, &hServStatus))
- LogEvent (_T("Cannot set service status"), 101, TRUE);
- return;
+ if (Check < 0 ) hServStatus.dwCheckPoint++;
+ else hServStatus.dwCheckPoint = Check;
+ if (NewStatus >= 0) hServStatus.dwCurrentState = NewStatus;
+ if (!SetServiceStatus (hSStat, &hServStatus))
+ LogEvent (_T("Cannot set service status"), 101, TRUE);
+ return;
}
INT
DWORD dwThreadId[NUM_SERVICES];
HANDLE hThread[NUM_SERVICES];
INT i;
-
+
UpdateStatus(-1, -1); /* increment checkpoint */
/* Create MAX_THREADS worker threads. */
}
-/* LogEvent is similar to the ReportError function used elsewhere
- For a service, however, we ReportEvent rather than write to standard
- error. Eventually, this function should go into the utility
- library. */
+/* LogEvent is similar to the ReportError function used elsewhere
+ For a service, however, we ReportEvent rather than write to standard
+ error. Eventually, this function should go into the utility
+ library. */
VOID
LogEvent (LPCTSTR UserMessage, DWORD ExitCode, BOOL PrintErrorMsg)
{
- DWORD eMsgLen, ErrNum = GetLastError ();
- LPTSTR lpvSysMsg;
- TCHAR MessageBuffer[512];
-
- if (PrintErrorMsg) {
- eMsgLen = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM, NULL,
- ErrNum, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR)&lpvSysMsg, 0, NULL);
-
- _stprintf (MessageBuffer, _T("\n%s %s ErrNum = %d. ExitCode = %d."),
- UserMessage, lpvSysMsg, ErrNum, ExitCode);
- HeapFree (GetProcessHeap (), 0, lpvSysMsg);
- /* Explained in Chapter 6. */
- } else {
- _stprintf (MessageBuffer, _T("\n%s ExitCode = %d."),
- UserMessage, ExitCode);
- }
-
- fputs (MessageBuffer, hLogFile);
-
- if (ExitCode > 0)
- ExitProcess (ExitCode);
- else
- return;
+ DWORD eMsgLen, ErrNum = GetLastError ();
+ LPTSTR lpvSysMsg;
+ TCHAR MessageBuffer[512];
+
+ if (PrintErrorMsg) {
+ eMsgLen = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM, NULL,
+ ErrNum, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR)&lpvSysMsg, 0, NULL);
+
+ _stprintf (MessageBuffer, _T("\n%s %s ErrNum = %d. ExitCode = %d."),
+ UserMessage, lpvSysMsg, ErrNum, ExitCode);
+ HeapFree (GetProcessHeap (), 0, lpvSysMsg);
+ } else {
+ _stprintf (MessageBuffer, _T("\n%s ExitCode = %d."),
+ UserMessage, ExitCode);
+ }
+
+ fputs (MessageBuffer, hLogFile);
+
+ if (ExitCode > 0)
+ ExitProcess (ExitCode);
+ else
+ return;
}
#endif