summaryrefslogtreecommitdiffstats
path: root/package/logrotate
diff options
context:
space:
mode:
authorflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2006-02-15 15:36:28 +0000
committerflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2006-02-15 15:36:28 +0000
commit1fa1dadaa96e11c23c30f0a5180cfbc360f055f7 (patch)
treefae5ed96187e8445584f02cd465490e6589e7673 /package/logrotate
parent32b8bfb796174e0b179f7ed5e175235a5876f8ef (diff)
Added logrotate, fixed CP call in httping, added bind splitting, thanks to Sébastien Bourgasser
git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@3243 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/logrotate')
-rw-r--r--package/logrotate/Config.in10
-rw-r--r--package/logrotate/Makefile38
-rw-r--r--package/logrotate/files/logrotate.conf30
-rw-r--r--package/logrotate/ipkg/logrotate.control6
-rw-r--r--package/logrotate/patches/logrotate-3.7.1-dateext-maxage.patch433
-rw-r--r--package/logrotate/patches/logrotate-3.7.1-datehack.patch12
-rw-r--r--package/logrotate/patches/logrotate-3.7.1-ignore-hidden.patch14
-rw-r--r--package/logrotate/patches/logrotate-3.7.1-no-tmpdir.patch54
-rw-r--r--package/logrotate/patches/logrotate-3.7.1-taboo-to-debug.patch12
-rw-r--r--package/logrotate/patches/logrotate-3.7.1-weekly.patch22
10 files changed, 631 insertions, 0 deletions
diff --git a/package/logrotate/Config.in b/package/logrotate/Config.in
new file mode 100644
index 000000000..7a210b726
--- /dev/null
+++ b/package/logrotate/Config.in
@@ -0,0 +1,10 @@
+config BR2_PACKAGE_LOGROTATE
+ prompt "logrotate......................... rotates, compresses, and mails system logs"
+ tristate
+ default m if CONFIG_DEVEL
+ select BR2_PACKAGE_LIBPOPT
+ help
+ logrotate is designed to ease administration of systems that generate
+ large numbers of log files. It allows auto-matic rotation, compression,
+ removal, and mailing of log files. Each log file may be handled
+ daily, weekly,monthly, or when it grows too large.
diff --git a/package/logrotate/Makefile b/package/logrotate/Makefile
new file mode 100644
index 000000000..e6ee9e98b
--- /dev/null
+++ b/package/logrotate/Makefile
@@ -0,0 +1,38 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=logrotate
+PKG_VERSION:=3.7.1
+PKG_RELEASE:=1
+PKG_MD5SUM:=552639142e163745f6bcd4f1f3816d8a
+
+PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/main/l/logrotate
+PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.gz
+PKG_CAT:=zcat
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
+
+include $(TOPDIR)/package/rules.mk
+
+$(eval $(call PKG_template,LOGROTATE,$(PKG_NAME),$(PKG_VERSION)-$(PKG_RELEASE),$(ARCH)))
+
+$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.prepared
+ touch $@
+
+$(PKG_BUILD_DIR)/.built:
+ make -C ${PKG_BUILD_DIR} \
+ CPPFLAGS="-I$(STAGING_DIR)/usr/include" \
+ LDFLAGS="-L$(STAGING_DIR)/usr/lib" \
+ CC=$(TARGET_CC) logrotate
+ touch $@
+
+$(IPKG_LOGROTATE):
+ mkdir -p $(IDIR_LOGROTATE)/usr/sbin
+ $(CP) ${PKG_BUILD_DIR}/logrotate $(IDIR_LOGROTATE)/usr/sbin
+ mkdir -p $(IDIR_LOGROTATE)/etc/logrotate.d
+ $(CP) ./files/logrotate.conf $(IDIR_LOGROTATE)/etc
+ $(RSTRIP) $(IDIR_LOGROTATE)
+ $(IPKG_BUILD) $(IDIR_LOGROTATE) $(PACKAGE_DIR)
+
+mostlyclean:
+ make -C $(PKG_BUILD_DIR) clean
+ rm $(PKG_BUILD_DIR)/.built
diff --git a/package/logrotate/files/logrotate.conf b/package/logrotate/files/logrotate.conf
new file mode 100644
index 000000000..9a91db94f
--- /dev/null
+++ b/package/logrotate/files/logrotate.conf
@@ -0,0 +1,30 @@
+# rotate log files weekly
+weekly
+#daily
+
+# keep 4 weeks worth of backlogs
+rotate 4
+
+# create new (empty) log files after rotating old ones
+create
+
+notifempty
+nomail
+#olddir /var/log/backup/
+missingok
+#dateext
+
+# uncomment this if you want your log files compressed
+#compress
+
+# packages can drop log rotation information into this directory
+include /etc/logrotate.d
+
+# no packages own lastlog or wtmp -- we'll rotate them here
+#/var/log/wtmp {
+# monthly
+# create 0664 root utmp
+# rotate 1
+#}
+
+# system-specific logs may be also be configured here.
diff --git a/package/logrotate/ipkg/logrotate.control b/package/logrotate/ipkg/logrotate.control
new file mode 100644
index 000000000..1c984e58f
--- /dev/null
+++ b/package/logrotate/ipkg/logrotate.control
@@ -0,0 +1,6 @@
+Package: logrotate
+Priority: optional
+Section: misc
+Depends: libpopt
+Source: http://ftp.debian.org/debian/pool/main/l/logrotate
+Description: logrotate is designed to ease administration of systems that generate large numbers of log files.
diff --git a/package/logrotate/patches/logrotate-3.7.1-dateext-maxage.patch b/package/logrotate/patches/logrotate-3.7.1-dateext-maxage.patch
new file mode 100644
index 000000000..1623b4bf1
--- /dev/null
+++ b/package/logrotate/patches/logrotate-3.7.1-dateext-maxage.patch
@@ -0,0 +1,433 @@
+diff -u -ruN logrotate-3.7.1.orig/config.c logrotate-3.7.1/config.c
+--- logrotate-3.7.1.orig/config.c 2003-08-07 07:13:14.000000000 -0400
++++ logrotate-3.7.1/config.c 2005-05-24 12:21:09.000000000 -0400
+@@ -511,6 +511,14 @@
+ newlog->flags &= ~LOG_FLAG_IFEMPTY;
+
+ *endtag = oldchar, start = endtag;
++ } else if (!strcmp(start, "dateext")) {
++ newlog->flags |= LOG_FLAG_DATEEXT;
++
++ *endtag = oldchar, start = endtag;
++ } else if (!strcmp(start, "nodateext")) {
++ newlog->flags &= ~LOG_FLAG_DATEEXT;
++
++ *endtag = oldchar, start = endtag;
+ } else if (!strcmp(start, "noolddir")) {
+ newlog->oldDir = NULL;
+
+@@ -670,6 +678,21 @@
+ }
+ *endtag = oldchar, start = endtag;
+ }
++ } else if (!strcmp(start, "maxage")) {
++ *endtag = oldchar, start = endtag;
++
++ if (!isolateValue(configFile, lineNum, "maxage count", &start,
++ &endtag)) {
++ oldchar = *endtag, *endtag = '\0';
++
++ newlog->rotateAge = strtoul(start, &chptr, 0);
++ if (*chptr || newlog->rotateAge < 0) {
++ message(MESS_ERROR, "%s:%d bad maximum age '%s'\n",
++ configFile, lineNum, start);
++ return 1;
++ }
++ *endtag = oldchar, start = endtag;
++ }
+ } else if (!strcmp(start, "errors")) {
+ message(MESS_DEBUG, "%s: %d: the errors directive is deprecated and no longer used.\n",
+ configFile, lineNum);
+diff -u -ruN logrotate-3.7.1.orig/logrotate.8 logrotate-3.7.1/logrotate.8
+--- logrotate-3.7.1.orig/logrotate.8 2003-08-07 07:13:14.000000000 -0400
++++ logrotate-3.7.1/logrotate.8 2005-05-24 12:21:09.000000000 -0400
+@@ -200,6 +200,11 @@
+ Log files are rotated every day.
+
+ .TP
++\fBdateext\fR
++Archive old versions of log files adding a daily extension like YYYYMMDD
++instead of simply adding a number.
++
++.TP
+ \fBdelaycompress\fR
+ Postpone compression of the previous log file to the next rotation cycle.
+ This has only effect when used in combination with \fBcompress\fR.
+@@ -246,6 +251,12 @@
+ instead of the just-rotated file (this is the default).
+
+ .TP
++\fBmaxage\fR \fIcount\fR
++Remove rotated logs older than <count> days. The age is only checked
++if the logfile is to be rotated. The files are mailed to the
++configured address if \fBmaillast\fR and \fBmail\fR are configured.
++
++.TP
+ \fBmissingok\fR
+ If the log file is missing, go on to the next one without issuing an error
+ message. See also \fBnomissingok\fR.
+diff -u -ruN logrotate-3.7.1.orig/logrotate.c logrotate-3.7.1/logrotate.c
+--- logrotate-3.7.1.orig/logrotate.c 2004-10-19 17:41:24.000000000 -0400
++++ logrotate-3.7.1/logrotate.c 2005-05-24 12:21:09.000000000 -0400
+@@ -11,6 +11,7 @@
+ #include <sys/wait.h>
+ #include <time.h>
+ #include <unistd.h>
++#include <glob.h>
+
+ #ifdef WITH_SELINUX
+ #include <selinux/selinux.h>
+@@ -22,6 +23,10 @@
+ #include "log.h"
+ #include "logrotate.h"
+
++#if !defined(GLOB_ABORTED) && defined(GLOB_ABEND)
++#define GLOB_ABORTED GLOB_ABEND
++#endif
++
+ typedef struct {
+ char * fn;
+ struct tm lastRotated; /* only tm.mon, tm_mday, tm_year are good! */
+@@ -42,6 +47,14 @@
+ char * mailCommand = DEFAULT_MAIL_COMMAND;
+ time_t nowSecs = 0;
+
++static int globerr(const char * pathname, int theerr) {
++ message(MESS_ERROR, "error accessing %s: %s\n", pathname,
++ strerror(theerr));
++
++ /* We want the glob operation to continue, so return 0 */
++ return 1;
++}
++
+ static logState * findState(const char * fn, struct stateSet * sip) {
+ int i;
+ logState * states = sip->states;
+@@ -49,9 +62,11 @@
+ struct tm now = *localtime(&nowSecs);
+ time_t lr_time;
+
++ /* find the filename fn in the statesPtr list */
+ for (i = 0; i < numStates; i++)
+ if (!strcmp(fn, states[i].fn)) break;
+
++ /* not in statesPtr list, so add new entry */
+ if (i == numStates) {
+ i = numStates++;
+ states = realloc(states, sizeof(*states) * numStates);
+@@ -121,6 +136,17 @@
+ return rc;
+ }
+
++static int removeLogFile(char * name) {
++ message(MESS_DEBUG, "removing old log %s\n", name);
++
++ if (!debug && unlink(name)) {
++ message(MESS_ERROR, "Failed to remove old log %s: %s\n",
++ name, strerror(errno));
++ return 1;
++ }
++ return 0;
++}
++
+ static int compressLogFile(char * name, logInfo * log, struct stat *sb) {
+ char * compressedName;
+ const char ** fullCommand;
+@@ -265,6 +291,25 @@
+ return rc;
+ }
+
++static int mailLogWrapper (char * mailFilename, char * mailCommand, int logNum, logInfo * log) {
++ /* if the log is compressed (and we're not mailing a
++ * file whose compression has been delayed), we need
++ * to uncompress it */
++ if ((log->flags & LOG_FLAG_COMPRESS) &&
++ !((log->flags & LOG_FLAG_DELAYCOMPRESS) &&
++ (log->flags & LOG_FLAG_MAILFIRST))) {
++ if (mailLog(mailFilename, mailCommand,
++ log->uncompress_prog, log->logAddress,
++ log->files[logNum]))
++ return 1;
++ } else {
++ if (mailLog(mailFilename, mailCommand, NULL,
++ log->logAddress, mailFilename))
++ return 1;
++ }
++ return 0;
++}
++
+ static int copyTruncate(char * currLog, char * saveLog, struct stat * sb, int flags) {
+ char buf[BUFSIZ];
+ int fdcurr = -1, fdsave = -1;
+@@ -479,6 +524,9 @@
+ char * baseName;
+ char * dirName;
+ char * firstRotated;
++ char * glob_pattern;
++ glob_t globResult;
++ int rc;
+ size_t alloc_size;
+ int rotateCount = log->rotateCount ? log->rotateCount : 1;
+ int logStart = (log->logStart == -1) ? 1 : log->logStart;
+@@ -509,7 +557,7 @@
+
+ alloc_size = strlen(dirName) + strlen(baseName) +
+ strlen(log->files[logNum]) + strlen(fileext) +
+- strlen(compext) + 10;
++ strlen(compext) + 18;
+
+ oldName = alloca(alloc_size);
+ newName = alloca(alloc_size);
+@@ -531,16 +579,116 @@
+ /* First compress the previous log when necessary */
+ if (log->flags & LOG_FLAG_COMPRESS &&
+ log->flags & LOG_FLAG_DELAYCOMPRESS) {
+- struct stat sbprev;
+-
+- sprintf(oldName, "%s/%s.%d%s", dirName, baseName, logStart, fileext);
+- if (stat(oldName, &sbprev)) {
+- message(MESS_DEBUG, "previous log %s does not exist\n",
+- oldName);
+- } else {
+- hasErrors = compressLogFile(oldName, log, &sbprev);
++ if (log->flags & LOG_FLAG_DATEEXT) {
++ /* glob for uncompressed files with our pattern */
++ glob_pattern = malloc(strlen(dirName) + strlen(baseName)
++ + strlen(fileext) + 44 );
++ sprintf(glob_pattern,
++ "%s/%s-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%s",
++ dirName, baseName, fileext);
++ rc = glob(glob_pattern, 0, globerr, &globResult);
++ if (!rc && globResult.gl_pathc > 0) {
++ for (i = 0; i < globResult.gl_pathc && !hasErrors; i++) {
++ struct stat sbprev;
++ sprintf(oldName,"%s",(globResult.gl_pathv)[i]);
++ if (stat(oldName, &sbprev)) {
++ message(MESS_DEBUG, "previous log %s does not exist\n", oldName);
++ } else {
++ hasErrors = compressLogFile(oldName, log, &sbprev);
++ }
++ }
++ } else {
++ message (MESS_DEBUG, "glob finding logs to compress failed\n");
++ /* fallback to old behaviour */
++ sprintf(oldName, "%s/%s.%d%s", dirName, baseName, logStart, fileext);
++ }
++ globfree(&globResult);
++ free(glob_pattern);
++ } else {
++ struct stat sbprev;
++
++ sprintf(oldName, "%s/%s.%d%s", dirName, baseName, logStart, fileext);
++ if (stat(oldName, &sbprev)) {
++ message(MESS_DEBUG, "previous log %s does not exist\n",
++ oldName);
++ } else {
++ hasErrors = compressLogFile(oldName, log, &sbprev);
++ }
+ }
+ }
++
++ firstRotated = alloca(strlen(dirName) + strlen(baseName) +
++ strlen(fileext) + strlen(compext) + 30);
++
++ if(log->flags & LOG_FLAG_DATEEXT) {
++ /* glob for compressed files with our pattern
++ * and compress ext */
++ glob_pattern = malloc(strlen(dirName)+strlen(baseName)
++ +strlen(fileext)+strlen(compext)+44);
++ sprintf(glob_pattern,
++ "%s/%s-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%s%s",
++ dirName, baseName, fileext, compext);
++ rc = glob(glob_pattern, 0, globerr, &globResult);
++ if (!rc) {
++ /* search for files to drop, if we find one remember it,
++ * if we find another one mail and remove the first and
++ * remember the second and so on */
++ struct stat fst_buf;
++ int mail_out = -1;
++ /* remove the first (n - rotateCount) matches
++ * no real rotation needed, since the files have
++ * the date in their name */
++ for (i = 0; i < globResult.gl_pathc; i++) {
++ if( !stat((globResult.gl_pathv)[i],&fst_buf) ) {
++ if ((i <= ((int)globResult.gl_pathc - rotateCount))
++ || ((log->rotateAge > 0)
++ && (((nowSecs - fst_buf.st_mtime)/60/60/24)
++ > log->rotateAge))) {
++ if ( mail_out != -1 ) {
++ if (!hasErrors && log->logAddress) {
++ char * mailFilename = (globResult.gl_pathv)[mail_out];
++ hasErrors = mailLogWrapper(mailFilename, mailCommand, logNum, log);
++ if (!hasErrors)
++ hasErrors = removeLogFile(mailFilename);
++ }
++ }
++ mail_out = i;
++ }
++ }
++ }
++ if ( mail_out != -1 ) {
++ /* oldName is oldest Backup found (for unlink later) */
++ sprintf(oldName, "%s", (globResult.gl_pathv)[mail_out]);
++ strcpy(disposeName, oldName);
++ } else
++ disposeName = NULL;
++ } else {
++ message (MESS_DEBUG, "glob finding old rotated logs failed\n");
++ disposeName = NULL;
++ }
++ /* firstRotated is most recently created/compressed rotated log */
++ sprintf(firstRotated, "%s/%s-%04d%02d%02d%s%s",
++ dirName, baseName, now.tm_year+1900,
++ now.tm_mon+1, now.tm_mday, fileext, compext);
++ globfree(&globResult);
++ free(glob_pattern);
++ } else {
++ if ( log->rotateAge ) {
++ struct stat fst_buf;
++ for (i=1; i <= rotateCount; i++) {
++ sprintf(oldName, "%s/%s.%d%s%s", dirName, baseName,
++ rotateCount + 1, fileext, compext);
++ if(!stat(oldName,&fst_buf)
++ && (((nowSecs - fst_buf.st_mtime)/60/60/24)
++ > log->rotateAge)) {
++ char * mailFilename = (globResult.gl_pathv)[i];
++ if (!hasErrors && log->logAddress)
++ hasErrors = mailLogWrapper(mailFilename, mailCommand, logNum, log);
++ if (!hasErrors)
++ hasErrors = removeLogFile(mailFilename);
++ }
++ }
++ }
+
+ sprintf(oldName, "%s/%s.%d%s%s", dirName, baseName,
+ logStart + rotateCount, fileext, compext);
+@@ -548,8 +696,6 @@
+
+ strcpy(disposeName, oldName);
+
+- firstRotated = alloca(strlen(dirName) + strlen(baseName) +
+- strlen(fileext) + strlen(compext) + 30);
+ sprintf(firstRotated, "%s/%s.%d%s%s", dirName, baseName,
+ logStart, fileext,
+ (log->flags & LOG_FLAG_DELAYCOMPRESS) ? "" : compext);
+@@ -600,12 +746,27 @@
+ }
+ }
+ }
+-
++ } /* !LOG_FLAG_DATEEXT */
++
+ finalName = oldName;
+-
+- /* note: the gzip extension is *not* used here! */
+- sprintf(finalName, "%s/%s.%d%s", dirName, baseName, logStart, fileext);
+-
++
++ if(log->flags & LOG_FLAG_DATEEXT) {
++ char * destFile = alloca(strlen(dirName) + strlen(baseName) +
++ strlen(fileext) + strlen(compext) + 30);
++ struct stat fst_buf;
++ sprintf(finalName, "%s/%s-%04d%02d%02d%s",
++ dirName, baseName, now.tm_year+1900,
++ now.tm_mon+1, now.tm_mday, fileext);
++ sprintf(destFile, "%s%s", finalName, compext);
++ if(!stat(destFile,&fst_buf)) {
++ message (MESS_DEBUG, "destination %s already exists, skipping rotation\n", firstRotated);
++ hasErrors = 1;
++ }
++ } else {
++ /* note: the gzip extension is *not* used here! */
++ sprintf(finalName, "%s/%s.%d%s", dirName, baseName, logStart, fileext);
++ }
++
+ /* if the last rotation doesn't exist, that's okay */
+ if (!debug && access(disposeName, F_OK)) {
+ message(MESS_DEBUG, "log %s doesn't exist -- won't try to "
+@@ -613,9 +774,6 @@
+ disposeName = NULL;
+ }
+
+- free(dirName);
+- free(baseName);
+-
+ if (!hasErrors) {
+ if (log->pre && !(log->flags & LOG_FLAG_SHAREDSCRIPTS)) {
+ message(MESS_DEBUG, "running prerotate script\n");
+@@ -722,33 +880,12 @@
+ else
+ mailFilename = disposeName;
+
+- if (mailFilename) {
+- /* if the log is compressed (and we're not mailing a
+- file whose compression has been delayed), we need
+- to uncompress it */
+- if ((log->flags & LOG_FLAG_COMPRESS) &&
+- !((log->flags & LOG_FLAG_DELAYCOMPRESS) &&
+- (log->flags & LOG_FLAG_MAILFIRST))) {
+- if (mailLog(mailFilename, mailCommand,
+- log->uncompress_prog, log->logAddress,
+- log->files[logNum]))
+- hasErrors = 1;
+- } else {
+- if (mailLog(mailFilename, mailCommand, NULL,
+- log->logAddress, mailFilename))
+- hasErrors = 1;
+- }
+- }
++ if (mailFilename)
++ hasErrors = mailLogWrapper(mailFilename, mailCommand, logNum, log);
+ }
+
+ if (!hasErrors && disposeName) {
+- message(MESS_DEBUG, "removing old log %s\n", disposeName);
+-
+- if (!debug && unlink(disposeName)) {
+- message(MESS_ERROR, "Failed to remove old log %s: %s\n",
+- disposeName, strerror(errno));
+- hasErrors = 1;
+- }
++ hasErrors = removeLogFile(disposeName);
+ }
+ }
+
+@@ -761,6 +898,8 @@
+ }
+ }
+ #endif
++ free(dirName);
++ free(baseName);
+ return hasErrors;
+ }
+
+@@ -1047,7 +1186,9 @@
+
+ int main(int argc, const char ** argv) {
+ logInfo defConfig = { NULL, NULL, 0, NULL, ROT_SIZE,
+- /* threshHold */ 1024 * 1024, 0,
++ /* threshHold */ 1024 * 1024,
++ /* rotateCount */ 0,
++ /* rotateAge */ 0,
+ /* log start */ -1,
+ /* pre, post */ NULL, NULL,
+ /* first, last */ NULL, NULL,
+diff -u -ruN logrotate-3.7.1.orig/logrotate.h logrotate-3.7.1/logrotate.h
+--- logrotate-3.7.1.orig/logrotate.h 2003-08-07 07:13:14.000000000 -0400
++++ logrotate-3.7.1/logrotate.h 2005-05-24 12:21:09.000000000 -0400
+@@ -15,6 +15,7 @@
+ #define LOG_FLAG_MAILFIRST (1 << 6)
+ #define LOG_FLAG_SHAREDSCRIPTS (1 << 7)
+ #define LOG_FLAG_COPY (1 << 8)
++#define LOG_FLAG_DATEEXT (1 << 9)
+
+ #define NO_FORCE_ROTATE 0
+ #define FORCE_ROTATE 1
+@@ -34,6 +35,7 @@
+ enum { ROT_DAYS, ROT_WEEKLY, ROT_MONTHLY, ROT_SIZE, ROT_FORCE } criterium;
+ unsigned int threshhold;
+ int rotateCount;
++ int rotateAge;
+ int logStart;
+ char * pre, * post, * first, * last;
+ char * logAddress;
diff --git a/package/logrotate/patches/logrotate-3.7.1-datehack.patch b/package/logrotate/patches/logrotate-3.7.1-datehack.patch
new file mode 100644
index 000000000..69121aafa
--- /dev/null
+++ b/package/logrotate/patches/logrotate-3.7.1-datehack.patch
@@ -0,0 +1,12 @@
+diff -u -ruN logrotate-3.7.1.orig/logrotate.c logrotate-3.7.1/logrotate.c
+--- logrotate-3.7.1.orig/logrotate.c 2004-10-19 17:41:24.000000000 -0400
++++ logrotate-3.7.1/logrotate.c 2005-05-24 12:12:26.000000000 -0400
+@@ -1002,7 +1002,7 @@
+ }
+
+ /* Hack to hide earlier bug */
+- if ((year != 1900) && (year < 1996 || year > 2100)) {
++ if ((year != 1900) && (year < 1970 || year > 2100)) {
+ message(MESS_ERROR, "bad year %d for file %s in state file %s\n",
+ year, argv[0], stateFilename);
+ fclose(f);
diff --git a/package/logrotate/patches/logrotate-3.7.1-ignore-hidden.patch b/package/logrotate/patches/logrotate-3.7.1-ignore-hidden.patch
new file mode 100644
index 000000000..390de7537
--- /dev/null
+++ b/package/logrotate/patches/logrotate-3.7.1-ignore-hidden.patch
@@ -0,0 +1,14 @@
+--- logrotate-3.7/config.c.orig 2005-04-26 22:57:53.000000000 -0400
++++ logrotate-3.7/config.c 2005-04-26 22:59:36.000000000 -0400
+@@ -142,6 +142,11 @@
+ (!fname[1] || (fname[1] == '.' && !fname[2])))
+ return 0;
+
++ /* Don't include 'hidden' files either; this breaks Gentoo
++ portage config file management http://bugs.gentoo.org/87683 */
++ if (fname[0] == '.')
++ return 0;
++
+ /* Check if fname is ending in a taboo-extension; if so, return
+ false */
+ for (i = 0; i < tabooCount; i++) {
diff --git a/package/logrotate/patches/logrotate-3.7.1-no-tmpdir.patch b/package/logrotate/patches/logrotate-3.7.1-no-tmpdir.patch
new file mode 100644
index 000000000..fb95f1ee3
--- /dev/null
+++ b/package/logrotate/patches/logrotate-3.7.1-no-tmpdir.patch
@@ -0,0 +1,54 @@
+diff -u -ruN logrotate-3.7.1-cur/logrotate.c logrotate-3.7.1/logrotate.c
+--- logrotate-3.7.1-cur/logrotate.c 2005-05-25 18:20:41.000000000 -0400
++++ logrotate-3.7.1/logrotate.c 2005-05-25 18:21:10.000000000 -0400
+@@ -90,10 +90,7 @@
+ }
+
+ static int runScript(char * logfn, char * script) {
+- int fd;
+- char *filespec;
+ int rc;
+- char buf[256];
+
+ if (debug) {
+ message(MESS_DEBUG, "running script with arg %s: \"%s\"\n",
+@@ -101,38 +98,12 @@
+ return 0;
+ }
+
+- filespec = buf;
+- snprintf(buf, sizeof(buf), "%s/logrotate.XXXXXX", getenv("TMPDIR") ?: "/tmp");
+- fd = -1;
+- if (!filespec || (fd = mkstemp(filespec)) < 0 || fchmod(fd, 0700)) {
+- message(MESS_DEBUG, "error creating %s: %s\n", filespec,
+- strerror(errno));
+- if (fd >= 0) {
+- close(fd);
+- unlink(filespec);
+- }
+- return -1;
+- }
+-
+- if (write(fd, "#!/bin/sh\n\n", 11) != 11 ||
+- write(fd, script, strlen(script)) != strlen(script)) {
+- message(MESS_DEBUG, "error writing %s\n", filespec);
+- close(fd);
+- unlink(filespec);
+- return -1;
+- }
+-
+- close(fd);
+-
+ if (!fork()) {
+- execlp(filespec, filespec, logfn, NULL);
++ execl("/bin/sh", "sh", "-c", script, NULL);
+ exit(1);
+ }
+
+ wait(&rc);
+-
+- unlink(filespec);
+-
+ return rc;
+ }
+
diff --git a/package/logrotate/patches/logrotate-3.7.1-taboo-to-debug.patch b/package/logrotate/patches/logrotate-3.7.1-taboo-to-debug.patch
new file mode 100644
index 000000000..2e07188f5
--- /dev/null
+++ b/package/logrotate/patches/logrotate-3.7.1-taboo-to-debug.patch
@@ -0,0 +1,12 @@
+diff -u -ruN logrotate-3.7.1.orig/config.c logrotate-3.7.1/config.c
+--- logrotate-3.7.1.orig/config.c 2003-08-07 07:13:14.000000000 -0400
++++ logrotate-3.7.1/config.c 2005-05-24 12:13:41.000000000 -0400
+@@ -147,7 +147,7 @@
+ for (i = 0; i < tabooCount; i++) {
+ if (!strcmp(fname + strlen(fname) - strlen(tabooExts[i]),
+ tabooExts[i])) {
+- message(MESS_ERROR, "Ignoring %s, because of %s "
++ message(MESS_DEBUG, "Ignoring %s, because of %s "
+ "ending\n", fname, tabooExts[i]);
+
+ return 0;
diff --git a/package/logrotate/patches/logrotate-3.7.1-weekly.patch b/package/logrotate/patches/logrotate-3.7.1-weekly.patch
new file mode 100644
index 000000000..8a371e8e0
--- /dev/null
+++ b/package/logrotate/patches/logrotate-3.7.1-weekly.patch
@@ -0,0 +1,22 @@
+--- logrotate-3.7.1-old/logrotate.c 2004-10-19 23:41:24.000000000 +0200
++++ logrotate-3.7.1-new/logrotate.c 2005-10-02 17:29:22.380767321 +0200
+@@ -424,12 +424,15 @@ int findNeedRotating(logInfo * log, int
+ switch (log->criterium) {
+ case ROT_WEEKLY:
+ /* rotate if:
+- 1) the current weekday is before the weekday of the
+- last rotation
++ 1) the day of the week is the same as the day of the week of
++ the previous rotation but not the same day of the year
++ this will rotate it on the same day every week, but not
++ twice a day.
+ 2) more then a week has passed since the last
+ rotation */
+- state->doRotate = ((now.tm_wday < state->lastRotated.tm_wday) ||
+- ((mktime(&now) - mktime(&state->lastRotated)) >
++ state->doRotate = ((now.tm_wday == state->lastRotated.tm_wday &&
++ now.tm_yday != state->lastRotated.tm_yday) ||
++ ((mktime(&now) - mktime(&state->lastRotated)) >
+ (7 * 24 * 3600)));
+ break;
+ case ROT_MONTHLY: