summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Baumann <abaumann@yahoo.com>2009-03-27 13:42:30 +0100
committerAndreas Baumann <abaumann@yahoo.com>2009-03-27 13:42:30 +0100
commit9fb045b62a3e2c9dfc5bb616bb80677e8568c64e (patch)
tree376509a083a5ee97eb9a9141a703a73217e9c72f /src
parent06baadef15c8326bc5d5a2d300cdd44a9aea29d4 (diff)
downloadwolfbones-9fb045b62a3e2c9dfc5bb616bb80677e8568c64e.tar.gz
wolfbones-9fb045b62a3e2c9dfc5bb616bb80677e8568c64e.tar.bz2
cleaned up testservice and service, more separation
Diffstat (limited to 'src')
-rw-r--r--src/service/service.c74
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 );