--- config.c +++ config.c @@ -301,6 +301,7 @@ /* first, last */ NULL, NULL, /* logAddress */ NULL, /* extension */ NULL, + /* addextension */ NULL, /* compress_prog */ NULL, /* uncompress_prog */ NULL, /* compress_ext */ NULL, @@ -876,6 +877,22 @@ message(MESS_DEBUG, "extension is now %s\n", newlog->extension); + } else if (!strcmp(start, "addextension")) { + *endtag = oldchar, start = endtag; + + if (!isolateValue + (configFile, lineNum, "addextension name", &start, + &endtag)) { + oldchar = *endtag, *endtag = '\0'; + + newlog->addextension = strdup(start); + + *endtag = oldchar, start = endtag; + } + + message(MESS_DEBUG, "addextension is now %s\n", + newlog->addextension); + } else if (!strcmp(start, "compresscmd")) { *endtag = oldchar, start = endtag; if (! --- logrotate.8 +++ logrotate.8 @@ -142,6 +142,15 @@ a \fBlogrotate\fR configuration file: .TP +\fBaddextension \fIext\fR +Log files are given the final extension \fIext\fR after rotation. If +the original file already ends with \fIext\fR, the extension is not +duplicated, but merely moved to the end, i.e. both \fBfilename\fR and +\fBfilename\fIext\fR would get rotated to filename.1\fIext\fR. If +compression is used, the compression extension (normally \fB.gz\fR) +appears after \fIext\fR. + +.TP \fBcompress\fR Old versions of log files are compressed with \fBgzip\fR by default. See also \fBnocompress\fR. --- logrotate.c +++ logrotate.c @@ -99,6 +99,7 @@ freeLogItem(last); freeLogItem(logAddress); freeLogItem(extension); + freeLogItem(addextension); freeLogItem(compress_prog); freeLogItem(uncompress_prog); freeLogItem(compress_ext); @@ -591,6 +592,25 @@ rotNames->baseName = strdup(ourBaseName(log->files[logNum])); + if (log->addextension) { + size_t baseLen = strlen(rotNames->baseName); + size_t extLen = strlen(log->addextension); + if (baseLen >= extLen && + strncmp(&(rotNames->baseName[baseLen - extLen]), + log->addextension, extLen) == 0) { + char *tempstr; + + fileext = log->addextension; + tempstr = calloc(baseLen - extLen + 1, sizeof(char)); + strncat(tempstr, rotNames->baseName, baseLen - extLen); + free(rotNames->baseName); + rotNames->baseName = tempstr; + } else { + fileext = log->addextension; + } + } + + alloc_size = strlen(rotNames->dirName) + strlen(rotNames->baseName) + strlen(log->files[logNum]) + strlen(fileext) + strlen(compext) + 18; --- logrotate.h +++ logrotate.h @@ -40,6 +40,7 @@ char *pre, *post, *first, *last; char *logAddress; char *extension; + char *addextension; char *compress_prog; char *uncompress_prog; char *compress_ext; --- test/test +++ test/test @@ -354,4 +354,26 @@ rm -rf testdir +# check rotation with extension appended to the filename +cleanup 14 + +preptest test.log 14 1 0 +$RLR test-config.14 --force + +checkoutput <