From 756da2b516e453d8d0f5b67f50dc72d6cb8e8394 Mon Sep 17 00:00:00 2001 From: yaworsky Date: Wed, 7 Dec 2005 08:42:02 +0000 Subject: Fixed shutdown_service: try to stop windows service first --- daemon/main.c | 143 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 76 insertions(+), 67 deletions(-) diff --git a/daemon/main.c b/daemon/main.c index 439138d..f45eac3 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -65,42 +65,6 @@ void display_message( FILE* fd, char* file, int line, const char* func, char* fm fflush( fd ); } -/****************************************************************************** - * shutdown_service - * - * set service stop event - * wait until event exists - */ -static void shutdown_service( gboolean quiet ) -{ - HANDLE he; - BOOL ret; - - for(;;) - { - he = OpenEvent( EVENT_MODIFY_STATE, FALSE, service_stop_event_name ); - if( !he ) - { - if( !quiet ) - ERR( "cannot open event; error %lu\n", GetLastError() ); - return; - } - TRACE( "setting stop event\n" ); - ret = SetEvent( he ); - CloseHandle( he ); - if( !ret ) - { - if( !quiet ) - { - ERR( "cannot set event; error %lu\n", GetLastError() ); - return; - } - } - quiet = TRUE; - Sleep(0); - } -} - /****************************************************************************** * service control handler */ @@ -124,23 +88,12 @@ static void WINAPI ServiceControlHandler( DWORD Control ) */ static void WINAPI winnt_ServiceMain( DWORD Argc, LPTSTR* Argv ) { - char security_descriptor[ SECURITY_DESCRIPTOR_MIN_LENGTH ]; - SECURITY_ATTRIBUTES security_attributes; - - InitializeSecurityDescriptor( (PSECURITY_DESCRIPTOR) security_descriptor, - SECURITY_DESCRIPTOR_REVISION ); - SetSecurityDescriptorDacl( (PSECURITY_DESCRIPTOR) security_descriptor, - TRUE, (PACL) NULL, FALSE ); - security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES); - security_attributes.lpSecurityDescriptor = (PSECURITY_DESCRIPTOR) security_descriptor; - security_attributes.bInheritHandle = FALSE; - hss = RegisterServiceCtrlHandler( PACKAGE_NAME, (LPHANDLER_FUNCTION)ServiceControlHandler ); if( !hss ) return; - service_stop_event = CreateEvent( &security_attributes, TRUE, FALSE, service_stop_event_name ); + service_stop_event = CreateEvent( NULL, TRUE, FALSE, NULL ); if( !service_stop_event ) return; @@ -295,6 +248,77 @@ static BOOL start_service() return ret; } +/****************************************************************************** + * shutdown_service + */ +static void winnt_shutdown_service() +{ + SC_HANDLE hscm, hsvc; + int i; + + hscm = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); + if( !hscm ) + { + TRACE( "OpenSCManager error %lu\n", GetLastError() ); + return; + } + + hsvc = OpenService( hscm, service_name, SERVICE_ALL_ACCESS ); + if( !hsvc ) + { + TRACE( "OpenService error %lu\n", GetLastError() ); + CloseServiceHandle( hscm ); + return; + } + + ControlService( hsvc, SERVICE_CONTROL_STOP, &sstatus ); + for( i = 0; i < 10; i++ ) + { + Sleep( 100 ); + if( !QueryServiceStatus( hsvc, &sstatus ) ) + { + TRACE( "Cannot query service status; error %lu\n", GetLastError() ); + break; + } + if( SERVICE_STOPPED == sstatus.dwCurrentState ) + break; + } + + CloseServiceHandle( hsvc ); +} + +static void shutdown_service( gboolean quiet ) +{ + /* try to stop windows NT service */ + winnt_shutdown_service(); + + /* set stop_event and wait for completion */ + for(;;) + { + BOOL ret; + HANDLE he = OpenEvent( EVENT_MODIFY_STATE, FALSE, service_stop_event_name ); + if( !he ) + { + if( !quiet ) + ERR( "cannot open event; error %lu\n", GetLastError() ); + return; + } + TRACE( "setting stop event\n" ); + ret = SetEvent( he ); + CloseHandle( he ); + if( !ret ) + { + if( !quiet ) + { + ERR( "cannot set event; error %lu\n", GetLastError() ); + return; + } + } + quiet = TRUE; + Sleep(0); + } +} + /****************************************************************************** * service installer */ @@ -412,7 +436,6 @@ static void win9x_RemoveService() static void winnt_RemoveService() { SC_HANDLE hscm, hsvc; - int i; TRACE_ENTER( "\n" ); hscm = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); @@ -430,21 +453,8 @@ static void winnt_RemoveService() return; } - ControlService( hsvc, SERVICE_CONTROL_STOP, &sstatus ); - - for( i = 0; i < 10; i++ ) - { - Sleep( 100 ); - if( !QueryServiceStatus( hsvc, &sstatus ) ) - { - TRACE( "Cannot query service status; error %lu\n", GetLastError() ); - break; - } - if( SERVICE_STOPPED == sstatus.dwCurrentState ) - break; - } if( !DeleteService( hsvc ) ) - TRACE( "Cannot delete service; error %lu\n", GetLastError() ); + ERR( "Cannot delete service; error %lu\n", GetLastError() ); CloseServiceHandle( hsvc ); CloseServiceHandle( hscm ); @@ -458,10 +468,6 @@ static void remove_service() winnt_RemoveService(); else win9x_RemoveService(); - - /* always try to shutdown because it's possible that daemon - is running not as service under winNT */ - shutdown_service( TRUE ); TRACE_LEAVE( "done\n" ); } @@ -768,6 +774,8 @@ int main( int argc, char* argv[] ) { if( install_flag || start_flag || shutdown_flag || restart_flag ) ERR( "Remove option has priority over install/start/shutdown/restart\n" ); + + shutdown_service( TRUE ); remove_service(); return 0; } @@ -775,6 +783,7 @@ int main( int argc, char* argv[] ) { if( start_flag || shutdown_flag || restart_flag ) ERR( "Install option has priority over start/shutdown/restart\n" ); + if( !install_service( priority ) ) return 1; if( !start_service() ) -- cgit v1.2.3