Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
Synchronet
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
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
Main
Synchronet
Commits
cf965d1a
Commit
cf965d1a
authored
21 years ago
by
rswindell
Browse files
Options
Downloads
Patches
Plain Diff
Using command service control handler function now.
Services accept system shutdown control messages now.
parent
d2142d57
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/sbbs3/ntsvcs.c
+55
-28
55 additions, 28 deletions
src/sbbs3/ntsvcs.c
with
55 additions
and
28 deletions
src/sbbs3/ntsvcs.c
+
55
−
28
View file @
cf965d1a
...
@@ -51,6 +51,9 @@
...
@@ -51,6 +51,9 @@
#define NO_WEB_SERVER
#define NO_WEB_SERVER
#endif
#endif
#define NTSVC_TIMEOUT_STARTUP 30000
/* Milliseconds */
#define NTSVC_TIMEOUT_TERMINATE 30000
/* Milliseconds */
static
void
WINAPI
bbs_ctrl_handler
(
DWORD
dwCtrlCode
);
static
void
WINAPI
bbs_ctrl_handler
(
DWORD
dwCtrlCode
);
static
void
WINAPI
ftp_ctrl_handler
(
DWORD
dwCtrlCode
);
static
void
WINAPI
ftp_ctrl_handler
(
DWORD
dwCtrlCode
);
static
void
WINAPI
web_ctrl_handler
(
DWORD
dwCtrlCode
);
static
void
WINAPI
web_ctrl_handler
(
DWORD
dwCtrlCode
);
...
@@ -129,6 +132,7 @@ sbbs_ntsvc_t services = {
...
@@ -129,6 +132,7 @@ sbbs_ntsvc_t services = {
};
};
#endif
#endif
/* This list is used for enumerating all services */
sbbs_ntsvc_t
*
ntsvc_list
[]
=
{
sbbs_ntsvc_t
*
ntsvc_list
[]
=
{
&
bbs
,
&
bbs
,
&
ftp
,
&
ftp
,
...
@@ -164,18 +168,33 @@ static BOOL winsock_cleanup(void)
...
@@ -164,18 +168,33 @@ static BOOL winsock_cleanup(void)
return
(
FALSE
);
return
(
FALSE
);
}
}
/****************************************/
/* Service Control Handlers (Callbacks) */
/* Service Control Handlers (Callbacks) */
/****************************************/
/* Common control handler for all services */
static
void
svc_ctrl_handler
(
sbbs_ntsvc_t
*
svc
,
DWORD
dwCtrlCode
)
{
switch
(
dwCtrlCode
)
{
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_SHUTDOWN
:
svc
->
status
.
dwWaitHint
=
NTSVC_TIMEOUT_TERMINATE
;
svc
->
status
.
dwCurrentState
=
SERVICE_STOP_PENDING
;
break
;
}
SetServiceStatus
(
svc
->
status_handle
,
&
svc
->
status
);
}
/* Service-specific control handler stub functions */
static
void
WINAPI
bbs_ctrl_handler
(
DWORD
dwCtrlCode
)
static
void
WINAPI
bbs_ctrl_handler
(
DWORD
dwCtrlCode
)
{
{
switch
(
dwCtrlCode
)
{
switch
(
dwCtrlCode
)
{
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_SHUTDOWN
:
case
SERVICE_CONTROL_SHUTDOWN
:
bbs_terminate
();
bbs_terminate
();
bbs
.
status
.
dwCurrentState
=
SERVICE_STOP_PENDING
;
break
;
break
;
}
}
SetServiceStatus
(
bbs
.
status
_handle
,
&
bbs
.
status
);
svc_ctrl
_handle
r
(
&
bbs
,
dwCtrlCode
);
}
}
static
void
WINAPI
ftp_ctrl_handler
(
DWORD
dwCtrlCode
)
static
void
WINAPI
ftp_ctrl_handler
(
DWORD
dwCtrlCode
)
...
@@ -184,10 +203,9 @@ static void WINAPI ftp_ctrl_handler(DWORD dwCtrlCode)
...
@@ -184,10 +203,9 @@ static void WINAPI ftp_ctrl_handler(DWORD dwCtrlCode)
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_SHUTDOWN
:
case
SERVICE_CONTROL_SHUTDOWN
:
ftp_terminate
();
ftp_terminate
();
ftp
.
status
.
dwCurrentState
=
SERVICE_STOP_PENDING
;
break
;
break
;
}
}
SetServiceStatus
(
ftp
.
status
_handle
,
&
ftp
.
status
);
svc_ctrl
_handle
r
(
&
ftp
,
dwCtrlCode
);
}
}
#if !defined(NO_WEB_SERVER)
#if !defined(NO_WEB_SERVER)
...
@@ -197,10 +215,9 @@ static void WINAPI web_ctrl_handler(DWORD dwCtrlCode)
...
@@ -197,10 +215,9 @@ static void WINAPI web_ctrl_handler(DWORD dwCtrlCode)
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_SHUTDOWN
:
case
SERVICE_CONTROL_SHUTDOWN
:
web_terminate
();
web_terminate
();
web
.
status
.
dwCurrentState
=
SERVICE_STOP_PENDING
;
break
;
break
;
}
}
SetServiceStatus
(
web
.
status
_handle
,
&
web
.
status
);
svc_ctrl
_handle
r
(
&
web
,
dwCtrlCode
);
}
}
#endif
#endif
...
@@ -210,10 +227,9 @@ static void WINAPI mail_ctrl_handler(DWORD dwCtrlCode)
...
@@ -210,10 +227,9 @@ static void WINAPI mail_ctrl_handler(DWORD dwCtrlCode)
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_SHUTDOWN
:
case
SERVICE_CONTROL_SHUTDOWN
:
mail_terminate
();
mail_terminate
();
mail
.
status
.
dwCurrentState
=
SERVICE_STOP_PENDING
;
break
;
break
;
}
}
SetServiceStatus
(
mail
.
status
_handle
,
&
mail
.
status
);
svc_ctrl
_handle
r
(
&
mail
,
dwCtrlCode
);
}
}
#if !defined(NO_SERVICES)
#if !defined(NO_SERVICES)
...
@@ -223,47 +239,43 @@ static void WINAPI services_ctrl_handler(DWORD dwCtrlCode)
...
@@ -223,47 +239,43 @@ static void WINAPI services_ctrl_handler(DWORD dwCtrlCode)
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_STOP
:
case
SERVICE_CONTROL_SHUTDOWN
:
case
SERVICE_CONTROL_SHUTDOWN
:
services_terminate
();
services_terminate
();
services
.
status
.
dwCurrentState
=
SERVICE_STOP_PENDING
;
break
;
break
;
}
}
SetServiceStatus
(
services
.
status
_handle
,
&
services
.
status
);
svc_ctrl
_handle
r
(
&
services
,
dwCtrlCode
);
}
}
#endif
#endif
/****************************************************************************/
/****************************************************************************/
/*
BBS
local/log print routine
*/
/*
Event thread
local/log print routine */
/****************************************************************************/
/****************************************************************************/
static
int
svc
_lputs
(
void
*
p
,
char
*
str
)
static
int
event
_lputs
(
char
*
str
)
{
{
char
line
[
1024
];
char
line
[
1024
];
sbbs_ntsvc_t
*
svc
=
(
sbbs_ntsvc_t
*
)
p
;
snprintf
(
line
,
sizeof
(
line
),
"
%s: %s"
,
svc
==
NULL
?
"Synchronet"
:
svc
->
name
,
str
);
snprintf
(
line
,
sizeof
(
line
),
"
SynchronetEvent: %s"
,
str
);
OutputDebugString
(
line
);
OutputDebugString
(
line
);
return
(
0
);
return
(
0
);
}
}
/************************************
****************************************
/
/************************************/
/*
Event th
re
a
d
local/log print routine
*/
/*
Sha
red
Service Callback Routines
*/
/************************************
****************************************
/
/************************************/
static
int
event
_lputs
(
char
*
str
)
static
int
svc
_lputs
(
void
*
p
,
char
*
str
)
{
{
char
line
[
1024
];
char
line
[
1024
];
sbbs_ntsvc_t
*
svc
=
(
sbbs_ntsvc_t
*
)
p
;
snprintf
(
line
,
sizeof
(
line
),
"
SynchronetEvent: %s"
,
str
);
snprintf
(
line
,
sizeof
(
line
),
"
%s: %s"
,
svc
==
NULL
?
"Synchronet"
:
svc
->
name
,
str
);
OutputDebugString
(
line
);
OutputDebugString
(
line
);
return
(
0
);
return
(
0
);
}
}
/************************************/
/* Shared Service Callback Routines */
/************************************/
static
void
svc_started
(
void
*
p
)
static
void
svc_started
(
void
*
p
)
{
{
sbbs_ntsvc_t
*
svc
=
(
sbbs_ntsvc_t
*
)
p
;
sbbs_ntsvc_t
*
svc
=
(
sbbs_ntsvc_t
*
)
p
;
svc
->
status
.
dwCurrentState
=
SERVICE_RUNNING
;
svc
->
status
.
dwCurrentState
=
SERVICE_RUNNING
;
svc
->
status
.
dwControlsAccepted
=
SERVICE_ACCEPT_STOP
;
svc
->
status
.
dwControlsAccepted
|
=
SERVICE_ACCEPT_STOP
;
SetServiceStatus
(
svc
->
status_handle
,
&
svc
->
status
);
SetServiceStatus
(
svc
->
status_handle
,
&
svc
->
status
);
}
}
...
@@ -278,7 +290,11 @@ static void svc_terminated(void* p, int code)
...
@@ -278,7 +290,11 @@ static void svc_terminated(void* p, int code)
}
}
}
}
/* Generic ServiceMain function */
/***************/
/* ServiceMain */
/***************/
/* Common ServiceMain for all services */
static
void
WINAPI
svc_start
(
sbbs_ntsvc_t
*
svc
)
static
void
WINAPI
svc_start
(
sbbs_ntsvc_t
*
svc
)
{
{
svc_lputs
(
svc
,
"Starting service"
);
svc_lputs
(
svc
,
"Starting service"
);
...
@@ -290,7 +306,8 @@ static void WINAPI svc_start(sbbs_ntsvc_t* svc)
...
@@ -290,7 +306,8 @@ static void WINAPI svc_start(sbbs_ntsvc_t* svc)
memset
(
&
svc
->
status
,
0
,
sizeof
(
SERVICE_STATUS
));
memset
(
&
svc
->
status
,
0
,
sizeof
(
SERVICE_STATUS
));
svc
->
status
.
dwServiceType
=
SERVICE_WIN32_SHARE_PROCESS
;
svc
->
status
.
dwServiceType
=
SERVICE_WIN32_SHARE_PROCESS
;
svc
->
status
.
dwWaitHint
=
30000
;
/* milliseconds */
svc
->
status
.
dwControlsAccepted
=
SERVICE_ACCEPT_SHUTDOWN
;
svc
->
status
.
dwWaitHint
=
NTSVC_TIMEOUT_STARTUP
;
svc
->
status
.
dwCurrentState
=
SERVICE_START_PENDING
;
svc
->
status
.
dwCurrentState
=
SERVICE_START_PENDING
;
SetServiceStatus
(
svc
->
status_handle
,
&
svc
->
status
);
SetServiceStatus
(
svc
->
status_handle
,
&
svc
->
status
);
...
@@ -301,7 +318,7 @@ static void WINAPI svc_start(sbbs_ntsvc_t* svc)
...
@@ -301,7 +318,7 @@ static void WINAPI svc_start(sbbs_ntsvc_t* svc)
SetServiceStatus
(
svc
->
status_handle
,
&
svc
->
status
);
SetServiceStatus
(
svc
->
status_handle
,
&
svc
->
status
);
}
}
/*
These are the actual
ServiceMain stub functions */
/*
Service-specific
ServiceMain stub functions */
static
void
WINAPI
bbs_start
(
DWORD
dwArgc
,
LPTSTR
*
lpszArgv
)
static
void
WINAPI
bbs_start
(
DWORD
dwArgc
,
LPTSTR
*
lpszArgv
)
{
{
...
@@ -353,6 +370,9 @@ static void describe_service(HANDLE hSCMlib, SC_HANDLE hService, char* descripti
...
@@ -353,6 +370,9 @@ static void describe_service(HANDLE hSCMlib, SC_HANDLE hService, char* descripti
changeServiceConfig2
(
hService
,
SERVICE_CONFIG_DESCRIPTION
,
&
service_desc
);
changeServiceConfig2
(
hService
,
SERVICE_CONFIG_DESCRIPTION
,
&
service_desc
);
}
}
/****************************************************************************/
/* Utility function to create a service with description (on Win2K+) */
/****************************************************************************/
static
SC_HANDLE
create_service
(
HANDLE
hSCMlib
,
SC_HANDLE
hSCManager
static
SC_HANDLE
create_service
(
HANDLE
hSCMlib
,
SC_HANDLE
hSCManager
,
char
*
name
,
char
*
display_name
,
char
*
description
,
char
*
path
)
,
char
*
name
,
char
*
display_name
,
char
*
description
,
char
*
path
)
{
{
...
@@ -386,7 +406,9 @@ static SC_HANDLE create_service(HANDLE hSCMlib, SC_HANDLE hSCManager
...
@@ -386,7 +406,9 @@ static SC_HANDLE create_service(HANDLE hSCMlib, SC_HANDLE hSCManager
return
(
hService
);
return
(
hService
);
}
}
/****************************************************************************/
/* Install one or all services */
/****************************************************************************/
static
int
install
(
const
char
*
svc_name
)
static
int
install
(
const
char
*
svc_name
)
{
{
int
i
;
int
i
;
...
@@ -432,6 +454,9 @@ static int install(const char* svc_name)
...
@@ -432,6 +454,9 @@ static int install(const char* svc_name)
return
(
0
);
return
(
0
);
}
}
/****************************************************************************/
/* Utility function to remove a service cleanly (stopping if necessary) */
/****************************************************************************/
static
void
remove_service
(
SC_HANDLE
hSCManager
,
char
*
name
,
char
*
DISP_name
)
static
void
remove_service
(
SC_HANDLE
hSCManager
,
char
*
name
,
char
*
DISP_name
)
{
{
SC_HANDLE
hService
;
SC_HANDLE
hService
;
...
@@ -468,7 +493,9 @@ static void remove_service(SC_HANDLE hSCManager, char* name, char* DISP_name)
...
@@ -468,7 +493,9 @@ static void remove_service(SC_HANDLE hSCManager, char* name, char* DISP_name)
CloseServiceHandle
(
hService
);
CloseServiceHandle
(
hService
);
}
}
/****************************************************************************/
/* Uninstall one or all services */
/****************************************************************************/
static
int
uninstall
(
const
char
*
svc_name
)
static
int
uninstall
(
const
char
*
svc_name
)
{
{
int
i
;
int
i
;
...
...
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