diff options
author | Andreas Baumann <abaumann@yahoo.com> | 2009-03-25 14:21:53 +0100 |
---|---|---|
committer | Andreas Baumann <abaumann@yahoo.com> | 2009-03-25 14:21:53 +0100 |
commit | b165d6e741a2ffec68f1bdc1680abbc3c24aea9a (patch) | |
tree | e6f8dbc93ccd9aec5d42e53e9485749e39ed438f /tests/service | |
parent | c58908e7616c5e183ceb34c571b84f13389ecf9a (diff) | |
download | wolfbones-b165d6e741a2ffec68f1bdc1680abbc3c24aea9a.tar.gz wolfbones-b165d6e741a2ffec68f1bdc1680abbc3c24aea9a.tar.bz2 |
testservice with /install and /remove
Diffstat (limited to 'tests/service')
-rw-r--r-- | tests/service/testservice.c | 150 |
1 files changed, 141 insertions, 9 deletions
diff --git a/tests/service/testservice.c b/tests/service/testservice.c index 18f57af..fdc923b 100644 --- a/tests/service/testservice.c +++ b/tests/service/testservice.c @@ -2,23 +2,97 @@ #include "log/messages.h" /* for i18n */ #include "port/string.h" /* for strcasecmp */ #include "port/gettext.h" /* for i18n */ +#include "errors.h" #include <windows.h> #include <tchar.h> #include <WinSvc.h> +#include <stdio.h> #define WOLF_CATEGORY_TESTSERVICE WOLF_LAST_INTERNAL_CATEGORY+1 #define WOLF_MSG_TESTSERVICE_BASE ( WOLF_CATEGORY_TESTSERVICE ) * 1000 -#define WOLF_MSG_TESTSERVICE_CANT_OPEN_SCM WOLF_MSG_TESTSERVICE_BASE+1 -#define WOLF_MSG_TESTSERVICE_REGISTERING_SERVICE WOLF_MSG_TESTSERVICE_BASE+2 +#define WOLF_MSG_TESTSERVICE_CANT_OPEN_SCM_FOR_INSTALL WOLF_MSG_TESTSERVICE_BASE+1 +#define WOLF_MSG_TESTSERVICE_INSTALLING_SERVICE WOLF_MSG_TESTSERVICE_BASE+2 +#define WOLF_MSG_TESTSERVICE_CANT_GET_PATH_OF_BINARY WOLF_MSG_TESTSERVICE_BASE+3 +#define WOLF_MSG_TESTSERVICE_CANT_CREATE_SERVICE WOLF_MSG_TESTSERVICE_BASE+4 +#define WOLF_MSG_TESTSERVICE_SERVICE_INSTALLED WOLF_MSG_TESTSERVICE_BASE+5 +#define WOLF_MSG_TESTSERVICE_UNINSTALLING_SERVICE WOLF_MSG_TESTSERVICE_BASE+6 +#define WOLF_MSG_TESTSERVICE_SERVICE_UNINSTALLED WOLF_MSG_TESTSERVICE_BASE+7 +#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 -static void wolf_service_register( void ) { +#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 ) { SC_HANDLE scm; + SC_HANDLE service; char errbuf[512]; + DWORD res; + TCHAR binary_path[MAX_PATH]; - wolf_log( WOLF_LOG_INFO, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_REGISTERING_SERVICE, - "Registering service" ); + wolf_log( WOLF_LOG_DEBUG, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_INSTALLING_SERVICE, + _( "Installing service '%s'" ), service_name ); /* get service control manager with enough rights on the local * machine to install the service @@ -30,10 +104,59 @@ static void wolf_service_register( void ) { if( scm == NULL ) { WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); - wolf_log( WOLF_LOG_EMERG, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_OPEN_SCM, + wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_OPEN_SCM_FOR_INSTALL, _( "Unable to open the service control manager to register service '%s': %s (%d)" ), - "testservice", errbuf, GetLastError( ) ); + service_name, errbuf, GetLastError( ) ); + return WOLF_ERR_INTERNAL; } + + /* Get the full path of the service binary */ + res = GetModuleFileName( + NULL, /* current process */ + binary_path, + MAX_PATH ); + + if( res == MAX_PATH ) { + WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); + wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_GET_PATH_OF_BINARY, + _( "Unable to get full path of the binary of service '%s': %s (%d)" ), + service_name, errbuf, GetLastError( ) ); + CloseServiceHandle( scm ); + return WOLF_ERR_INTERNAL; + } + + /* create the service */ + service = CreateService( + scm, + service_name, + service_name_descr, + SERVICE_ALL_ACCESS, + SERVICE_WIN32_OWN_PROCESS, /* run isolated in its own process */ + SERVICE_DEMAND_START, /* let the user choose the start type */ + SERVICE_ERROR_NORMAL, /* report error and continue boot */ + binary_path, + NULL, /* order group */ + NULL, /* tag in the order group */ + NULL, /* service dependencies */ + NULL, /* Local System Account */ + NULL ); + + if( service == NULL ) { + WOLF_LOG_GET_LAST_ERROR( GetLastError( ), errbuf, 512 ); + wolf_log( WOLF_LOG_ERR, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_CANT_CREATE_SERVICE, + _( "Unable to create service '%s': %s (%d)" ), + service_name, errbuf, GetLastError( ) ); + CloseServiceHandle( scm ); + return WOLF_ERR_INTERNAL; + } + + CloseServiceHandle( service ); + CloseServiceHandle( scm ); + + wolf_log( WOLF_LOG_DEBUG, WOLF_CATEGORY_TESTSERVICE, WOLF_MSG_TESTSERVICE_SERVICE_INSTALLED, + _( "Service '%s' installed successfully" ), service_name ); + + return WOLF_OK; } void __cdecl _tmain( int argc, TCHAR *argv[] ) { @@ -46,8 +169,17 @@ void __cdecl _tmain( int argc, TCHAR *argv[] ) { return; } - if( strcasecmp( argv[1], "/install" ) == 0 ) { - wolf_service_register( ); + if( strcasecmp( argv[1], "/help" ) == 0 ) { + printf( "testsrevice [options]\r\n" ); + printf( " /help show this help page\r\n" ); + printf( " /install install the service\r\n" ); + printf( " /remove remove the servuce\r\n" ); + } else if( strcasecmp( argv[1], "/install" ) == 0 ) { + (void)wolf_service_install( SERVICE_NAME, SERVICE_NAME_DESCR ); + } else if( strcasecmp( argv[1], "/remove" ) == 0 ) { + (void)wolf_service_remove( SERVICE_NAME ); + } else { + fprintf( stderr, "Illegal option '%s'\r\n", argv[1] ); } wolf_log_closelogtoeventlog( ); |