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 */
|
/* newFile == "f.0" now */
|
||||||
rename(log_file->path, newFile);
|
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;
|
/* We may or may not have just renamed the file away;
|
||||||
* in which case don't bother unlinking and reopening,
|
* if we didn't rename because we aren't keeping any backlog,
|
||||||
* just truncate and reset size to match:
|
* 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);
|
unlink(log_file->path);
|
||||||
log_file->size = 0;
|
|
||||||
#ifdef SYSLOGD_WRLOCK
|
#ifdef SYSLOGD_WRLOCK
|
||||||
fl.l_type = F_UNLCK;
|
fl.l_type = F_UNLCK;
|
||||||
fcntl(log_file->fd, F_SETLKW, &fl);
|
fcntl(log_file->fd, F_SETLKW, &fl);
|
||||||
#endif
|
#endif
|
||||||
|
close(log_file->fd);
|
||||||
|
goto reopen;
|
||||||
}
|
}
|
||||||
log_file->size +=
|
log_file->size +=
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user