mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-18 11:05:48 +08:00
close registry, and return static pointer (no free) from getRegParam
This commit is contained in:
parent
7a7f3018fa
commit
e61bb6aa3f
@ -10,15 +10,14 @@
|
||||
#include <ac/string.h>
|
||||
|
||||
#include "ldap_defaults.h"
|
||||
//#include "slap.h"
|
||||
|
||||
#include "slapdmsg.h"
|
||||
|
||||
#define SCM_NOTIFICATION_INTERVAL 5000
|
||||
#define THIRTY_SECONDS (30 * 1000)
|
||||
|
||||
int is_NT_Service = 1; // assume this is an NT service until determined that
|
||||
// startup was from the command line
|
||||
int is_NT_Service = 1; /* assume this is an NT service until determined that */
|
||||
/* startup was from the command line */
|
||||
|
||||
SERVICE_STATUS SLAPDServiceStatus;
|
||||
SERVICE_STATUS_HANDLE hSLAPDServiceStatus;
|
||||
@ -28,14 +27,14 @@ ldap_pvt_thread_t start_status_tid, stop_status_tid;
|
||||
|
||||
void (*stopfunc)(int);
|
||||
|
||||
// in main.c
|
||||
/* in main.c */
|
||||
void WINAPI ServiceMain( DWORD argc, LPTSTR *argv );
|
||||
|
||||
|
||||
// in wsa_err.c
|
||||
/* in wsa_err.c */
|
||||
char *WSAGetLastErrorString( void );
|
||||
|
||||
// in nt_err.c
|
||||
/* in nt_err.c */
|
||||
char *GetLastErrorString( void );
|
||||
|
||||
int srv_install(LPCTSTR lpszServiceName, LPCTSTR lpszBinaryPathName)
|
||||
@ -64,7 +63,7 @@ int srv_install(LPCTSTR lpszServiceName, LPCTSTR lpszBinaryPathName)
|
||||
|
||||
sprintf( regpath, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s",
|
||||
lpszServiceName );
|
||||
// Create the registry key for event logging to the Windows NT event log.
|
||||
/* Create the registry key for event logging to the Windows NT event log. */
|
||||
if ( RegCreateKeyEx(HKEY_LOCAL_MACHINE,
|
||||
regpath, 0,
|
||||
"REG_SZ", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey,
|
||||
@ -150,9 +149,9 @@ static void *start_status_routine( void *ptr )
|
||||
{
|
||||
case WAIT_ABANDONED:
|
||||
case WAIT_OBJECT_0:
|
||||
// the object that we were waiting for has been destroyed (ABANDONED) or
|
||||
// signalled (TIMEOUT_0). We can assume that the startup process is
|
||||
// complete and tell the Service Control Manager that we are now runnng
|
||||
/* the object that we were waiting for has been destroyed (ABANDONED) or
|
||||
* signalled (TIMEOUT_0). We can assume that the startup process is
|
||||
* complete and tell the Service Control Manager that we are now runnng */
|
||||
SLAPDServiceStatus.dwCurrentState = SERVICE_RUNNING;
|
||||
SLAPDServiceStatus.dwWin32ExitCode = NO_ERROR;
|
||||
SLAPDServiceStatus.dwCheckPoint++;
|
||||
@ -161,16 +160,16 @@ static void *start_status_routine( void *ptr )
|
||||
done = 1;
|
||||
break;
|
||||
case WAIT_TIMEOUT:
|
||||
// We've waited for the required time, so send an update to the Service Control
|
||||
// Manager saying to wait again.
|
||||
/* We've waited for the required time, so send an update to the Service Control
|
||||
* Manager saying to wait again. */
|
||||
SLAPDServiceStatus.dwCheckPoint++;
|
||||
SLAPDServiceStatus.dwWaitHint = SCM_NOTIFICATION_INTERVAL * 2;
|
||||
SetServiceStatus(hSLAPDServiceStatus, &SLAPDServiceStatus);
|
||||
break;
|
||||
case WAIT_FAILED:
|
||||
// theres been some proble with WaitForSingleObject so tell the Service
|
||||
// Control Manager to wait 30 seconds before deploying its assasin and
|
||||
// then leave the thread.
|
||||
/* theres been some proble with WaitForSingleObject so tell the Service
|
||||
* Control Manager to wait 30 seconds before deploying its assasin and
|
||||
* then leave the thread. */
|
||||
SLAPDServiceStatus.dwCheckPoint++;
|
||||
SLAPDServiceStatus.dwWaitHint = THIRTY_SECONDS;
|
||||
SetServiceStatus(hSLAPDServiceStatus, &SLAPDServiceStatus);
|
||||
@ -196,23 +195,23 @@ static void *stop_status_routine( void *ptr )
|
||||
{
|
||||
case WAIT_ABANDONED:
|
||||
case WAIT_OBJECT_0:
|
||||
// the object that we were waiting for has been destroyed (ABANDONED) or
|
||||
// signalled (TIMEOUT_0). The shutting down process is therefore complete
|
||||
// and the final SERVICE_STOPPED message will be sent to the service control
|
||||
// manager prior to the process terminating.
|
||||
/* the object that we were waiting for has been destroyed (ABANDONED) or
|
||||
* signalled (TIMEOUT_0). The shutting down process is therefore complete
|
||||
* and the final SERVICE_STOPPED message will be sent to the service control
|
||||
* manager prior to the process terminating. */
|
||||
done = 1;
|
||||
break;
|
||||
case WAIT_TIMEOUT:
|
||||
// We've waited for the required time, so send an update to the Service Control
|
||||
// Manager saying to wait again.
|
||||
/* We've waited for the required time, so send an update to the Service Control
|
||||
* Manager saying to wait again. */
|
||||
SLAPDServiceStatus.dwCheckPoint++;
|
||||
SLAPDServiceStatus.dwWaitHint = SCM_NOTIFICATION_INTERVAL * 2;
|
||||
SetServiceStatus(hSLAPDServiceStatus, &SLAPDServiceStatus);
|
||||
break;
|
||||
case WAIT_FAILED:
|
||||
// theres been some proble with WaitForSingleObject so tell the Service
|
||||
// Control Manager to wait 30 seconds before deploying its assasin and
|
||||
// then leave the thread.
|
||||
/* theres been some proble with WaitForSingleObject so tell the Service
|
||||
* Control Manager to wait 30 seconds before deploying its assasin and
|
||||
* then leave the thread. */
|
||||
SLAPDServiceStatus.dwCheckPoint++;
|
||||
SLAPDServiceStatus.dwWaitHint = THIRTY_SECONDS;
|
||||
SetServiceStatus(hSLAPDServiceStatus, &SLAPDServiceStatus);
|
||||
@ -242,25 +241,25 @@ void WINAPI SLAPDServiceCtrlHandler( IN DWORD Opcode)
|
||||
ldap_pvt_thread_cond_init( &stopped_event );
|
||||
if ( stopped_event == NULL )
|
||||
{
|
||||
// the event was not created. We will ask the service control manager for 30
|
||||
// seconds to shutdown
|
||||
/* the event was not created. We will ask the service control manager for 30
|
||||
* seconds to shutdown */
|
||||
SLAPDServiceStatus.dwCheckPoint++;
|
||||
SLAPDServiceStatus.dwWaitHint = THIRTY_SECONDS;
|
||||
SetServiceStatus(hSLAPDServiceStatus, &SLAPDServiceStatus);
|
||||
}
|
||||
else
|
||||
{
|
||||
// start a thread to report the progress to the service control manager
|
||||
// until the stopped_event is fired.
|
||||
/* start a thread to report the progress to the service control manager
|
||||
* until the stopped_event is fired. */
|
||||
if ( ldap_pvt_thread_create( &stop_status_tid, 0, stop_status_routine, NULL ) == 0 )
|
||||
{
|
||||
|
||||
}
|
||||
else {
|
||||
// failed to create the thread that tells the Service Control Manager that the
|
||||
// service stopping is proceeding.
|
||||
// tell the Service Control Manager to wait another 30 seconds before deploying its
|
||||
// assasin.
|
||||
/* failed to create the thread that tells the Service Control Manager that the
|
||||
* service stopping is proceeding.
|
||||
* tell the Service Control Manager to wait another 30 seconds before deploying its
|
||||
* assasin. */
|
||||
SLAPDServiceStatus.dwCheckPoint++;
|
||||
SLAPDServiceStatus.dwWaitHint = THIRTY_SECONDS;
|
||||
SetServiceStatus(hSLAPDServiceStatus, &SLAPDServiceStatus);
|
||||
@ -276,47 +275,40 @@ void WINAPI SLAPDServiceCtrlHandler( IN DWORD Opcode)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void *getRegParam( char *svc, char *value )
|
||||
{
|
||||
HANDLE hkey;
|
||||
HKEY hkey;
|
||||
char path[255];
|
||||
int i = 0, rc;
|
||||
char vName[256];
|
||||
DWORD vNameLen = 255;
|
||||
DWORD vType;
|
||||
static char vValue[1024];
|
||||
DWORD valLen = 1024;
|
||||
DWORD valLen = sizeof( vValue );
|
||||
|
||||
if ( svc != NULL )
|
||||
sprintf ( path, "SOFTWARE\\OpenLDAP\\%s\\Parameters", svc );
|
||||
else
|
||||
strcpy (path, "SOFTWARE\\OpenLDAP\\Parameters" );
|
||||
|
||||
if( (rc = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
|
||||
path, 0, KEY_READ, &hkey )) != ERROR_SUCCESS )
|
||||
|
||||
if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &hkey ) != ERROR_SUCCESS )
|
||||
{
|
||||
//Debug( LDAP_DEBUG_ANY, "%s\n", GetLastErrorString(), 0, 0 );
|
||||
/*Debug( LDAP_DEBUG_ANY, "RegOpenKeyEx() %s\n", GetLastErrorString(), 0, 0); */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while ( !RegEnumValue( hkey, i, vName, &vNameLen, NULL,
|
||||
&vType, vValue, &valLen ) )
|
||||
if ( RegQueryValueEx( hkey, value, NULL, &vType, vValue, &valLen ) != ERROR_SUCCESS )
|
||||
{
|
||||
if ( !strcasecmp( value, vName ) )
|
||||
{
|
||||
switch ( vType )
|
||||
{
|
||||
case REG_BINARY:
|
||||
case REG_DWORD:
|
||||
return (void*)&vValue;
|
||||
case REG_SZ:
|
||||
return (void*)strdup( vValue );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
vNameLen = 255;
|
||||
valLen = 1024;
|
||||
/*Debug( LDAP_DEBUG_ANY, "RegQueryValueEx() %s\n", GetLastErrorString(), 0, 0 );*/
|
||||
RegCloseKey( hkey );
|
||||
return NULL;
|
||||
}
|
||||
RegCloseKey( hkey );
|
||||
|
||||
switch ( vType )
|
||||
{
|
||||
case REG_BINARY:
|
||||
case REG_DWORD:
|
||||
return (void*)&vValue;
|
||||
case REG_SZ:
|
||||
return (void*)&vValue;
|
||||
}
|
||||
return (void*)NULL;
|
||||
}
|
||||
@ -374,32 +366,32 @@ void CommenceStartupProcessing( LPCTSTR lpszServiceName,
|
||||
|
||||
SetServiceStatus(hSLAPDServiceStatus, &SLAPDServiceStatus);
|
||||
|
||||
// start up a thread to keep sending SERVICE_START_PENDING to the Service Control Manager
|
||||
// until the slapd listener is completed and listening. Only then should we send
|
||||
// SERVICE_RUNNING to the Service Control Manager.
|
||||
/* start up a thread to keep sending SERVICE_START_PENDING to the Service Control Manager
|
||||
* until the slapd listener is completed and listening. Only then should we send
|
||||
* SERVICE_RUNNING to the Service Control Manager. */
|
||||
ldap_pvt_thread_cond_init( &started_event );
|
||||
if ( started_event == NULL)
|
||||
{
|
||||
// failed to create the event to determine when the startup process is complete so
|
||||
// tell the Service Control Manager to wait another 30 seconds before deploying its
|
||||
// assasin
|
||||
/* failed to create the event to determine when the startup process is complete so
|
||||
* tell the Service Control Manager to wait another 30 seconds before deploying its
|
||||
* assasin */
|
||||
SLAPDServiceStatus.dwCheckPoint++;
|
||||
SLAPDServiceStatus.dwWaitHint = THIRTY_SECONDS;
|
||||
SetServiceStatus(hSLAPDServiceStatus, &SLAPDServiceStatus);
|
||||
}
|
||||
else
|
||||
{
|
||||
// start a thread to report the progress to the service control manager
|
||||
// until the started_event is fired.
|
||||
/* start a thread to report the progress to the service control manager
|
||||
* until the started_event is fired. */
|
||||
if ( ldap_pvt_thread_create( &start_status_tid, 0, start_status_routine, NULL ) == 0 )
|
||||
{
|
||||
|
||||
}
|
||||
else {
|
||||
// failed to create the thread that tells the Service Control Manager that the
|
||||
// service startup is proceeding.
|
||||
// tell the Service Control Manager to wait another 30 seconds before deploying its
|
||||
// assasin.
|
||||
/* failed to create the thread that tells the Service Control Manager that the
|
||||
* service startup is proceeding.
|
||||
* tell the Service Control Manager to wait another 30 seconds before deploying its
|
||||
* assasin. */
|
||||
SLAPDServiceStatus.dwCheckPoint++;
|
||||
SLAPDServiceStatus.dwWaitHint = THIRTY_SECONDS;
|
||||
SetServiceStatus(hSLAPDServiceStatus, &SLAPDServiceStatus);
|
||||
@ -411,12 +403,12 @@ void ReportSlapdShutdownComplete( )
|
||||
{
|
||||
if ( is_NT_Service )
|
||||
{
|
||||
// stop sending SERVICE_STOP_PENDING messages to the Service Control Manager
|
||||
/* stop sending SERVICE_STOP_PENDING messages to the Service Control Manager */
|
||||
ldap_pvt_thread_cond_signal( &stopped_event );
|
||||
ldap_pvt_thread_cond_destroy( &stopped_event );
|
||||
|
||||
// wait for the thread sending the SERVICE_STOP_PENDING messages to the Service Control Manager to die.
|
||||
// if the wait fails then put ourselves to sleep for half the Service Control Manager update interval
|
||||
/* wait for the thread sending the SERVICE_STOP_PENDING messages to the Service Control Manager to die.
|
||||
* if the wait fails then put ourselves to sleep for half the Service Control Manager update interval */
|
||||
if (ldap_pvt_thread_join( stop_status_tid, (void *) NULL ) == -1)
|
||||
ldap_pvt_thread_sleep( SCM_NOTIFICATION_INTERVAL / 2 );
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user