• Bug#257685: [PATCH] dateext and maxage extensions (2/3)

    From Roberto Moreda@1:229/2 to All on Wed Aug 18 17:40:10 2004
    [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