[continued from previous message]
+ } else {
+ hasErrors = compressLogFile(oldName, log);
+ }
}
}
+
+ 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 - 1)) {
+ 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;
+ /* 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);
+ } else {
+ message (MESS_DEBUG, "glob finding old rotated logs failed\n");
+ disposeName = NULL;
+ }
+ /* firstRotated is most recently created/compressed rotated log */
+ /* copy these two out with strdup */
+ globfree(&globResult);
+ free(glob_pattern);
+ } else {
sprintf(oldName, "%s/%s.%d%s%s", dirName, baseName,
logStart + rotateCount, fileext, compext);
@@ -538,8 +634,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);
@@ -590,12 +684,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 "
@@ -603,9 +712,6 @@
disposeName = NULL;
}
- free(dirName);
- free(baseName);
-
if (!hasErrors) {
if (log->pre && !(log->flags & LOG_FLAG_SHAREDSCRIPTS)) {
message(MESS_DEBUG, "running prerotate script\n");
@@ -751,6 +857,8 @@
}
}
#endif
+ free(dirName);
+ free(baseName);
return hasErrors;
}
diff -urNad /usr/src/pool/logrotate/w/logrotate-3.7/logrotate.h logrotate-3.7/logrotate.h
--- /usr/src/pool/logrotate/w/logrotate-3.7/logrotate.h 2003-09-22 19:11:12.000000000 +0000
+++ logrotate-3.7/logrotate.h 2004-08-18 15:19:23.000000000 +0000
@@ -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
#! /bin/sh -e
## 902-moveout.dpatch by <
[email protected]>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: No description.
if [ $# -lt 1 ]; then
echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
exit 1
fi
[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}"
case "$1" in
-patch) patch -p1 ${patch_opts} < $0;;
-unpatch) patch -R -p1 ${patch_opts} < $0;;
*)
echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
exit 1;;
esac