summaryrefslogtreecommitdiff
path: root/tests/service
diff options
context:
space:
mode:
authorAndreas Baumann <abaumann@yahoo.com>2009-03-25 14:21:53 +0100
committerAndreas Baumann <abaumann@yahoo.com>2009-03-25 14:21:53 +0100
commitb165d6e741a2ffec68f1bdc1680abbc3c24aea9a (patch)
treee6f8dbc93ccd9aec5d42e53e9485749e39ed438f /tests/service
parentc58908e7616c5e183ceb34c571b84f13389ecf9a (diff)
downloadwolfbones-b165d6e741a2ffec68f1bdc1680abbc3c24aea9a.tar.gz
wolfbones-b165d6e741a2ffec68f1bdc1680abbc3c24aea9a.tar.bz2
testservice with /install and /remove
Diffstat (limited to 'tests/service')
-rw-r--r--tests/service/testservice.c150
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( );