syslogd: Unify unlink/truncate + unlock log-rotation logic
No binary (build failed)
—
(log yok)
| @@ -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 | |