From 768a3933427edeb5f1e47841b5f98fbfbbbaac29 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sat, 14 May 2016 21:00:02 -0700 Subject: [PATCH] launcher, launchctl: add quit command on debug version of launcher --- src/launcher/launchctl.c | 24 ++++++++++++++++++++++++ src/launcher/launcher.c | 7 +++++++ src/launcher/launcher.h | 3 ++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/launcher/launchctl.c b/src/launcher/launchctl.c index 0dbe8eb6..3ca4b454 100644 --- a/src/launcher/launchctl.c +++ b/src/launcher/launchctl.c @@ -193,6 +193,21 @@ int list(PWSTR PipeBuf, ULONG PipeBufSize) return call_pipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize); } +int quit(PWSTR PipeBuf, ULONG PipeBufSize) +{ + /* works only against DEBUG version of launcher */ + + PWSTR P; + + if (PipeBufSize < 1 * sizeof(WCHAR)) + return ERROR_INVALID_PARAMETER; + + P = PipeBuf; + *P++ = LauncherQuit; + + return call_pipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize); +} + int wmain(int argc, wchar_t **argv) { PWSTR PipeBuf = 0; @@ -239,6 +254,15 @@ int wmain(int argc, wchar_t **argv) return list(PipeBuf, PIPE_BUFFER_SIZE); } + else + if (0 == lstrcmpW(L"quit", argv[0])) + { + if (1 != argc) + usage(); + + /* works only against DEBUG version of launcher */ + return quit(PipeBuf, PIPE_BUFFER_SIZE); + } else usage(); diff --git a/src/launcher/launcher.c b/src/launcher/launcher.c index ecb490c7..a238befd 100644 --- a/src/launcher/launcher.c +++ b/src/launcher/launcher.c @@ -951,6 +951,13 @@ static VOID SvcPipeTransact(HANDLE ClientToken, PWSTR PipeBuf, PULONG PSize) SvcPipeTransactResult(Result, PipeBuf, PSize); break; +#if !defined(NDEBUG) + case LauncherQuit: + SetEvent(SvcEvent); + + SvcPipeTransactResult(STATUS_SUCCESS, PipeBuf, PSize); + break; +#endif default: SvcPipeTransactResult(STATUS_INVALID_PARAMETER, PipeBuf, PSize); break; diff --git a/src/launcher/launcher.h b/src/launcher/launcher.h index 87f28360..42f24aa0 100644 --- a/src/launcher/launcher.h +++ b/src/launcher/launcher.h @@ -57,8 +57,9 @@ enum { LauncherSvcInstanceStart = 'S', /* requires: SERVICE_START */ LauncherSvcInstanceStop = 'T', /* requires: SERVICE_STOP */ - LauncherSvcInstanceList = 'L', /* requires: none*/ LauncherSvcInstanceInfo = 'I', /* requires: SERVICE_QUERY_STATUS */ + LauncherSvcInstanceList = 'L', /* requires: none*/ + LauncherQuit = 'Q', /* DEBUG version only */ }; #endif