From 2eaa0bccbdafd33fb67c11de127e637f0d4371d9 Mon Sep 17 00:00:00 2001 From: George Sexton Date: Wed, 11 Sep 2024 20:47:17 -0600 Subject: [PATCH] Add timeout to onewire init to ensure pipeline compatibility. --- netlink/onewire.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/netlink/onewire.go b/netlink/onewire.go index 814fe8ca..30cb6b02 100644 --- a/netlink/onewire.go +++ b/netlink/onewire.go @@ -8,7 +8,11 @@ import ( "encoding/binary" "errors" "fmt" + "log" + "os" "sync" + "syscall" + "time" "periph.io/x/conn/v3/driver/driverreg" "periph.io/x/conn/v3/onewire" @@ -262,7 +266,8 @@ type socket interface { // w1Socket is a netlink connector socket for communicating with the w1 Linux // kernel module. type w1Socket struct { - s socket + s socket + fd int } // newW1Socket returns a socket instance. @@ -273,7 +278,7 @@ func newW1Socket() (*w1Socket, error) { return nil, fmt.Errorf("failed to open netlink socket: %v", err) } - return &w1Socket{s: s}, nil + return &w1Socket{s: s, fd: s.fd}, nil } func (ws *w1Socket) sendAndRecv(seq uint32, m *w1Msg) ([]byte, error) { @@ -469,6 +474,18 @@ func (d *driver1W) Init() (bool, error) { } defer s.close() + // When run in pipelines, this blocks infinitely. Set a reasonable timeout. + // Since this package has not tests that will run in the pipeline, it will + // work out. + err = syscall.SetNonblock(s.fd, true) + if err != nil { + log.Println("set nonblock failed in onewire.init. error: ", err) + return false, err + } + socketFile := os.NewFile(uintptr(s.fd), "onewire-socket") + _ = socketFile.SetReadDeadline(time.Now().Add(2 * time.Second)) + defer socketFile.Close() + // Find bus masters. m := &w1Msg{typ: msgListMasters} if err = s.sendMsg(m.serialize(), 0); err != nil {