mirror of https://github.com/oxen-io/lokinet
Improve windows running-as-a-service detection works
Get rid of the --win32-daemon hack (which was removed from the service itself earlier in this PR, by mistake) and replace it with detection of the error code for "not running as a service" that windows gives us back if we try to set up service controller dispatching but aren't a service.
This commit is contained in:
parent
4ad66ac2a5
commit
95c0c8a707
|
@ -344,15 +344,26 @@ main(int argc, char* argv[])
|
||||||
#else
|
#else
|
||||||
SERVICE_TABLE_ENTRY DispatchTable[] = {
|
SERVICE_TABLE_ENTRY DispatchTable[] = {
|
||||||
{strdup("lokinet"), (LPSERVICE_MAIN_FUNCTION)win32_daemon_entry}, {NULL, NULL}};
|
{strdup("lokinet"), (LPSERVICE_MAIN_FUNCTION)win32_daemon_entry}, {NULL, NULL}};
|
||||||
if (std::string{argv[1]} == "--win32-daemon")
|
|
||||||
{
|
// Try first to run as a service; if this works it fires off to win32_daemon_entry and doesn't
|
||||||
return StartServiceCtrlDispatcher(DispatchTable);
|
// return until the service enters STOPPED state.
|
||||||
}
|
if (StartServiceCtrlDispatcher(DispatchTable))
|
||||||
else
|
return 0;
|
||||||
|
|
||||||
|
auto error = GetLastError();
|
||||||
|
|
||||||
|
// We'll get this error if not invoked as a service, which is fine: we can just run directly
|
||||||
|
if (error == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
|
||||||
{
|
{
|
||||||
llarp::sys::service_manager->disable();
|
llarp::sys::service_manager->disable();
|
||||||
return lokinet_main(argc, argv);
|
return lokinet_main(argc, argv);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
llarp::log::critical(
|
||||||
|
logcat, "Error launching service: {}", std::system_category().message(error));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -605,9 +616,8 @@ SvcCtrlHandler(DWORD dwCtrl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The win32 daemon entry point is just a trampoline that returns control
|
// The win32 daemon entry point is where we go when invoked as a windows service; we do the required
|
||||||
// to the original lokinet entry
|
// service dance and then pretend we were invoked via main().
|
||||||
// and only gets called if we get --win32-daemon in the command line
|
|
||||||
VOID FAR PASCAL
|
VOID FAR PASCAL
|
||||||
win32_daemon_entry(DWORD, LPTSTR* argv)
|
win32_daemon_entry(DWORD, LPTSTR* argv)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue