]> git.sur5r.net Git - openldap/blobdiff - libraries/liblutil/ntservice.c
Really fix the fix to the past commit
[openldap] / libraries / liblutil / ntservice.c
index 57ab8c89f950c0ea75af7710be17b037c5ed6fef..bc4ae422dc3642b232c7736ffcbadfe210056d30 100644 (file)
@@ -1,10 +1,18 @@
+/* $OpenLDAP$ */
 /*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
-/* ntservice.c */
+
+/*
+ * NT Service manager utilities for OpenLDAP services
+ *     these should NOT be slapd specific, but are
+ */
+
 #include "portable.h"
 
+#ifdef HAVE_NT_SERVICE_MANAGER
+
 #include <ac/stdlib.h>
 #include <ac/string.h>
 
@@ -40,10 +48,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;
@@ -55,10 +63,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)
@@ -75,13 +83,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);
                        }
@@ -89,7 +97,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);
                        }
@@ -98,13 +106,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);
 }
 
@@ -124,24 +132,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 )
 {
@@ -290,7 +349,7 @@ void *getRegParam( char *svc, char *value )
        DWORD valLen = sizeof( vValue );
 
        if ( svc != NULL )
-               sprintf ( path, "SOFTWARE\\OpenLDAP\\%s\\Parameters", svc );
+               sprintf ( path, "SOFTWARE\\%s", svc );
        else
                strcpy (path, "SOFTWARE\\OpenLDAP\\Parameters" );
        
@@ -329,12 +388,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] );
@@ -424,3 +483,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