@@ -854,10 +854,15 @@ static DWORD reportsvcstatus(DWORD cs, DWORD wh)
854
854
static DWORD cpcnt = 1 ;
855
855
856
856
EnterCriticalSection (& scmservicelock );
857
- if ((servicestatus .dwCurrentState == SERVICE_STOPPED ) || (cs == 0 )) {
857
+ if (servicestatus .dwCurrentState == SERVICE_STOPPED ) {
858
+ cs = SERVICE_STOPPED ;
859
+ goto finished ;
860
+ }
861
+ if (cs == 0 ) {
858
862
cs = servicestatus .dwCurrentState ;
859
- LeaveCriticalSection (& scmservicelock );
860
- return cs ;
863
+ if (wh != 0 )
864
+ SetServiceStatus (svcstathandle , & servicestatus );
865
+ goto finished ;
861
866
}
862
867
servicestatus .dwControlsAccepted = 0 ;
863
868
servicestatus .dwCheckPoint = 0 ;
@@ -886,6 +891,8 @@ static DWORD reportsvcstatus(DWORD cs, DWORD wh)
886
891
}
887
892
servicestatus .dwCurrentState = cs ;
888
893
SetServiceStatus (svcstathandle , & servicestatus );
894
+
895
+ finished :
889
896
LeaveCriticalSection (& scmservicelock );
890
897
return cs ;
891
898
}
@@ -1043,7 +1050,7 @@ static void logprintf(const char *format, ...)
1043
1050
* Create service log file and rotate any previous
1044
1051
* files in the Logs directory.
1045
1052
*/
1046
- static DWORD opensvclog (int sstart )
1053
+ static DWORD opensvclog (int ssp )
1047
1054
{
1048
1055
HANDLE lh = 0 ;
1049
1056
wchar_t * logfn ;
@@ -1076,7 +1083,8 @@ static DWORD opensvclog(int sstart)
1076
1083
sa .lpSecurityDescriptor = 0 ;
1077
1084
sa .bInheritHandle = 0 ;
1078
1085
1079
- reportsvcstatus (SERVICE_START_PENDING , SVCBATCH_START_HINT );
1086
+ if (ssp )
1087
+ reportsvcstatus (SERVICE_START_PENDING , SVCBATCH_START_HINT );
1080
1088
lh = CreateFileW (logfn ,
1081
1089
GENERIC_WRITE ,
1082
1090
FILE_SHARE_READ ,
@@ -1105,7 +1113,8 @@ static DWORD opensvclog(int sstart)
1105
1113
if (MoveFileExW (logpn , lognn , MOVEFILE_REPLACE_EXISTING ) == 0 )
1106
1114
return GetLastError ();
1107
1115
xfree (lognn );
1108
- reportsvcstatus (SERVICE_START_PENDING , SVCBATCH_START_HINT );
1116
+ if (ssp )
1117
+ reportsvcstatus (SERVICE_START_PENDING , SVCBATCH_START_HINT );
1109
1118
}
1110
1119
xfree (logpn );
1111
1120
}
@@ -1336,6 +1345,9 @@ static DWORD WINAPI svcmonitorthread(LPVOID unused)
1336
1345
break ;
1337
1346
}
1338
1347
else if (cc == SVCBATCH_CTRL_BREAK ) {
1348
+ #if defined(_DBGVIEW )
1349
+ dbgprintf (__FUNCTION__ , "break signaled" );
1350
+ #endif
1339
1351
EnterCriticalSection (& logservicelock );
1340
1352
if (IS_VALID_HANDLE (logfhandle )) {
1341
1353
logfflush ();
@@ -1355,14 +1367,17 @@ static DWORD WINAPI svcmonitorthread(LPVOID unused)
1355
1367
GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT , 0 );
1356
1368
}
1357
1369
else if (cc == SVCBATCH_CTRL_ROTATE ) {
1370
+ #if defined(_DBGVIEW )
1371
+ dbgprintf (__FUNCTION__ , "rotate signaled" );
1372
+ #endif
1358
1373
if (rotatesvclog () != 0 ) {
1374
+ #if defined(_DBGVIEW )
1375
+ dbgprintf (__FUNCTION__ , "rotate log failed" );
1376
+ #endif
1359
1377
/**
1360
1378
* Logfile rotation failed.
1361
1379
* Create stop thread which will stop the service.
1362
1380
*/
1363
- #if defined(_DBGVIEW )
1364
- dbgprintf (__FUNCTION__ , "rotate log failed" );
1365
- #endif
1366
1381
xcreatethread (1 , & svcstopthread , 0 );
1367
1382
break ;
1368
1383
}
@@ -1528,17 +1543,13 @@ DWORD WINAPI servicehandler(DWORD ctrl, DWORD _xe, LPVOID _xd, LPVOID _xc)
1528
1543
/**
1529
1544
* Signal to svcmonitorthread that
1530
1545
* user send custom service control
1531
- *
1532
- * Those signals can be entered either
1533
- * manually or by some sort of cron job
1534
- * eg. to rotate logfile on regular interval
1535
- * or send CTRL_BREAK to Java applications started
1536
- * from batch file
1537
1546
*/
1538
1547
InterlockedExchange (& servicectrlnum , ctrl );
1539
1548
SetEvent (monitorevent );
1549
+ reportsvcstatus (0 , 1 );
1540
1550
break ;
1541
1551
case SERVICE_CONTROL_INTERROGATE :
1552
+ reportsvcstatus (0 , 1 );
1542
1553
break ;
1543
1554
default :
1544
1555
return ERROR_CALL_NOT_IMPLEMENTED ;
0 commit comments