---
 sysklogd/syslogd.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 2cbb22b6d..403b3971a 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -144,6 +144,7 @@
 //usage:       IF_FEATURE_ROTATE_LOGFILE(
 //usage:     "\n       -s SIZE         Max size (KB) before rotation (default 
200KB, 0=off)"
 //usage:     "\n       -b N            N rotated logs to keep (default 1, max 
99, 0=purge)"
+//usage:     "\n       -z              Gzip rotated files (default 0, 1=gzip)"
 //usage:       )
 //usage:     "\n       -l N            Log only messages more urgent than prio 
N (1-8)"
 //usage:     "\n       -S              Smaller output"
@@ -184,7 +185,6 @@
 #include <sys/shm.h>
 #endif
 
-
 #define DEBUG 0
 
 /* MARK code is not very useful, is bloat, and broken:
@@ -246,6 +246,8 @@ IF_FEATURE_ROTATE_LOGFILE( \
        unsigned logFileSize;                   \
        /* number of rotated message files */   \
        unsigned logFileRotate;                 \
+       /* the need to gzip rotated files */    \
+       unsigned logGzipRotated;                \
 ) \
 IF_FEATURE_IPC_SYSLOG( \
        int shmid; /* ipc shared memory id */   \
@@ -301,6 +303,7 @@ static const struct init_globals init_data = {
 #if ENABLE_FEATURE_ROTATE_LOGFILE
        .logFileSize = 200 * 1024,
        .logFileRotate = 1,
+       .logGzipRotated = 0,
 #endif
 #if ENABLE_FEATURE_IPC_SYSLOG
        .shmid = -1,
@@ -327,6 +330,7 @@ enum {
        OPTBIT_timestamp, // -t
        IF_FEATURE_ROTATE_LOGFILE(OPTBIT_filesize   ,)  // -s
        IF_FEATURE_ROTATE_LOGFILE(OPTBIT_rotatecnt  ,)  // -b
+       IF_FEATURE_ROTATE_LOGFILE(OPTBIT_gziprotated,)  // -z
        IF_FEATURE_REMOTE_LOG(    OPTBIT_remotelog  ,)  // -R
        IF_FEATURE_REMOTE_LOG(    OPTBIT_locallog   ,)  // -L
        IF_FEATURE_IPC_SYSLOG(    OPTBIT_circularlog,)  // -C
@@ -342,6 +346,7 @@ enum {
        OPT_timestamp   = 1 << OPTBIT_timestamp,
        OPT_filesize    = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_filesize   )) 
+ 0,
        OPT_rotatecnt   = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_rotatecnt  )) 
+ 0,
+       OPT_gziprotated = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_gziprotated)) 
+ 0,
        OPT_remotelog   = IF_FEATURE_REMOTE_LOG(    (1 << OPTBIT_remotelog  )) 
+ 0,
        OPT_locallog    = IF_FEATURE_REMOTE_LOG(    (1 << OPTBIT_locallog   )) 
+ 0,
        OPT_circularlog = IF_FEATURE_IPC_SYSLOG(    (1 << OPTBIT_circularlog)) 
+ 0,
@@ -352,6 +357,7 @@ enum {
 #define OPTION_STR "m:nO:l:St" \
        IF_FEATURE_ROTATE_LOGFILE("s:" ) \
        IF_FEATURE_ROTATE_LOGFILE("b:" ) \
+       IF_FEATURE_ROTATE_LOGFILE("z" ) \
        IF_FEATURE_REMOTE_LOG(    "R:*") \
        IF_FEATURE_REMOTE_LOG(    "L"  ) \
        IF_FEATURE_IPC_SYSLOG(    "C::") \
@@ -759,17 +765,21 @@ static void log_locally(time_t now, char *msg, logFile_t 
*log_file)
                        int i = strlen(log_file->path) + 3 + 1;
                        char oldFile[i];
                        char newFile[i];
+                       const char *filename_template = (option_mask32 & 
OPT_gziprotated) ? "%s.%d.gz" : "%s.%d";
                        i = G.logFileRotate - 1;
                        /* rename: f.8 -> f.9; f.7 -> f.8; ... */
                        while (1) {
-                               sprintf(newFile, "%s.%d", log_file->path, i);
+                               sprintf(newFile, filename_template, 
log_file->path, i);
                                if (i == 0) break;
-                               sprintf(oldFile, "%s.%d", log_file->path, --i);
+                               sprintf(oldFile, filename_template, 
log_file->path, --i);
                                /* ignore errors - file might be missing */
                                rename(oldFile, newFile);
                        }
                        /* newFile == "f.0" now */
-                       rename(log_file->path, newFile);
+                       if (option_mask32 & OPT_gziprotated) // -z
+                               system(xasprintf("gzip -c %s  > %s", 
log_file->path, newFile));
+                       else
+                               rename(log_file->path, newFile);
                }
 
                /* We may or may not have just renamed the file away;
-- 
2.49.0

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

Reply via email to