From 92fbe7edda6b1ae2a7f151c8300a22a8dbbe745f Mon Sep 17 00:00:00 2001 From: zarazaex69 Date: Mon, 18 May 2026 10:58:04 +0300 Subject: [PATCH] refactor: move stderr filter to unix build-tagged file --- cmd/olcrtc/main.go | 44 ----------------------- cmd/olcrtc/stderr_filter_unix.go | 54 +++++++++++++++++++++++++++++ cmd/olcrtc/stderr_filter_windows.go | 5 +++ go.mod | 2 +- 4 files changed, 60 insertions(+), 45 deletions(-) create mode 100644 cmd/olcrtc/stderr_filter_unix.go create mode 100644 cmd/olcrtc/stderr_filter_windows.go diff --git a/cmd/olcrtc/main.go b/cmd/olcrtc/main.go index 0ed3c5a..9a806c5 100644 --- a/cmd/olcrtc/main.go +++ b/cmd/olcrtc/main.go @@ -6,7 +6,6 @@ package main import ( - "bufio" "bytes" "context" "errors" @@ -16,7 +15,6 @@ import ( "os" "os/signal" "path/filepath" - "sync" "syscall" "time" @@ -47,8 +45,6 @@ var runSession = session.Run //nolint:gochecknoglobals // Tests replace gen runner with a stub. var runGen = execGen -var stderrFilterOnce sync.Once //nolint:gochecknoglobals // process-wide stderr fd filter - // loadedConfig bundles the parsed YAML file and the derived session config. type loadedConfig struct { scfg session.Config @@ -339,46 +335,6 @@ func (f filteredWriter) Write(p []byte) (int, error) { return n, nil } -func installStderrFilter() { - stderrFilterOnce.Do(func() { - origFD, err := syscall.Dup(int(os.Stderr.Fd())) - if err != nil { - return - } - reader, writer, err := os.Pipe() - if err != nil { - _ = syscall.Close(origFD) - return - } - if err := syscall.Dup2(int(writer.Fd()), int(os.Stderr.Fd())); err != nil { - _ = reader.Close() - _ = writer.Close() - _ = syscall.Close(origFD) - return - } - _ = writer.Close() - os.Stderr = os.NewFile(uintptr(syscall.Stderr), "/dev/stderr") - orig := os.NewFile(uintptr(origFD), "/dev/stderr-original") - go copyFilteredStderr(reader, orig) - }) -} - -func copyFilteredStderr(reader *os.File, out io.Writer) { - defer func() { _ = reader.Close() }() - br := bufio.NewReader(reader) - for { - line, err := br.ReadBytes('\n') - if len(line) > 0 && !isNoisyLogLine(line) { - if _, writeErr := out.Write(line); writeErr != nil { - return - } - } - if err != nil { - return - } - } -} - func isNoisyLogLine(line []byte) bool { for _, prefix := range noisyPrefixes { if bytes.Contains(line, prefix) { diff --git a/cmd/olcrtc/stderr_filter_unix.go b/cmd/olcrtc/stderr_filter_unix.go new file mode 100644 index 0000000..613b28c --- /dev/null +++ b/cmd/olcrtc/stderr_filter_unix.go @@ -0,0 +1,54 @@ +//go:build !windows + +package main + +import ( + "bufio" + "io" + "os" + "sync" + + "golang.org/x/sys/unix" +) + +var stderrFilterOnce sync.Once //nolint:gochecknoglobals // process-wide stderr fd filter + +func installStderrFilter() { + stderrFilterOnce.Do(func() { + origFD, err := unix.Dup(int(os.Stderr.Fd())) + if err != nil { + return + } + reader, writer, err := os.Pipe() + if err != nil { + _ = unix.Close(origFD) + return + } + if err := unix.Dup2(int(writer.Fd()), int(os.Stderr.Fd())); err != nil { + _ = reader.Close() + _ = writer.Close() + _ = unix.Close(origFD) + return + } + _ = writer.Close() + os.Stderr = os.NewFile(uintptr(unix.Stderr), "/dev/stderr") + orig := os.NewFile(uintptr(origFD), "/dev/stderr-original") + go copyFilteredStderr(reader, orig) + }) +} + +func copyFilteredStderr(reader *os.File, out io.Writer) { + defer func() { _ = reader.Close() }() + br := bufio.NewReader(reader) + for { + line, err := br.ReadBytes('\n') + if len(line) > 0 && !isNoisyLogLine(line) { + if _, writeErr := out.Write(line); writeErr != nil { + return + } + } + if err != nil { + return + } + } +} diff --git a/cmd/olcrtc/stderr_filter_windows.go b/cmd/olcrtc/stderr_filter_windows.go new file mode 100644 index 0000000..760d7a8 --- /dev/null +++ b/cmd/olcrtc/stderr_filter_windows.go @@ -0,0 +1,5 @@ +//go:build windows + +package main + +func installStderrFilter() {} diff --git a/go.mod b/go.mod index 75b0244..8f4ed2d 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( github.com/zarazaex69/j v0.0.0-20260516013155-bffcfe38e7d9 golang.org/x/crypto v0.50.0 golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b + golang.org/x/sys v0.43.0 google.golang.org/genproto v0.0.0-20260209200024-4cfbd4190f57 gopkg.in/yaml.v3 v3.0.1 ) @@ -82,7 +83,6 @@ require ( golang.org/x/mod v0.35.0 // indirect golang.org/x/net v0.53.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.43.0 // indirect golang.org/x/text v0.36.0 // indirect golang.org/x/time v0.15.0 // indirect golang.org/x/tools v0.44.0 // indirect