Signed-off-by: Danomi Manchego <[email protected]>
---
 sysklogd/Config.src |    7 +++++++
 sysklogd/syslogd.c  |   23 ++++++++++++++++++++++-
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/sysklogd/Config.src b/sysklogd/Config.src
index b7a494e..5ca86f4 100644
--- a/sysklogd/Config.src
+++ b/sysklogd/Config.src
@@ -30,6 +30,13 @@ config FEATURE_ROTATE_LOGFILE
          This enables syslogd to rotate the message files
          on his own. No need to use an external rotatescript.
 
+config FEATURE_GZIP_ROTATED_LOGFILE
+       bool "Gzip rotated message files"
+       default n
+       depends on GZIP && SYSLOGD
+       help
+         Compress rotated message files using gzip.
+
 config FEATURE_REMOTE_LOG
        bool "Remote Log support"
        default y
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index fc380d9..f2a06fc 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -580,11 +580,30 @@ static void log_locally(time_t now, char *msg, logFile_t 
*log_file)
 #if ENABLE_FEATURE_ROTATE_LOGFILE
        if (G.logFileSize && log_file->isRegular && log_file->size > 
G.logFileSize) {
                if (G.logFileRotate) { /* always 0..99 */
-                       int i = strlen(log_file->path) + 3 + 1;
+                       int i = strlen(log_file->path) + 3 + 3 + 1;
                        char oldFile[i];
                        char newFile[i];
                        i = G.logFileRotate - 1;
                        /* rename: f.8 -> f.9; f.7 -> f.8; ... */
+#if ENABLE_FEATURE_GZIP_ROTATED_LOGFILE
+                       // gzip if gzip enabled, create patch.
+                       while (1) {
+                               sprintf(newFile, "%s.%d.gz", log_file->path, i);
+                               if (i == 0) break;
+                               sprintf(oldFile, "%s.%d.gz", log_file->path, 
--i);
+                               /* ignore errors - file might be missing */
+                               rename(oldFile, newFile);
+                       }
+                       /* newFile == "f.0" now */
+                       sprintf(newFile, "%s.0", log_file->path);
+                       rename(log_file->path, newFile);
+                       char *argv[3] = {
+                               "gzip",
+                       };
+                       argv[1] = newFile;
+                       argv[2] = NULL;
+                       spawn_and_wait(argv);
+#else
                        while (1) {
                                sprintf(newFile, "%s.%d", log_file->path, i);
                                if (i == 0) break;
@@ -602,6 +621,8 @@ static void log_locally(time_t now, char *msg, logFile_t 
*log_file)
                         * Ensure old file is gone:
                         */
                        unlink(log_file->path);
+#endif
+
 #ifdef SYSLOGD_WRLOCK
                        fl.l_type = F_UNLCK;
                        fcntl(log_file->fd, F_SETLKW, &fl);
-- 
1.7.9.5

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to