|
@@ -58,15 +58,28 @@ int main(int argc, char **argv) {
|
|
|
/* Register messages */
|
|
|
if (is_admin) create_messages();
|
|
|
|
|
|
- /* Start service magic */
|
|
|
- SERVICE_TABLE_ENTRY table[] = { { NSSM, service_main }, { 0, 0 } };
|
|
|
- if (! StartServiceCtrlDispatcher(table)) {
|
|
|
- unsigned long error = GetLastError();
|
|
|
- /* User probably ran nssm with no argument */
|
|
|
- if (error == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) exit(usage(1));
|
|
|
- log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_DISPATCHER_FAILED, error_string(error), 0);
|
|
|
- exit(100);
|
|
|
+ /*
|
|
|
+ Optimisation for Windows 2000:
|
|
|
+ When we're run from the command line the StartServiceCtrlDispatcher() call
|
|
|
+ will time out after a few seconds on Windows 2000. On newer versions the
|
|
|
+ call returns instantly. Check for stdin first and only try to call the
|
|
|
+ function if there's no input stream found. Although it's possible that
|
|
|
+ we're running with input redirected it's much more likely that we're
|
|
|
+ actually running as a service.
|
|
|
+ This will save time when running with no arguments from a command prompt.
|
|
|
+ */
|
|
|
+ if (_fileno(stdin) < 0) {
|
|
|
+ /* Start service magic */
|
|
|
+ SERVICE_TABLE_ENTRY table[] = { { NSSM, service_main }, { 0, 0 } };
|
|
|
+ if (! StartServiceCtrlDispatcher(table)) {
|
|
|
+ unsigned long error = GetLastError();
|
|
|
+ /* User probably ran nssm with no argument */
|
|
|
+ if (error == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) exit(usage(1));
|
|
|
+ log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_DISPATCHER_FAILED, error_string(error), 0);
|
|
|
+ exit(100);
|
|
|
+ }
|
|
|
}
|
|
|
+ else exit(usage(1));
|
|
|
|
|
|
/* And nothing more to do */
|
|
|
exit(0);
|