mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
launchctl: major refactoring
This commit is contained in:
parent
da85f2aa08
commit
13f2517a31
@ -19,9 +19,11 @@
|
|||||||
|
|
||||||
#define PROGNAME "launchctl"
|
#define PROGNAME "launchctl"
|
||||||
|
|
||||||
|
#define info(format, ...) osprintf(GetStdHandle(STD_OUTPUT_HANDLE), format, __VA_ARGS__)
|
||||||
|
#define warn(format, ...) osprintf(GetStdHandle(STD_ERROR_HANDLE), format, __VA_ARGS__)
|
||||||
#define fatal(ExitCode, format, ...) (warn(format, __VA_ARGS__), ExitProcess(ExitCode))
|
#define fatal(ExitCode, format, ...) (warn(format, __VA_ARGS__), ExitProcess(ExitCode))
|
||||||
|
|
||||||
static void vwarn(const char *format, va_list ap)
|
static void vosprintf(HANDLE h, const char *format, va_list ap)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
/* wvsprintf is only safe with a 1024 byte buffer */
|
/* wvsprintf is only safe with a 1024 byte buffer */
|
||||||
@ -34,16 +36,15 @@ static void vwarn(const char *format, va_list ap)
|
|||||||
len = lstrlenA(buf);
|
len = lstrlenA(buf);
|
||||||
buf[len++] = '\n';
|
buf[len++] = '\n';
|
||||||
|
|
||||||
WriteFile(GetStdHandle(STD_ERROR_HANDLE),
|
WriteFile(h, buf, (DWORD)len, &BytesTransferred, 0);
|
||||||
buf, (DWORD)len, &BytesTransferred, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void warn(const char *format, ...)
|
static void osprintf(HANDLE h, const char *format, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
vwarn(format, ap);
|
vosprintf(h, format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,39 +61,49 @@ static void usage(void)
|
|||||||
PROGNAME);
|
PROGNAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void report(PWSTR PipeBuf, ULONG PipeBufSize)
|
static int callpipe_and_report(PWSTR PipeBuf, ULONG SendSize, ULONG RecvSize)
|
||||||
{
|
{
|
||||||
if (0 == PipeBufSize)
|
DWORD LastError, BytesTransferred;
|
||||||
warn("KO received empty buffer from launcher");
|
|
||||||
|
LastError = CallNamedPipeW(L"" PIPE_NAME, PipeBuf, SendSize, PipeBuf, RecvSize,
|
||||||
|
&BytesTransferred, NMPWAIT_USE_DEFAULT_WAIT) ? 0 : GetLastError();
|
||||||
|
|
||||||
|
if (0 != LastError)
|
||||||
|
warn("KO CallNamedPipeW = %ld", LastError);
|
||||||
|
else if (0 == BytesTransferred)
|
||||||
|
warn("KO launcher: empty buffer");
|
||||||
else if (L'$' == PipeBuf[0])
|
else if (L'$' == PipeBuf[0])
|
||||||
{
|
{
|
||||||
if (1 == PipeBufSize)
|
if (1 == BytesTransferred)
|
||||||
warn("OK");
|
info("OK");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (PWSTR P = PipeBuf, PipeBufEnd = P + PipeBufSize / sizeof(WCHAR); PipeBufEnd > P; P++)
|
for (PWSTR P = PipeBuf, PipeBufEnd = P + BytesTransferred / sizeof(WCHAR);
|
||||||
|
PipeBufEnd > P; P++)
|
||||||
if (L'\0' == *P)
|
if (L'\0' == *P)
|
||||||
*P = L'\n';
|
*P = L'\n';
|
||||||
|
|
||||||
if (PipeBufSize < PIPE_BUFFER_SIZE)
|
if (BytesTransferred < RecvSize)
|
||||||
PipeBuf[PipeBufSize / sizeof(WCHAR)] = L'\0';
|
PipeBuf[BytesTransferred / sizeof(WCHAR)] = L'\0';
|
||||||
else
|
else
|
||||||
PipeBuf[PIPE_BUFFER_SIZE / sizeof(WCHAR) - 1] = L'\0';
|
PipeBuf[RecvSize / sizeof(WCHAR) - 1] = L'\0';
|
||||||
|
|
||||||
warn("OK\n%S", PipeBuf + 1);
|
info("OK\n%S", PipeBuf + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (L'!' == PipeBuf[0])
|
else if (L'!' == PipeBuf[0])
|
||||||
{
|
{
|
||||||
if (PipeBufSize < PIPE_BUFFER_SIZE)
|
if (BytesTransferred < RecvSize)
|
||||||
PipeBuf[PipeBufSize / sizeof(WCHAR)] = L'\0';
|
PipeBuf[BytesTransferred / sizeof(WCHAR)] = L'\0';
|
||||||
else
|
else
|
||||||
PipeBuf[PIPE_BUFFER_SIZE / sizeof(WCHAR) - 1] = L'\0';
|
PipeBuf[RecvSize / sizeof(WCHAR) - 1] = L'\0';
|
||||||
|
|
||||||
warn("KO %S", PipeBuf + 1);
|
info("KO launcher: error %S", PipeBuf + 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
warn("KO received corrupted buffer from launcher", 0);
|
warn("KO launcher: corrupted buffer", 0);
|
||||||
|
|
||||||
|
return LastError;
|
||||||
}
|
}
|
||||||
|
|
||||||
int start(PWSTR PipeBuf, ULONG PipeBufSize,
|
int start(PWSTR PipeBuf, ULONG PipeBufSize,
|
||||||
@ -100,7 +111,6 @@ int start(PWSTR PipeBuf, ULONG PipeBufSize,
|
|||||||
{
|
{
|
||||||
PWSTR P;
|
PWSTR P;
|
||||||
DWORD ClassNameSize, InstanceNameSize, ArgvSize;
|
DWORD ClassNameSize, InstanceNameSize, ArgvSize;
|
||||||
DWORD LastError, BytesTransferred;
|
|
||||||
|
|
||||||
ClassNameSize = lstrlenW(ClassName) + 1;
|
ClassNameSize = lstrlenW(ClassName) + 1;
|
||||||
InstanceNameSize = lstrlenW(InstanceName) + 1;
|
InstanceNameSize = lstrlenW(InstanceName) + 1;
|
||||||
@ -121,17 +131,7 @@ int start(PWSTR PipeBuf, ULONG PipeBufSize,
|
|||||||
memcpy(P, Argv[Argi], ArgvSize * sizeof(WCHAR)); P += ArgvSize;
|
memcpy(P, Argv[Argi], ArgvSize * sizeof(WCHAR)); P += ArgvSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CallNamedPipeW(L"" PIPE_NAME,
|
return callpipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize);
|
||||||
PipeBuf, (DWORD)((P - PipeBuf) * sizeof(WCHAR)), PipeBuf, PipeBufSize,
|
|
||||||
&BytesTransferred, NMPWAIT_USE_DEFAULT_WAIT))
|
|
||||||
{
|
|
||||||
LastError = 0;
|
|
||||||
report(PipeBuf, BytesTransferred);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LastError = GetLastError();
|
|
||||||
|
|
||||||
return LastError;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int stop(PWSTR PipeBuf, ULONG PipeBufSize,
|
int stop(PWSTR PipeBuf, ULONG PipeBufSize,
|
||||||
@ -139,7 +139,6 @@ int stop(PWSTR PipeBuf, ULONG PipeBufSize,
|
|||||||
{
|
{
|
||||||
PWSTR P;
|
PWSTR P;
|
||||||
DWORD ClassNameSize, InstanceNameSize;
|
DWORD ClassNameSize, InstanceNameSize;
|
||||||
DWORD LastError, BytesTransferred;
|
|
||||||
|
|
||||||
ClassNameSize = lstrlenW(ClassName) + 1;
|
ClassNameSize = lstrlenW(ClassName) + 1;
|
||||||
InstanceNameSize = lstrlenW(InstanceName) + 1;
|
InstanceNameSize = lstrlenW(InstanceName) + 1;
|
||||||
@ -152,23 +151,12 @@ int stop(PWSTR PipeBuf, ULONG PipeBufSize,
|
|||||||
memcpy(P, ClassName, ClassNameSize * sizeof(WCHAR)); P += ClassNameSize;
|
memcpy(P, ClassName, ClassNameSize * sizeof(WCHAR)); P += ClassNameSize;
|
||||||
memcpy(P, InstanceName, InstanceNameSize * sizeof(WCHAR)); P += InstanceNameSize;
|
memcpy(P, InstanceName, InstanceNameSize * sizeof(WCHAR)); P += InstanceNameSize;
|
||||||
|
|
||||||
if (CallNamedPipeW(L"" PIPE_NAME,
|
return callpipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize);
|
||||||
PipeBuf, (DWORD)((P - PipeBuf) * sizeof(WCHAR)), PipeBuf, PipeBufSize,
|
|
||||||
&BytesTransferred, NMPWAIT_USE_DEFAULT_WAIT))
|
|
||||||
{
|
|
||||||
LastError = 0;
|
|
||||||
report(PipeBuf, BytesTransferred);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LastError = GetLastError();
|
|
||||||
|
|
||||||
return LastError;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int list(PWSTR PipeBuf, ULONG PipeBufSize)
|
int list(PWSTR PipeBuf, ULONG PipeBufSize)
|
||||||
{
|
{
|
||||||
PWSTR P;
|
PWSTR P;
|
||||||
DWORD LastError, BytesTransferred;
|
|
||||||
|
|
||||||
if (PipeBufSize < 1 * sizeof(WCHAR))
|
if (PipeBufSize < 1 * sizeof(WCHAR))
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
@ -176,25 +164,14 @@ int list(PWSTR PipeBuf, ULONG PipeBufSize)
|
|||||||
P = PipeBuf;
|
P = PipeBuf;
|
||||||
*P++ = LauncherSvcInstanceList;
|
*P++ = LauncherSvcInstanceList;
|
||||||
|
|
||||||
if (CallNamedPipeW(L"" PIPE_NAME,
|
return callpipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize);
|
||||||
PipeBuf, (DWORD)((P - PipeBuf) * sizeof(WCHAR)), PipeBuf, PipeBufSize,
|
|
||||||
&BytesTransferred, NMPWAIT_USE_DEFAULT_WAIT))
|
|
||||||
{
|
|
||||||
LastError = 0;
|
|
||||||
report(PipeBuf, BytesTransferred);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LastError = GetLastError();
|
|
||||||
|
|
||||||
return LastError;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int info(PWSTR PipeBuf, ULONG PipeBufSize,
|
int getinfo(PWSTR PipeBuf, ULONG PipeBufSize,
|
||||||
PWSTR ClassName, PWSTR InstanceName)
|
PWSTR ClassName, PWSTR InstanceName)
|
||||||
{
|
{
|
||||||
PWSTR P;
|
PWSTR P;
|
||||||
DWORD ClassNameSize, InstanceNameSize;
|
DWORD ClassNameSize, InstanceNameSize;
|
||||||
DWORD LastError, BytesTransferred;
|
|
||||||
|
|
||||||
ClassNameSize = lstrlenW(ClassName) + 1;
|
ClassNameSize = lstrlenW(ClassName) + 1;
|
||||||
InstanceNameSize = lstrlenW(InstanceName) + 1;
|
InstanceNameSize = lstrlenW(InstanceName) + 1;
|
||||||
@ -207,17 +184,7 @@ int info(PWSTR PipeBuf, ULONG PipeBufSize,
|
|||||||
memcpy(P, ClassName, ClassNameSize * sizeof(WCHAR)); P += ClassNameSize;
|
memcpy(P, ClassName, ClassNameSize * sizeof(WCHAR)); P += ClassNameSize;
|
||||||
memcpy(P, InstanceName, InstanceNameSize * sizeof(WCHAR)); P += InstanceNameSize;
|
memcpy(P, InstanceName, InstanceNameSize * sizeof(WCHAR)); P += InstanceNameSize;
|
||||||
|
|
||||||
if (CallNamedPipeW(L"" PIPE_NAME,
|
return callpipe_and_report(PipeBuf, (ULONG)((P - PipeBuf) * sizeof(WCHAR)), PipeBufSize);
|
||||||
PipeBuf, (DWORD)((P - PipeBuf) * sizeof(WCHAR)), PipeBuf, PipeBufSize,
|
|
||||||
&BytesTransferred, NMPWAIT_USE_DEFAULT_WAIT))
|
|
||||||
{
|
|
||||||
LastError = 0;
|
|
||||||
report(PipeBuf, BytesTransferred);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LastError = GetLastError();
|
|
||||||
|
|
||||||
return LastError;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int wmain(int argc, wchar_t **argv)
|
int wmain(int argc, wchar_t **argv)
|
||||||
@ -264,7 +231,7 @@ int wmain(int argc, wchar_t **argv)
|
|||||||
if (3 != argc)
|
if (3 != argc)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
return info(PipeBuf, PIPE_BUFFER_SIZE, argv[1], argv[2]);
|
return getinfo(PipeBuf, PIPE_BUFFER_SIZE, argv[1], argv[2]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
usage();
|
usage();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user