Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
O
OpenLDAP
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Lukas However
OpenLDAP
Commits
e61bb6aa
Commit
e61bb6aa
authored
25 years ago
by
Gary Williams
Browse files
Options
Downloads
Patches
Plain Diff
close registry, and return static pointer (no free) from getRegParam
parent
7a7f3018
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
libraries/liblutil/ntservice.c
+65
-73
65 additions, 73 deletions
libraries/liblutil/ntservice.c
with
65 additions
and
73 deletions
libraries/liblutil/ntservice.c
+
65
−
73
View file @
e61bb6aa
...
...
@@ -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
)
{
H
ANDLE
hkey
;
H
KEY
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
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment