Set service details in the GUI.
[nssm.git] / service.cpp
index 94cca76..5b75a41 100644 (file)
@@ -145,14 +145,48 @@ int install_service(nssm_service_t *service) {
   TCHAR command[MAX_PATH];\r
   GetModuleFileName(0, command, _countof(command));\r
 \r
+  /* Startup type. */\r
+  unsigned long startup;\r
+  switch (service->startup) {\r
+    case NSSM_STARTUP_MANUAL: startup = SERVICE_DEMAND_START; break;\r
+    case NSSM_STARTUP_DISABLED: startup = SERVICE_DISABLED; break;\r
+    default: startup = SERVICE_AUTO_START;\r
+  }\r
+\r
+  /* Display name. */\r
+  if (! service->displayname[0]) _sntprintf_s(service->displayname, _countof(service->displayname), _TRUNCATE, _T("%s"), service->name);\r
+\r
   /* Create the service */\r
-  service->handle = CreateService(services, service->name, service->name, SC_MANAGER_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, command, 0, 0, 0, 0, 0);\r
+  service->handle = CreateService(services, service->name, service->displayname, SC_MANAGER_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, startup, SERVICE_ERROR_NORMAL, command, 0, 0, 0, 0, 0);\r
   if (! service->handle) {\r
     print_message(stderr, NSSM_MESSAGE_CREATESERVICE_FAILED);\r
     CloseServiceHandle(services);\r
     return 5;\r
   }\r
 \r
+  if (service->description[0]) {\r
+    SERVICE_DESCRIPTION description;\r
+    ZeroMemory(&description, sizeof(description));\r
+    description.lpDescription = service->description;\r
+    if (! ChangeServiceConfig2(service->handle, SERVICE_CONFIG_DESCRIPTION, &description)) {\r
+      log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_SERVICE_CONFIG_DESCRIPTION_FAILED, service->name, error_string(GetLastError()), 0);\r
+    }\r
+  }\r
+\r
+  if (service->startup == NSSM_STARTUP_DELAYED) {\r
+    SERVICE_DELAYED_AUTO_START_INFO delayed;\r
+    ZeroMemory(&delayed, sizeof(delayed));\r
+    delayed.fDelayedAutostart = 1;\r
+    /* Delayed startup isn't supported until Vista. */\r
+    if (! ChangeServiceConfig2(service->handle, SERVICE_CONFIG_DELAYED_AUTO_START_INFO, &delayed)) {\r
+      unsigned long error = GetLastError();\r
+      /* Pre-Vista we expect to fail with ERROR_INVALID_LEVEL */\r
+      if (error != ERROR_INVALID_LEVEL) {\r
+        log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_SERVICE_CONFIG_DELAYED_AUTO_START_INFO_FAILED, service->name, error_string(error), 0);\r
+      }\r
+    }\r
+  }\r
+\r
   /* Now we need to put the parameters into the registry */\r
   if (create_parameters(service)) {\r
     print_message(stderr, NSSM_MESSAGE_CREATE_PARAMETERS_FAILED);\r
@@ -282,7 +316,7 @@ void set_service_recovery(nssm_service_t *service) {
     unsigned long error = GetLastError();\r
     /* Pre-Vista we expect to fail with ERROR_INVALID_LEVEL */\r
     if (error != ERROR_INVALID_LEVEL) {\r
-      log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_CHANGESERVICECONFIG2_FAILED, service->name, error_string(error), 0);\r
+      log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_SERVICE_CONFIG_FAILURE_ACTIONS_FAILED, service->name, error_string(error), 0);\r
     }\r
   }\r
 }\r