Enable on-demand rotation.
[nssm.git] / io.cpp
diff --git a/io.cpp b/io.cpp
index 0fbc4e4..79848e9 100644 (file)
--- a/io.cpp
+++ b/io.cpp
@@ -242,7 +242,7 @@ int get_output_handles(nssm_service_t *service, HKEY key, STARTUPINFO *si) {
 \r
     /* Try online rotation only if a size threshold is set. */\r
     logger_t *stdout_logger = 0;\r
-    if (service->rotate_files && service->rotate_stdout_online && size.QuadPart) {\r
+    if (service->rotate_files && service->rotate_stdout_online) {\r
       stdout_logger = (logger_t *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(logger_t));\r
       if (stdout_logger) {\r
         /* Pipe between application's stdout and our logging handle. */\r
@@ -256,6 +256,7 @@ int get_output_handles(nssm_service_t *service, HKEY key, STARTUPINFO *si) {
           stdout_logger->write_handle = stdout_handle;\r
           stdout_logger->size = (__int64) size.QuadPart;\r
           stdout_logger->tid_ptr = &service->stdout_tid;\r
+          stdout_logger->rotate_online = &service->rotate_stdout_online;\r
 \r
           /* Logging thread. */\r
           service->stdout_thread = create_logging_thread(stdout_logger);\r
@@ -283,14 +284,14 @@ int get_output_handles(nssm_service_t *service, HKEY key, STARTUPINFO *si) {
         log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_DUPLICATEHANDLE_FAILED, NSSM_REG_STDOUT, error_string(GetLastError()), 0);\r
         return 4;\r
       }\r
-      service->rotate_stdout_online = false;\r
+      service->rotate_stdout_online = NSSM_ROTATE_OFFLINE;\r
     }\r
 \r
     set_flags = true;\r
   }\r
 \r
   /* stderr */\r
-  if (get_createfile_parameters(key, NSSM_REG_STDERR, service->stderr_path, &service->stdout_sharing, NSSM_STDERR_SHARING, &service->stdout_disposition, NSSM_STDERR_DISPOSITION, &service->stdout_flags, NSSM_STDERR_FLAGS)) {\r
+  if (get_createfile_parameters(key, NSSM_REG_STDERR, service->stderr_path, &service->stderr_sharing, NSSM_STDERR_SHARING, &service->stderr_disposition, NSSM_STDERR_DISPOSITION, &service->stderr_flags, NSSM_STDERR_FLAGS)) {\r
     service->stderr_sharing = service->stderr_disposition = service->stderr_flags = 0;\r
     ZeroMemory(service->stderr_path, _countof(service->stderr_path) * sizeof(TCHAR));\r
     return 5;\r
@@ -313,7 +314,7 @@ int get_output_handles(nssm_service_t *service, HKEY key, STARTUPINFO *si) {
     }\r
     else if (si) {\r
       if (service->rotate_files) rotate_file(service->name, service->stderr_path, service->rotate_seconds, service->rotate_bytes_low, service->rotate_bytes_high);\r
-      HANDLE stderr_handle = append_to_file(service->stderr_path, service->stdout_sharing, 0, service->stdout_disposition, service->stdout_flags);\r
+      HANDLE stderr_handle = append_to_file(service->stderr_path, service->stderr_sharing, 0, service->stderr_disposition, service->stderr_flags);\r
       if (! stderr_handle) {\r
         log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_CREATEFILE_FAILED, service->stderr_path, error_string(GetLastError()), 0);\r
         return 7;\r
@@ -321,7 +322,7 @@ int get_output_handles(nssm_service_t *service, HKEY key, STARTUPINFO *si) {
 \r
       /* Try online rotation only if a size threshold is set. */\r
       logger_t *stderr_logger = 0;\r
-      if (service->rotate_files && service->rotate_stderr_online && size.QuadPart) {\r
+      if (service->rotate_files && service->rotate_stderr_online) {\r
         stderr_logger = (logger_t *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(logger_t));\r
         if (stderr_logger) {\r
           /* Pipe between application's stderr and our logging handle. */\r
@@ -335,6 +336,7 @@ int get_output_handles(nssm_service_t *service, HKEY key, STARTUPINFO *si) {
             stderr_logger->write_handle = stderr_handle;\r
             stderr_logger->size = (__int64) size.QuadPart;\r
             stderr_logger->tid_ptr = &service->stderr_tid;\r
+            stderr_logger->rotate_online = &service->rotate_stderr_online;\r
 \r
             /* Logging thread. */\r
             service->stderr_thread = create_logging_thread(stderr_logger);\r
@@ -362,7 +364,7 @@ int get_output_handles(nssm_service_t *service, HKEY key, STARTUPINFO *si) {
           log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_DUPLICATEHANDLE_FAILED, NSSM_REG_STDERR, error_string(GetLastError()), 0);\r
           return 7;\r
         }\r
-        service->rotate_stderr_online = false;\r
+        service->rotate_stderr_online = NSSM_ROTATE_OFFLINE;\r
       }\r
     }\r
 \r
@@ -510,7 +512,7 @@ unsigned long WINAPI log_and_rotate(void *arg) {
     }\r
     else if (ret) continue;\r
 \r
-    if (size + (__int64) in >= logger->size) {\r
+    if (*logger->rotate_online == NSSM_ROTATE_ONLINE_ASAP || (logger->size && size + (__int64) in >= logger->size)) {\r
       /* Look for newline. */\r
       unsigned long i;\r
       for (i = 0; i < in; i++) {\r
@@ -527,6 +529,7 @@ unsigned long WINAPI log_and_rotate(void *arg) {
           size += (__int64) out;\r
 \r
           /* Rotate. */\r
+          *logger->rotate_online = NSSM_ROTATE_ONLINE;\r
           TCHAR rotated[MAX_PATH];\r
           rotated_filename(logger->path, rotated, _countof(rotated), 0);\r
 \r