diff options
author | Andreas Baumann <abaumann@yahoo.com> | 2009-03-25 14:48:51 +0100 |
---|---|---|
committer | Andreas Baumann <abaumann@yahoo.com> | 2009-03-25 14:48:51 +0100 |
commit | d891f09be018df8a87493eb37175d57046079233 (patch) | |
tree | e55e3bf3d3491a7616bb1c2e9239c9326fb16add /tests/service | |
parent | b165d6e741a2ffec68f1bdc1680abbc3c24aea9a (diff) | |
download | wolfbones-d891f09be018df8a87493eb37175d57046079233.tar.gz wolfbones-d891f09be018df8a87493eb37175d57046079233.tar.bz2 |
started to add the main service function
Diffstat (limited to 'tests/service')
-rw-r--r-- | tests/service/Makefile.W32 | 9 | ||||
-rw-r--r-- | tests/service/testservice.c | 134 |
2 files changed, 82 insertions, 61 deletions
diff --git a/tests/service/Makefile.W32 b/tests/service/Makefile.W32 index 4dc3bf8..22e297d 100644 --- a/tests/service/Makefile.W32 +++ b/tests/service/Makefile.W32 @@ -30,9 +30,10 @@ testservice.rc: testservice.mc testservice.res: testservice.rc local_test: $(LIBRARIES) -# @echo Testing log.. -# @copy testservice.dll C:\TEMP -# @test_service 2>NUL + @echo Testing service.. + @copy testservice.dll C:\TEMP + @testservice /install 2>NUL + @testservice /remove 2>NUL local_all: @@ -41,5 +42,3 @@ local_clean: @-erase $(LIBRARIES) testservice.h 2>NUL local_distclean: - - diff --git a/tests/service/testservice.c b/tests/service/testservice.c index fdc923b..7ccbac2 100644 --- a/tests/service/testservice.c +++ b/tests/service/testservice.c @@ -22,66 +22,11 @@ #define WOLF_MSG_TESTSERVICE_CANT_OPEN_SCM_FOR_UNINSTALL WOLF_MSG_TESTSERVICE_BASE+8 #define WOLF_MSG_TESTSERVICE_CANT_OPEN_SERVICE WOLF_MSG_TESTSERVICE_BASE+9 #define WOLF_MSG_TESTSERVICE_CANT_DELETE_SERVICE WOLF_MSG_TESTSERVICE_BASE+10 +#define WOLF_MSG_TESTSERVICE_CANT_DISPATCH_SERVICE WOLF_MSG_TESTSERVICE_BASE+11 #define SERVICE_NAME "testservice" #define SERVICE_NAME_DESCR "Wolf Test Service" -static wolf_error_t wolf_service_remove( LPCTSTR service_name ) { - SC_HANDLE scm; - char errbuf[512]; - SC_HANDLE service; - DWORD res; - - wolf_log( WOLF_LOG_DEBUG, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_UNINSTALLING_SERVICE, - _( "Unistalling service '%s'" ), service_name ); - - /* get service control manager with enough rights on the local - * machine to uninstall the service - */ - scm = (SC_HANDLE)OpenSCManager( - NULL, /* local computer */ - SERVICES_ACTIVE_DATABASE, - SC_MANAGER_ALL_ACCESS ); - - if( scm == NULL ) { - WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); - wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_OPEN_SCM_FOR_UNINSTALL, - _( "Unable to open the service control manager to uninstall '%s': %s (%d)" ), - service_name, errbuf, GetLastError( ) ); - return WOLF_ERR_INTERNAL; - } - - /* open the service handle and delete the service */ - service = OpenService( scm, service_name, SERVICE_ALL_ACCESS ); - - if( service == NULL ) { - WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); - wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_OPEN_SERVICE, - _( "Unable to open service '%s': %s (%d)" ), - service_name, errbuf, GetLastError( ) ); - CloseServiceHandle( scm ); - return WOLF_ERR_INTERNAL; - } - - res = DeleteService( service ); - if( res == 0 ) { - WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); - wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_DELETE_SERVICE, - _( "Unable to uninstall service '%s': %s (%d)" ), - service_name, errbuf, GetLastError( ) ); - CloseServiceHandle( service ); - CloseServiceHandle( scm ); - return WOLF_ERR_INTERNAL; - } - - CloseServiceHandle( service ); - CloseServiceHandle( scm ); - - wolf_log( WOLF_LOG_DEBUG, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_SERVICE_UNINSTALLED, - _( "Service '%s' uninstalled successfully" ), service_name ); - - return WOLF_OK; -} static wolf_error_t wolf_service_install( LPCTSTR service_name, LPCTSTR service_name_descr ) { @@ -159,13 +104,90 @@ static wolf_error_t wolf_service_install( LPCTSTR service_name, return WOLF_OK; } +static wolf_error_t wolf_service_remove( LPCTSTR service_name ) { + SC_HANDLE scm; + char errbuf[512]; + SC_HANDLE service; + DWORD res; + + wolf_log( WOLF_LOG_DEBUG, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_UNINSTALLING_SERVICE, + _( "Unistalling service '%s'" ), service_name ); + + /* get service control manager with enough rights on the local + * machine to uninstall the service + */ + scm = (SC_HANDLE)OpenSCManager( + NULL, /* local computer */ + SERVICES_ACTIVE_DATABASE, + SC_MANAGER_ALL_ACCESS ); + + if( scm == NULL ) { + WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); + wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_OPEN_SCM_FOR_UNINSTALL, + _( "Unable to open the service control manager to uninstall '%s': %s (%d)" ), + service_name, errbuf, GetLastError( ) ); + return WOLF_ERR_INTERNAL; + } + + /* open the service handle and delete the service */ + service = OpenService( scm, service_name, SERVICE_ALL_ACCESS ); + + if( service == NULL ) { + WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); + wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_OPEN_SERVICE, + _( "Unable to open service '%s': %s (%d)" ), + service_name, errbuf, GetLastError( ) ); + CloseServiceHandle( scm ); + return WOLF_ERR_INTERNAL; + } + + res = DeleteService( service ); + if( res == 0 ) { + WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); + wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_DELETE_SERVICE, + _( "Unable to uninstall service '%s': %s (%d)" ), + service_name, errbuf, GetLastError( ) ); + CloseServiceHandle( service ); + CloseServiceHandle( scm ); + return WOLF_ERR_INTERNAL; + } + + CloseServiceHandle( service ); + CloseServiceHandle( scm ); + + wolf_log( WOLF_LOG_DEBUG, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_SERVICE_UNINSTALLED, + _( "Service '%s' uninstalled successfully" ), service_name ); + + return WOLF_OK; +} + +void WINAPI wolf_service_main( DWORD argc, LPTSTR *argv ) { + return; +} + void __cdecl _tmain( int argc, TCHAR *argv[] ) { + char errbuf[512]; + wolf_log_openlogtostderr( WOLF_LOG_DEBUG ); wolf_log_openlogtofile( "testservice.log", WOLF_LOG_NOTICE ); wolf_log_openlogtoeventlog( NULL, "Application", "testservice", "C:\\Temp\\testsrevice.dll", 3, WOLF_LOG_NOTICE ); + /* called as service, dispatch the main service thread */ if( argc < 2 ) { + SERVICE_TABLE_ENTRY dispatch_table[2] = + { { SERVICE_NAME, wolf_service_main }, + { NULL, NULL } }; + BOOL res; + + res = StartServiceCtrlDispatcher( dispatch_table ); + if( !res ) { + WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); + wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_DISPATCH_SERVICE, + _( "Unable to dispatch service '%s': %s (%d)" ), + SERVICE_NAME, errbuf, GetLastError( ) ); + } + return; } |