aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Judson Rosen <jrosen@harvestai.com>2014-05-20 01:02:20 -0400
committerDenys Vlasenko <vda.linux@googlemail.com>2014-06-02 03:11:40 +0200
commit9aa6ffb22b712d4e928604e291f954b02237e8cd (patch)
treead606fe29c75f2acfdad5c2b328d56f911c3047e
parentb905d6c2eaaf7ad92a50dccc7b91ee19dd9424b7 (diff)
downloadbusybox-w32-9aa6ffb22b712d4e928604e291f954b02237e8cd.tar.gz
busybox-w32-9aa6ffb22b712d4e928604e291f954b02237e8cd.tar.bz2
busybox-w32-9aa6ffb22b712d4e928604e291f954b02237e8cd.zip
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>
-rw-r--r--sysklogd/syslogd.c30
1 files changed, 11 insertions, 19 deletions
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index d77fc9475..f75851085 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -648,32 +648,24 @@ static void log_locally(time_t now, char *msg, logFile_t *log_file)
648 } 648 }
649 /* newFile == "f.0" now */ 649 /* newFile == "f.0" now */
650 rename(log_file->path, newFile); 650 rename(log_file->path, newFile);
651 /* Incredibly, if F and F.0 are hardlinks, POSIX
652 * _demands_ that rename returns 0 but does not
653 * remove F!!!
654 * (hardlinked F/F.0 pair was observed after
655 * power failure during rename()).
656 * Ensure old file is gone:
657 */
658 unlink(log_file->path);
659#ifdef SYSLOGD_WRLOCK
660 fl.l_type = F_UNLCK;
661 fcntl(log_file->fd, F_SETLKW, &fl);
662#endif
663 close(log_file->fd);
664 goto reopen;
665 } 651 }
666 652
667 /* We don't get here unless G.logFileRotate == 0; 653 /* We may or may not have just renamed the file away;
668 * in which case don't bother unlinking and reopening, 654 * if we didn't rename because we aren't keeping any backlog,
669 * just truncate and reset size to match: 655 * then it's time to clobber the file. If we did rename it...,
656 * incredibly, if F and F.0 are hardlinks, POSIX _demands_
657 * that rename returns 0 but does not remove F!!!
658 * (hardlinked F/F.0 pair was observed after
659 * power failure during rename()).
660 * So ensure old file is gone in any case:
670 */ 661 */
671 ftruncate(log_file->fd, 0); 662 unlink(log_file->path);
672 log_file->size = 0;
673#ifdef SYSLOGD_WRLOCK 663#ifdef SYSLOGD_WRLOCK
674 fl.l_type = F_UNLCK; 664 fl.l_type = F_UNLCK;
675 fcntl(log_file->fd, F_SETLKW, &fl); 665 fcntl(log_file->fd, F_SETLKW, &fl);
676#endif 666#endif
667 close(log_file->fd);
668 goto reopen;
677 } 669 }
678 log_file->size += 670 log_file->size +=
679#endif 671#endif