Added service_status_text().
[nssm.git] / service.cpp
index c3a5008..e952dbd 100644 (file)
@@ -701,14 +701,20 @@ int pre_edit_service(int argc, TCHAR **argv) {
       for (i = 0; settings[i].name; i++) _ftprintf(stderr, _T("%s\n"), settings[i].name);\r
       return 1;\r
     }\r
-    if (argc < mandatory) return usage(1);\r
 \r
     additional = 0;\r
     if (additional_mandatory) {\r
+      if (argc < mandatory) {\r
+        print_message(stderr, NSSM_MESSAGE_MISSING_SUBPARAMETER, parameter);\r
+        return 1;\r
+      }\r
       additional = argv[3];\r
       remainder = 4;\r
     }\r
-    else additional = argv[remainder];\r
+    else {\r
+      additional = argv[remainder];\r
+      if (argc < mandatory) return usage(1);\r
+    }\r
   }\r
 \r
   nssm_service_t *service = alloc_nssm_service();\r
@@ -1053,7 +1059,7 @@ int control_service(unsigned long control, int argc, TCHAR **argv) {
   int ret;\r
   unsigned long error;\r
   SERVICE_STATUS service_status;\r
-  if (control == 0) {\r
+  if (control == NSSM_SERVICE_CONTROL_START) {\r
     ret = StartService(service_handle, (unsigned long) argc, (const TCHAR **) argv);\r
     error = GetLastError();\r
     CloseHandle(service_handle);\r
@@ -1275,12 +1281,26 @@ int monitor_service(nssm_service_t *service) {
 TCHAR *service_control_text(unsigned long control) {\r
   switch (control) {\r
     /* HACK: there is no SERVICE_CONTROL_START constant */\r
-    case 0: return _T("START");\r
+    case NSSM_SERVICE_CONTROL_START: return _T("START");\r
     case SERVICE_CONTROL_STOP: return _T("STOP");\r
     case SERVICE_CONTROL_SHUTDOWN: return _T("SHUTDOWN");\r
     case SERVICE_CONTROL_PAUSE: return _T("PAUSE");\r
     case SERVICE_CONTROL_CONTINUE: return _T("CONTINUE");\r
     case SERVICE_CONTROL_INTERROGATE: return _T("INTERROGATE");\r
+    case NSSM_SERVICE_CONTROL_ROTATE: return _T("ROTATE");\r
+    default: return 0;\r
+  }\r
+}\r
+\r
+TCHAR *service_status_text(unsigned long status) {\r
+  switch (status) {\r
+    case SERVICE_STOPPED: return _T("SERVICE_STOPPED");\r
+    case SERVICE_START_PENDING: return _T("SERVICE_START_PENDING");\r
+    case SERVICE_STOP_PENDING: return _T("SERVICE_STOP_PENDING");\r
+    case SERVICE_RUNNING: return _T("SERVICE_RUNNING");\r
+    case SERVICE_CONTINUE_PENDING: return _T("SERVICE_CONTINUE_PENDING");\r
+    case SERVICE_PAUSE_PENDING: return _T("SERVICE_PAUSE_PENDING");\r
+    case SERVICE_PAUSED: return _T("SERVICE_PAUSED");\r
     default: return 0;\r
   }\r
 }\r
@@ -1368,6 +1388,12 @@ unsigned long WINAPI service_control_handler(unsigned long control, unsigned lon
       */\r
       log_service_control(service->name, control, false);\r
       return ERROR_CALL_NOT_IMPLEMENTED;\r
+\r
+    case NSSM_SERVICE_CONTROL_ROTATE:\r
+      log_service_control(service->name, control, true);\r
+      if (service->rotate_stdout_online) service->rotate_stdout_online = NSSM_ROTATE_ONLINE_ASAP;\r
+      if (service->rotate_stdout_online) service->rotate_stderr_online = NSSM_ROTATE_ONLINE_ASAP;\r
+      return NO_ERROR;\r
   }\r
 \r
   /* Unknown control */\r
@@ -1431,7 +1457,7 @@ int start_service(nssm_service_t *service) {
 \r
   if (get_process_creation_time(service->process_handle, &service->creation_time)) ZeroMemory(&service->creation_time, sizeof(service->creation_time));\r
 \r
-  close_output_handles(&si);\r
+  close_output_handles(&si, ! service->rotate_stdout_online, ! service->rotate_stderr_online);\r
 \r
   if (service->affinity) {\r
     /*\r