X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=libraries%2Fliblutil%2Fntservice.c;h=9bd27b7065837dfaab261b7564f97324eb8cdaf2;hb=3121074ad72bf6a4ef2a29c9440a4e740e2e1947;hp=bf6d114b05d80dbbd3a2fd2ce257d2e5ea8bd0da;hpb=b1701d24e143151fd76aadbd0437115b95615d86;p=openldap diff --git a/libraries/liblutil/ntservice.c b/libraries/liblutil/ntservice.c index bf6d114b05..9bd27b7065 100644 --- a/libraries/liblutil/ntservice.c +++ b/libraries/liblutil/ntservice.c @@ -1,6 +1,18 @@ -/* ntservice.c */ +/* $OpenLDAP$ */ +/* + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ + +/* + * NT Service manager utilities for OpenLDAP services + * these should NOT be slapd specific, but are + */ + #include "portable.h" +#ifdef HAVE_NT_SERVICE_MANAGER + #include #include @@ -11,8 +23,16 @@ #include +/* + * The whole debug implementation is a bit of a hack. + * We have to define this LDAP_SLAPD_V macro here since the slap.h + * header file isn't included (and really shouldn't be). + * TODO: re-implement debug functions so that the debug level can + * be passed around instead of having to count on the existence of + * ldap_debug, slap_debug, etc. + */ #define ldap_debug slap_debug -extern int slap_debug; +LDAP_SLAPD_V (int) slap_debug; #include "ldap_log.h" #include "ldap_pvt_thread.h" @@ -36,10 +56,10 @@ ldap_pvt_thread_t start_status_tid, stop_status_tid; void (*stopfunc)(int); -/* in nt_err.c */ -char *GetLastErrorString( void ); +static char *GetLastErrorString( void ); -int srv_install(LPCTSTR lpszServiceName, LPCTSTR lpszBinaryPathName) +int srv_install(LPCTSTR lpszServiceName, LPCTSTR lpszDisplayName, + LPCTSTR lpszBinaryPathName, BOOL auto_start) { HKEY hKey; DWORD dwValue, dwDisposition; @@ -51,10 +71,10 @@ int srv_install(LPCTSTR lpszServiceName, LPCTSTR lpszBinaryPathName) if ((schService = CreateService( schSCManager, lpszServiceName, - TEXT("OpenLDAP Directory Service"), - SC_MANAGER_CREATE_SERVICE, + lpszDisplayName, + SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, - SERVICE_DEMAND_START, + auto_start ? SERVICE_AUTO_START : SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, lpszBinaryPathName, NULL, NULL, NULL, NULL, NULL)) != NULL) @@ -63,7 +83,8 @@ int srv_install(LPCTSTR lpszServiceName, LPCTSTR lpszBinaryPathName) CloseServiceHandle(schService); CloseServiceHandle(schSCManager); - sprintf( regpath, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s", + snprintf( regpath, sizeof regpath, + "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s", lpszServiceName ); /* Create the registry key for event logging to the Windows NT event log. */ if ( RegCreateKeyEx(HKEY_LOCAL_MACHINE, @@ -71,13 +92,13 @@ int srv_install(LPCTSTR lpszServiceName, LPCTSTR lpszBinaryPathName) "REG_SZ", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) != ERROR_SUCCESS) { - fprintf( stderr, "RegCreateKeyEx() failed. GetLastError=%d (%s)\n", GetLastError(), GetLastErrorString() ); + fprintf( stderr, "RegCreateKeyEx() failed. GetLastError=%lu (%s)\n", GetLastError(), GetLastErrorString() ); RegCloseKey(hKey); return(0); } if ( RegSetValueEx(hKey, "EventMessageFile", 0, REG_EXPAND_SZ, lpszBinaryPathName, strlen(lpszBinaryPathName) + 1) != ERROR_SUCCESS) { - fprintf( stderr, "RegSetValueEx(EventMessageFile) failed. GetLastError=%d (%s)\n", GetLastError(), GetLastErrorString() ); + fprintf( stderr, "RegSetValueEx(EventMessageFile) failed. GetLastError=%lu (%s)\n", GetLastError(), GetLastErrorString() ); RegCloseKey(hKey); return(0); } @@ -85,7 +106,7 @@ int srv_install(LPCTSTR lpszServiceName, LPCTSTR lpszBinaryPathName) dwValue = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE; if ( RegSetValueEx(hKey, "TypesSupported", 0, REG_DWORD, (LPBYTE) &dwValue, sizeof(DWORD)) != ERROR_SUCCESS) { - fprintf( stderr, "RegCreateKeyEx(TypesSupported) failed. GetLastError=%d (%s)\n", GetLastError(), GetLastErrorString() ); + fprintf( stderr, "RegCreateKeyEx(TypesSupported) failed. GetLastError=%lu (%s)\n", GetLastError(), GetLastErrorString() ); RegCloseKey(hKey); return(0); } @@ -94,13 +115,13 @@ int srv_install(LPCTSTR lpszServiceName, LPCTSTR lpszBinaryPathName) } else { - fprintf( stderr, "CreateService() failed. GetLastError=%d (%s)\n", GetLastError(), GetLastErrorString() ); + fprintf( stderr, "CreateService() failed. GetLastError=%lu (%s)\n", GetLastError(), GetLastErrorString() ); CloseServiceHandle(schSCManager); return(0); } } else - fprintf( stderr, "OpenSCManager() failed. GetLastError=%d (%s)\n", GetLastError(), GetLastErrorString() ); + fprintf( stderr, "OpenSCManager() failed. GetLastError=%lu (%s)\n", GetLastError(), GetLastErrorString() ); return(0); } @@ -120,24 +141,75 @@ int srv_remove(LPCTSTR lpszServiceName, LPCTSTR lpszBinaryPathName) CloseServiceHandle(schSCManager); return(1); } else { - fprintf( stderr, "DeleteService() failed. GetLastError=%d (%s)\n", GetLastError(), GetLastErrorString() ); + fprintf( stderr, "DeleteService() failed. GetLastError=%lu (%s)\n", GetLastError(), GetLastErrorString() ); fprintf( stderr, "The %s service has not been removed.\n", lpszBinaryPathName); CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return(0); } } else { - fprintf( stderr, "OpenService() failed. GetLastError=%d (%s)\n", GetLastError(), GetLastErrorString() ); + fprintf( stderr, "OpenService() failed. GetLastError=%lu (%s)\n", GetLastError(), GetLastErrorString() ); CloseServiceHandle(schSCManager); return(0); } } else - fprintf( stderr, "OpenSCManager() failed. GetLastError=%d (%s)\n", GetLastError(), GetLastErrorString() ); + fprintf( stderr, "OpenSCManager() failed. GetLastError=%lu (%s)\n", GetLastError(), GetLastErrorString() ); return(0); } +DWORD +svc_installed (LPTSTR lpszServiceName, LPTSTR lpszBinaryPathName) +{ + char buf[256]; + HKEY key; + DWORD rc; + DWORD type; + long len; + + strcpy(buf, TEXT("SYSTEM\\CurrentControlSet\\Services\\")); + strcat(buf, lpszServiceName); + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, buf, 0, KEY_QUERY_VALUE, &key) != ERROR_SUCCESS) + return(-1); + + rc = 0; + if (lpszBinaryPathName) { + len = sizeof(buf); + if (RegQueryValueEx(key, "ImagePath", NULL, &type, buf, &len) == ERROR_SUCCESS) { + if (strcmp(lpszBinaryPathName, buf)) + rc = -1; + } + } + RegCloseKey(key); + return(rc); +} + + +DWORD +svc_running (LPTSTR lpszServiceName) +{ + SC_HANDLE service; + SC_HANDLE scm; + DWORD rc; + SERVICE_STATUS ss; + + if (!(scm = OpenSCManager(NULL, NULL, GENERIC_READ))) + return(GetLastError()); + + rc = 1; + service = OpenService(scm, lpszServiceName, SERVICE_QUERY_STATUS); + if (service) { + if (!QueryServiceStatus(service, &ss)) + rc = GetLastError(); + else if (ss.dwCurrentState != SERVICE_STOPPED) + rc = 0; + CloseServiceHandle(service); + } + CloseServiceHandle(scm); + return(rc); +} + static void *start_status_routine( void *ptr ) { @@ -286,9 +358,9 @@ void *getRegParam( char *svc, char *value ) DWORD valLen = sizeof( vValue ); if ( svc != NULL ) - sprintf ( path, "SOFTWARE\\OpenLDAP\\%s\\Parameters", svc ); + snprintf ( path, sizeof path, "SOFTWARE\\%s", svc ); else - strcpy (path, "SOFTWARE\\OpenLDAP\\Parameters" ); + snprintf ( path, sizeof path, "SOFTWARE\\OpenLDAP\\Parameters" ); if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &hkey ) != ERROR_SUCCESS ) { @@ -325,12 +397,12 @@ void LogSlapdStartedEvent( char *svc, int slap_debug, char *configfile, char *ur Inserts[i] = (char *)malloc( 20 ); itoa( slap_debug, Inserts[i++], 10 ); - Inserts[i++] = ldap_pvt_strdup( configfile ); - Inserts[i++] = ldap_pvt_strdup( urls ? urls : "ldap:///" ); - Inserts[i++] = ldap_pvt_strdup( is_NT_Service ? "svc" : "cmd" ); + Inserts[i++] = strdup( configfile ); + Inserts[i++] = strdup( urls ? urls : "ldap:///" ); + Inserts[i++] = strdup( is_NT_Service ? "svc" : "cmd" ); ReportEvent( hEventLog, EVENTLOG_INFORMATION_TYPE, 0, - MSG_SLAPD_STARTED, NULL, i, 0, Inserts, NULL ); + MSG_SLAPD_STARTED, NULL, i, 0, (LPCSTR *) Inserts, NULL ); for ( j = 0; j < i; j++ ) ldap_memfree( Inserts[j] ); @@ -420,3 +492,22 @@ void ReportSlapdShutdownComplete( ) SetServiceStatus(hSLAPDServiceStatus, &SLAPDServiceStatus); } } + +static char *GetErrorString( int err ) +{ + static char msgBuf[1024]; + + FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + msgBuf, 1024, NULL ); + + return msgBuf; +} + +static char *GetLastErrorString( void ) +{ + return GetErrorString( GetLastError() ); +} +#endif