diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c index 02d8b10e611a93d6b38bf678048aea3aabeed8b5..409ecb7b58de383ccc851eced0d714c8e31b2613 100644 --- a/src/lib-sieve/sieve-error.c +++ b/src/lib-sieve/sieve-error.c @@ -1032,14 +1032,22 @@ static void sieve_logfile_start(struct sieve_logfile_ehandler *ehandler) /* Rotate logfile */ rotated = t_strconcat(ehandler->logfile, ".0", NULL); - if ( rename(ehandler->logfile, rotated) < 0 ) { - sieve_sys_error(svinst, - "failed to rotate logfile: rename(%s, %s) failed: %m", - ehandler->logfile, rotated); + if ( rename(ehandler->logfile, rotated) < 0 && errno != ENOENT ) { + if ( errno == EACCES ) { + sieve_sys_error(svinst, + "failed to rotate logfile: %s", + eacces_error_get_creating("rename", + t_strconcat(ehandler->logfile, ", ", rotated, NULL))); + } else { + sieve_sys_error(svinst, + "failed to rotate logfile: rename(%s, %s) failed: %m", + ehandler->logfile, rotated); + } } /* Open clean logfile (overwrites existing if rename() failed earlier) */ - fd = open(ehandler->logfile, O_CREAT | O_WRONLY | O_TRUNC, 0600); + fd = open(ehandler->logfile, + O_CREAT | O_APPEND | O_WRONLY | O_TRUNC, 0600); if (fd == -1) { if ( errno == EACCES ) { sieve_sys_error(svinst,