spoolsv: Improve the service stub so that it can be started and stopped.
authorAlexandre Julliard <julliard@winehq.org>
Mon, 5 May 2008 10:57:04 +0000 (12:57 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 5 May 2008 11:34:05 +0000 (13:34 +0200)
programs/spoolsv/main.c

index 365aff00bdfc499bba76715d38677af468026a4b..10a227ff0f1203a33749f1b77a90248f52fe4730 100644 (file)
 
 WINE_DEFAULT_DEBUG_CHANNEL(spoolsv);
 
+static WCHAR spoolerW[] = {'S','p','o','o','l','e','r',0};
+
+static SERVICE_STATUS_HANDLE service_handle;
+static HANDLE stop_event;
+
+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;
+
+    switch(ctrl)
+    {
+    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)
 {
-    WINE_FIXME("(%d %p)\n", argc, argv);
+    SERVICE_STATUS status;
+
+    WINE_TRACE( "starting service\n" );
+
+    stop_event = CreateEventW( NULL, TRUE, FALSE, NULL );
+
+    service_handle = RegisterServiceCtrlHandlerExW( spoolerW, service_handler, NULL );
+    if (!service_handle)
+        return;
+
+    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 );
+
+    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)
 {
-    static WCHAR wszSPOOLER[] = {'S','P','O','O','L','E','R',0};
     static const SERVICE_TABLE_ENTRYW servtbl[] = {
-        {wszSPOOLER, serv_main},
+        {spoolerW, serv_main},
         {NULL, NULL}
     };