diff options
author | Andreas Baumann <abaumann@yahoo.com> | 2009-03-27 13:42:30 +0100 |
---|---|---|
committer | Andreas Baumann <abaumann@yahoo.com> | 2009-03-27 13:42:30 +0100 |
commit | 9fb045b62a3e2c9dfc5bb616bb80677e8568c64e (patch) | |
tree | 376509a083a5ee97eb9a9141a703a73217e9c72f /src | |
parent | 06baadef15c8326bc5d5a2d300cdd44a9aea29d4 (diff) | |
download | wolfbones-9fb045b62a3e2c9dfc5bb616bb80677e8568c64e.tar.gz wolfbones-9fb045b62a3e2c9dfc5bb616bb80677e8568c64e.tar.bz2 |
cleaned up testservice and service, more separation
Diffstat (limited to 'src')
-rw-r--r-- | src/service/service.c | 74 |
1 files changed, 42 insertions, 32 deletions
diff --git a/src/service/service.c b/src/service/service.c index 53abda7..a7fb6b8 100644 --- a/src/service/service.c +++ b/src/service/service.c @@ -7,9 +7,10 @@ #include <WinSvc.h> /* for service functions */ -SERVICE_STATUS_HANDLE service_status_handle; -SERVICE_STATUS service_status; -HANDLE service_stop_event = NULL; +static SERVICE_STATUS_HANDLE service_status_handle; +static SERVICE_STATUS service_status; +static HANDLE service_stop_event = NULL; +static LPSERVICE_MAIN_FUNCTION service_service_main = NULL; #define SERVICE_NAME "testservice" @@ -305,35 +306,9 @@ void WINAPI wolf_service_main( DWORD argc, LPTSTR *argv ) { } wolf_service_report_status( SERVICE_RUNNING, NO_ERROR, 1000 ); - wolf_log( WOLF_LOG_NOTICE, WOLF_CATEGORY_SERVICE, WOLF_MSG_SERVICE_STARTED_SERVICE, - _( "Started %s service" ), SERVICE_NAME ); - - /* main loop */ - while( 1 ) { - DWORD r; - r = WaitForSingleObject( service_stop_event, 1000 ); - switch( r ) { - case WAIT_OBJECT_0: - /* stop signal received */ - goto SERVICE_END; - - case WAIT_TIMEOUT: - /* we can do periodic things here */ - break; - - default: - WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); - wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_SERVICE, WOLF_MSG_SERVICE_WAIT_FOR_OBJECT_FAILED, - _( "Waiting for the stop event for service '%s' failed: %s (%d)" ), - SERVICE_NAME, errbuf, GetLastError( ) ); - wolf_service_report_status( SERVICE_STOPPED, NO_ERROR, 1000 ); - return; - } - } -SERVICE_END: - wolf_log( WOLF_LOG_NOTICE, WOLF_CATEGORY_SERVICE, WOLF_MSG_SERVICE_STOPPED_SERVICE, - _( "Stopped %s service" ), SERVICE_NAME ); + /* now call the user-defined service main function */ + service_service_main( argc, argv ); wolf_service_report_status( SERVICE_STOPPED, NO_ERROR, 1000 ); @@ -342,14 +317,49 @@ SERVICE_END: return; } +wolf_service_event_t wolf_service_events_suspend( int timeout, wolf_error_t *error ) { + DWORD res; + char errbuf[512]; + + res = WaitForSingleObject( service_stop_event, timeout * 1000 ); + switch( res ) { + case WAIT_OBJECT_0: + /* stop signal received */ + wolf_service_report_status( SERVICE_STOP_PENDING, NO_ERROR, 1000 ); + *error = WOLF_OK; + return WOLF_SERVICE_EVENT_TERMINATE; + + case WAIT_TIMEOUT: + *error = WOLF_ERR_TIMEOUT; + return WOLF_SERVICE_NO_EVENT; + + default: + WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); + wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_SERVICE, WOLF_MSG_SERVICE_WAIT_FOR_OBJECT_FAILED, + _( "Waiting for events in the service '%s' failed: %s (%d)" ), + SERVICE_NAME, errbuf, GetLastError( ) ); + wolf_service_report_status( SERVICE_STOPPED, NO_ERROR, 1000 ); + *error = WOLF_ERR_INTERNAL; + return WOLF_SERVICE_NO_EVENT; + } +} + wolf_error_t wolf_service_start( LPTSTR service_name, LPSERVICE_MAIN_FUNCTION service_main ) { BOOL res; char errbuf[512]; SERVICE_TABLE_ENTRY dispatch_table[2] = - { { service_name, service_main }, + { { service_name, wolf_service_main }, { NULL, NULL } }; + /* register the user-defined service main (what he should actually program */ + service_service_main = service_main; + + /* register the wolf_service_main to the SCM, which is the entry point for + * the service (doing some things we want to hide from the service developer), + * and which in the end calls 'service_service_main' (the user-defined main + * service function. + */ res = StartServiceCtrlDispatcher( dispatch_table ); if( !res ) { WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); |