From 4ed567e4649a2689ea01afadc40975372664a899 Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Sun, 15 Feb 2026 15:12:29 +0000 Subject: [PATCH] enable errcheck linter --- .golangci.yml | 8 +++++++- cmd/x32-cli/cli.go | 8 ++++++-- cmd/xair-cli/cli.go | 8 ++++++-- internal/xair/client.go | 7 +++++-- internal/xair/engine.go | 9 +++++++-- 5 files changed, 31 insertions(+), 9 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 27ea162..de22120 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -6,7 +6,7 @@ run: go: '1.24' linters: - disable: [dupl, errcheck] + disable: [dupl] enable: # Default enabled linters - errcheck # Check for unchecked errors @@ -38,6 +38,12 @@ linters: errcheck: check-type-assertions: true check-blank: true + exclude-functions: + - fmt.Fprintf + - fmt.Fprintln + - fmt.Printf + - fmt.Println + - fmt.Errorf revive: severity: warning diff --git a/cmd/x32-cli/cli.go b/cmd/x32-cli/cli.go index d300255..7f62357 100644 --- a/cmd/x32-cli/cli.go +++ b/cmd/x32-cli/cli.go @@ -107,7 +107,11 @@ func run(ctx *kong.Context, config Config) error { if err != nil { return fmt.Errorf("failed to connect to X32 device: %w", err) } - defer client.Close() + defer func() { + if err := client.Close(); err != nil { + log.Errorf("failed to close client connection: %v", err) + } + }() client.StartListening() resp, err := client.RequestInfo() @@ -132,7 +136,7 @@ func connect(config Config) (*xair.X32Client, error) { xair.WithTimeout(config.Timeout), ) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to create X32 client: %w", err) } return client, nil diff --git a/cmd/xair-cli/cli.go b/cmd/xair-cli/cli.go index ddd332c..7e23cf3 100644 --- a/cmd/xair-cli/cli.go +++ b/cmd/xair-cli/cli.go @@ -105,7 +105,11 @@ func run(ctx *kong.Context, config Config) error { if err != nil { return fmt.Errorf("failed to connect to X-Air device: %w", err) } - defer client.Close() + defer func() { + if err := client.Close(); err != nil { + log.Errorf("failed to close client connection: %v", err) + } + }() client.StartListening() resp, err := client.RequestInfo() @@ -130,7 +134,7 @@ func connect(config Config) (*xair.XAirClient, error) { xair.WithTimeout(config.Timeout), ) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to create X-Air client: %w", err) } return client, nil diff --git a/internal/xair/client.go b/internal/xair/client.go index 8da3ce8..4d4e56f 100644 --- a/internal/xair/client.go +++ b/internal/xair/client.go @@ -87,11 +87,14 @@ func (c *client) StartListening() { } // Close stops the client and closes the connection. -func (c *client) Close() { +func (c *client) Close() error { close(c.done) if c.conn != nil { - c.conn.Close() + if err := c.conn.Close(); err != nil { + return fmt.Errorf("failed to close connection: %w", err) + } } + return nil } // SendMessage sends an OSC message to the mixer using the unified connection. diff --git a/internal/xair/engine.go b/internal/xair/engine.go index 5925b1c..62d2a5d 100644 --- a/internal/xair/engine.go +++ b/internal/xair/engine.go @@ -45,7 +45,9 @@ func newEngine( mixerAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", mixerIP, mixerPort)) if err != nil { - conn.Close() + if err := conn.Close(); err != nil { + log.Errorf("failed to close UDP connection: %v", err) + } return nil, fmt.Errorf("failed to resolve mixer address: %w", err) } @@ -78,7 +80,10 @@ func (e *engine) receiveLoop() { return default: // Set a short read deadline to prevent blocking indefinitely - e.conn.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) + if err := e.conn.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + log.Errorf("Failed to set read deadline: %v", err) + continue + } n, _, err := e.conn.ReadFromUDP(buffer) if err != nil { var netErr net.Error