syslogd: Unify unlink/truncate + unlock log-rotation logic
Always unlink + reopen, rather than sometimes using ftruncate(); using a single code-path reduces the opportunity for either mistakes or duplicate code. Signed-off-by: Joshua Judson Rosen <jrosen@harvestai.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
b905d6c2ea
commit
9aa6ffb22b
@ -648,32 +648,24 @@ static void log_locally(time_t now, char *msg, logFile_t *log_file)
|
||||
}
|
||||
/* newFile == "f.0" now */
|
||||
rename(log_file->path, newFile);
|
||||
/* Incredibly, if F and F.0 are hardlinks, POSIX
|
||||
* _demands_ that rename returns 0 but does not
|
||||
* remove F!!!
|
||||
* (hardlinked F/F.0 pair was observed after
|
||||
* power failure during rename()).
|
||||
* Ensure old file is gone:
|
||||
*/
|
||||
unlink(log_file->path);
|
||||
#ifdef SYSLOGD_WRLOCK
|
||||
fl.l_type = F_UNLCK;
|
||||
fcntl(log_file->fd, F_SETLKW, &fl);
|
||||
#endif
|
||||
close(log_file->fd);
|
||||
goto reopen;
|
||||
}
|
||||
|
||||
/* We don't get here unless G.logFileRotate == 0;
|
||||
* in which case don't bother unlinking and reopening,
|
||||
* just truncate and reset size to match:
|
||||
/* We may or may not have just renamed the file away;
|
||||
* if we didn't rename because we aren't keeping any backlog,
|
||||
* then it's time to clobber the file. If we did rename it...,
|
||||
* incredibly, if F and F.0 are hardlinks, POSIX _demands_
|
||||
* that rename returns 0 but does not remove F!!!
|
||||
* (hardlinked F/F.0 pair was observed after
|
||||
* power failure during rename()).
|
||||
* So ensure old file is gone in any case:
|
||||
*/
|
||||
ftruncate(log_file->fd, 0);
|
||||
log_file->size = 0;
|
||||
unlink(log_file->path);
|
||||
#ifdef SYSLOGD_WRLOCK
|
||||
fl.l_type = F_UNLCK;
|
||||
fcntl(log_file->fd, F_SETLKW, &fl);
|
||||
#endif
|
||||
close(log_file->fd);
|
||||
goto reopen;
|
||||
}
|
||||
log_file->size +=
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user