Comments only, no behaviour changed. Each place the log tailer, Health and cmd/panel rely on another program now says where that is written, for the version the image runs: Postfix 3.7.11 (log_adhoc(), msg_logger_print(), smtpd_whatsup(), cleanup_milter.c, qmgr_active.c, postlogd.c, showq.c, pipe.c), logrotate 3.21.0, supervisor 4.2.5, proc(5). Measurements stay measurements and say where and when; test fixtures say whether they were seen or composed. Where the source contradicts the code the comment does not bless it but names the register entry (A-8 expiry, A-12 the ISO stamp no Postfix writes, A-15 the last recipient, A-21/A-23 sasl_username, A-33 postlogd's old inode, A-38 a socket file is not a listener, A-65 the certificate served); those are fixed in their own commits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 lines
751 B
Go
29 lines
751 B
Go
//go:build unix
|
|
|
|
package logtail
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"syscall"
|
|
)
|
|
|
|
// fileID names the file itself - its inode - which a rename keeps and a new
|
|
// file does not share (rename(2): the file is moved, other hard links to it
|
|
// are unaffected; st_ino in stat(2)). It is part of the log's fingerprint, so
|
|
// two log files whose first bytes happen to match are still told apart. The device number
|
|
// is left out: it can change across a host's reboot (LVM, btrfs, network
|
|
// file systems), and the same log would then pass for a rotated one (review
|
|
// of stage 2b).
|
|
func fileID(f *os.File) string {
|
|
info, err := f.Stat()
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
st, ok := info.Sys().(*syscall.Stat_t)
|
|
if !ok {
|
|
return ""
|
|
}
|
|
return fmt.Sprintf("%d", st.Ino)
|
|
}
|