//go:build linux package reader import ( "context" "fmt" "edge-infra.dev/pkg/lib/kernel/udev" uevent "edge-infra.dev/pkg/lib/kernel/udev" ) // Creates a thread to stream udev events from the decoder. UEvents // are sent over the returned event channel. Errors are sent over the // returned error channel. // // The thread exits whenever an error is sent over the error channel // or the context is cancelled. func StreamUEvents(ctx context.Context, decoder Decoder) (<-chan *uevent.UEvent, <-chan error) { errs := make(chan error, 1) uEventChan := make(chan *udev.UEvent, 1) go func() { for { select { case <-ctx.Done(): return default: buf := make([]byte, udev.MaxSize) if err := decoder.Read(&buf); err != nil { errs <- fmt.Errorf("failed to read data: %w", err) continue } uevent, err := decoder.Decode(buf) if err != nil { errs <- fmt.Errorf("failed to decode data: %w", err) continue } uEventChan <- uevent } } }() return uEventChan, errs }