Set log on details in the GUI.
[nssm.git] / service.cpp
index 5b75a41..57dc7a2 100644 (file)
@@ -36,6 +36,7 @@ SC_HANDLE open_service_manager() {
 void set_nssm_service_defaults(nssm_service_t *service) {\r
   if (! service) return;\r
 \r
+  service->type = SERVICE_WIN32_OWN_PROCESS;\r
   service->stdin_sharing = NSSM_STDIN_SHARING;\r
   service->stdin_disposition = NSSM_STDIN_DISPOSITION;\r
   service->stdin_flags = NSSM_STDIN_FLAGS;\r
@@ -62,6 +63,11 @@ nssm_service_t *alloc_nssm_service() {
 /* Free memory for a service. */\r
 void cleanup_nssm_service(nssm_service_t *service) {\r
   if (! service) return;\r
+  if (service->username) HeapFree(GetProcessHeap(), 0, service->username);\r
+  if (service->password) {\r
+    SecureZeroMemory(service->password, service->passwordlen);\r
+    HeapFree(GetProcessHeap(), 0, service->password);\r
+  }\r
   if (service->env) HeapFree(GetProcessHeap(), 0, service->env);\r
   if (service->env_extra) HeapFree(GetProcessHeap(), 0, service->env_extra);\r
   if (service->handle) CloseServiceHandle(service->handle);\r
@@ -145,6 +151,13 @@ int install_service(nssm_service_t *service) {
   TCHAR command[MAX_PATH];\r
   GetModuleFileName(0, command, _countof(command));\r
 \r
+  /*\r
+    The only two valid flags for service type are SERVICE_WIN32_OWN_PROCESS\r
+    and SERVICE_INTERACTIVE_PROCESS.\r
+  */\r
+  service->type &= SERVICE_INTERACTIVE_PROCESS;\r
+  service->type |= SERVICE_WIN32_OWN_PROCESS;\r
+\r
   /* Startup type. */\r
   unsigned long startup;\r
   switch (service->startup) {\r
@@ -157,7 +170,7 @@ int install_service(nssm_service_t *service) {
   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->displayname, SC_MANAGER_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, startup, SERVICE_ERROR_NORMAL, command, 0, 0, 0, 0, 0);\r
+  service->handle = CreateService(services, service->name, service->displayname, SC_MANAGER_ALL_ACCESS, service->type, startup, SERVICE_ERROR_NORMAL, command, 0, 0, 0, service->username, service->password);\r
   if (! service->handle) {\r
     print_message(stderr, NSSM_MESSAGE_CREATESERVICE_FAILED);\r
     CloseServiceHandle(services);\r