From cbd37cc302ed71fb27cb0af0293e949698ee4309 Mon Sep 17 00:00:00 2001 From: Don Penney Date: Wed, 22 Aug 2018 00:13:32 +0800 Subject: [PATCH] createOutputFile: rename already existing file Upstream patch: From fc1c3eff61edf8e9f0a4bfa980f3a6030a6b271f Mon Sep 17 00:00:00 2001 From: Mathieu Parent Date: Tue, 8 Mar 2016 16:56:50 +0100 Subject: [PATCH] createOutputFile: rename already existing file See https://bugs.debian.org/734688 Closes #23 --- logrotate.c | 20 ++++++++++++++++++-- test/test | 26 ++++++++++++++++++++++++++ test/test-config.72.in | 7 +++++++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 test/test-config.72.in diff --git a/logrotate.c b/logrotate.c index e056ccd..e415164 100644 --- a/logrotate.c +++ b/logrotate.c @@ -395,8 +395,24 @@ static int runScript(struct logInfo *log, char *logfn, char *script) int createOutputFile(char *fileName, int flags, struct stat *sb, acl_type acl, int force_mode) { int fd; - struct stat sb_create; - int acl_set = 0; + struct stat sb_create; + int acl_set = 0; + + if (stat(fileName, &sb_create) == 0) { + /* the destination file already exists, while it should not */ + struct tm now = *localtime(&nowSecs); + size_t fileName_size = strlen(fileName); + char* backupName = alloca(fileName_size + sizeof("-YYYYMMDDHH.backup")); + strncpy(backupName, fileName, fileName_size); + size_t date_size=strftime(backupName+fileName_size, 12, "-%Y%m%d%H", &now); + strncpy(backupName+fileName_size+date_size, ".backup\0", 8); + message(MESS_ERROR, "destination %s already exists, renaming to %s\n", fileName, backupName); + if (rename(fileName, backupName) != 0) { + message(MESS_ERROR, "error renaming already existing output file %s to %s: %s\n", + fileName, backupName, strerror(errno)); + return -1; + } + } fd = open(fileName, (flags | O_EXCL | O_NOFOLLOW), (S_IRUSR | S_IWUSR) & sb->st_mode); diff --git a/test/test b/test/test index bcdfe05..b47ac6a 100755 --- a/test/test +++ b/test/test @@ -1586,6 +1586,32 @@ EOF rm -rf testdir adir rm -rf testdir bdir +cleanup 72 + +# ------------------------------- Test 72 ------------------------------------ +preptest test.log 72 2 + +$RLR test-config.72 --force + +checkoutput < test.log.1.gz + +$RLR test-config.72 --force +dt="$(date +%Y%m%d%H)" + +checkoutput <