...

Source file src/edge-infra.dev/pkg/lib/kernel/udev/reader/stream.go

Documentation: edge-infra.dev/pkg/lib/kernel/udev/reader

     1  //go:build linux
     2  
     3  package reader
     4  
     5  import (
     6  	"context"
     7  	"fmt"
     8  
     9  	"edge-infra.dev/pkg/lib/kernel/udev"
    10  	uevent "edge-infra.dev/pkg/lib/kernel/udev"
    11  )
    12  
    13  // Creates a thread to stream udev events from the decoder. UEvents
    14  // are sent over the returned event channel. Errors are sent over the
    15  // returned error channel.
    16  //
    17  // The thread exits whenever an error is sent over the error channel
    18  // or the context is cancelled.
    19  func StreamUEvents(ctx context.Context, decoder Decoder) (<-chan *uevent.UEvent, <-chan error) {
    20  	errs := make(chan error, 1)
    21  	uEventChan := make(chan *udev.UEvent, 1)
    22  
    23  	go func() {
    24  		for {
    25  			select {
    26  			case <-ctx.Done():
    27  				return
    28  			default:
    29  				buf := make([]byte, udev.MaxSize)
    30  				if err := decoder.Read(&buf); err != nil {
    31  					errs <- fmt.Errorf("failed to read data: %w", err)
    32  					continue
    33  				}
    34  
    35  				uevent, err := decoder.Decode(buf)
    36  				if err != nil {
    37  					errs <- fmt.Errorf("failed to decode data: %w", err)
    38  					continue
    39  				}
    40  				uEventChan <- uevent
    41  			}
    42  		}
    43  	}()
    44  	return uEventChan, errs
    45  }
    46  

View as plain text