- Use the Wine spooler service as the service entry template as I was
[reactos.git] / rosapps / applications / sysutils / telnetd / serviceentry.c
index 3ecfd8e..015d057 100644 (file)
 /*
- * COPYRIGHT:        See COPYING in the top level directory
- * PROJECT:          ReactOS kernel
- * FILE:             services/TelnetD/TelnetD.c
- * PURPOSE:          Printer spooler
- * PROGRAMMER:       Eric Kohl
+ * Copyright 2007 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
+#if 0
+#define WIN32_LEAN_AND_MEAN
 
-/* INCLUDES *****************************************************************/
+#include <windows.h>
 
-#include "telnetd.h"
-#define DPRINT printf
+#define WINE_FIXME printf
+#define WINE_TRACE printf
 
-/* GLOBALS ******************************************************************/
+//#include "wine/debug.h"
 
-#define SERVICE_NAME TEXT("TelnetD")
+//WINE_DEFAULT_DEBUG_CHANNEL(spoolsv);
 
-SERVICE_STATUS_HANDLE ServiceStatusHandle;
+static WCHAR telnetdW[] = {'T','e','l','n','e','t','D',0};
 
+static SERVICE_STATUS_HANDLE service_handle;
+static HANDLE stop_event;
 
-/* FUNCTIONS *****************************************************************/
+static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context )
+{
+    SERVICE_STATUS status;
 
+    status.dwServiceType             = SERVICE_WIN32;
+    status.dwControlsAccepted        = SERVICE_ACCEPT_STOP;
+    status.dwWin32ExitCode           = 0;
+    status.dwServiceSpecificExitCode = 0;
+    status.dwCheckPoint              = 0;
+    status.dwWaitHint                = 0;
 
-static DWORD WINAPI
-ServiceControlHandler(DWORD dwControl,
-                      DWORD dwEventType,
-                      LPVOID lpEventData,
-                      LPVOID lpContext)
-{
-    switch (dwControl)
+    switch(ctrl)
     {
-        case SERVICE_CONTROL_STOP:
-        case SERVICE_CONTROL_SHUTDOWN:
-            return ERROR_SUCCESS;
-
-        default :
-            return ERROR_CALL_NOT_IMPLEMENTED;
+    case SERVICE_CONTROL_STOP:
+    case SERVICE_CONTROL_SHUTDOWN:
+        WINE_TRACE( "shutting down\n" );
+        status.dwCurrentState     = SERVICE_STOP_PENDING;
+        status.dwControlsAccepted = 0;
+        SetServiceStatus( service_handle, &status );
+        SetEvent( stop_event );
+        return NO_ERROR;
+    default:
+        WINE_FIXME( "got service ctrl %x\n", ctrl );
+        status.dwCurrentState = SERVICE_RUNNING;
+        SetServiceStatus( service_handle, &status );
+        return NO_ERROR;
     }
 }
 
+static void WINAPI serv_main(DWORD argc, LPWSTR *argv)
+{
+    SERVICE_STATUS status;
+    int retval;
+
+    WINE_TRACE( "starting service\n" );
 
+    stop_event = CreateEventW( NULL, TRUE, FALSE, NULL );
 
-static VOID CALLBACK
-ServiceMain(DWORD argc, LPTSTR *argv)
-{
-    UNREFERENCED_PARAMETER(argc);
-    UNREFERENCED_PARAMETER(argv);
+    service_handle = RegisterServiceCtrlHandlerExW( telnetdW, service_handler, NULL );
+    if (!service_handle)
+        return;
 
-    DPRINT("ServiceMain() called\n");
+    status.dwServiceType             = SERVICE_WIN32;
+    status.dwCurrentState            = SERVICE_RUNNING;
+    status.dwControlsAccepted        = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
+    status.dwWin32ExitCode           = 0;
+    status.dwServiceSpecificExitCode = 0;
+    status.dwCheckPoint              = 0;
+    status.dwWaitHint                = 10000;
+    SetServiceStatus( service_handle, &status );
 
-    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(SERVICE_NAME,
-                                                        ServiceControlHandler,
-                                                        NULL);
+    /* Argument Ignored for now */
+    retval = kickoff_telnetd();
 
-    DPRINT("ServiceMain() done\n");
-}
+    WaitForSingleObject( stop_event, INFINITE );
 
+    status.dwCurrentState     = SERVICE_STOPPED;
+    status.dwControlsAccepted = 0;
+    SetServiceStatus( service_handle, &status );
+    WINE_TRACE( "service stopped\n" );
+}
 
-int
-main(int argc, CHAR *argv[])
+int main(int argc, char **argv)
 {
-#if 0
-    SERVICE_TABLE_ENTRY ServiceTable[2] =
-    {
-        {SERVICE_NAME, ServiceMain},
+    static const SERVICE_TABLE_ENTRYW servtbl[] = {
+        {telnetdW, serv_main},
         {NULL, NULL}
     };
 
-    UNREFERENCED_PARAMETER(argc);
-    UNREFERENCED_PARAMETER(argv);
-
-    DPRINT("TelnetD: main() started\n");
-
-    StartServiceCtrlDispatcher(ServiceTable);
-#endif
-
-       telnetd_main();
-
-    DPRINT("TelnetD: main() done\n");
-
-    ExitThread(0);
+    WINE_TRACE("(%d %p)\n", argc, argv);
 
+    StartServiceCtrlDispatcherW(servtbl);
     return 0;
 }
-
+#endif
 /* EOF */
+