Enable on-demand rotation.
[nssm.git] / io.cpp
diff --git a/io.cpp b/io.cpp
index 2602dc2..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,7 +284,7 @@ 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
@@ -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