...

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

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

     1  //go:build linux
     2  
     3  package reader
     4  
     5  import (
     6  	"bufio"
     7  	"io"
     8  
     9  	"golang.org/x/sys/unix"
    10  
    11  	uevent "edge-infra.dev/pkg/lib/kernel/udev"
    12  )
    13  
    14  type Decoder interface {
    15  	Decode(buf []byte) (*uevent.UEvent, error)
    16  	Read(*[]byte) error
    17  }
    18  
    19  type socket struct {
    20  	fd int
    21  }
    22  
    23  type reader struct {
    24  	reader *bufio.Reader
    25  }
    26  
    27  // Instantiates a new socket reader that peeks/reads
    28  // using unix.Recvfrom.
    29  func NewSocketReader(fd int) Decoder {
    30  	return &socket{fd: fd}
    31  }
    32  
    33  // Instantiates a new reader that peeks/reads
    34  // using an io.Reader.
    35  func NewReader(r io.Reader) Decoder {
    36  	return &reader{reader: bufio.NewReader(r)}
    37  }
    38  
    39  // Reads bytes from the socket and writes them
    40  // to the buffer.
    41  func (s *socket) Read(buf *[]byte) error {
    42  	if buf == nil {
    43  		return io.ErrShortBuffer
    44  	}
    45  	n, _, err := unix.Recvfrom(s.fd, *buf, 0)
    46  	if err != nil {
    47  		return err
    48  	}
    49  	if n == 0 {
    50  		return io.EOF
    51  	}
    52  	// return the buffer of size n
    53  	*buf = (*buf)[:n]
    54  	return nil
    55  }
    56  
    57  // Decodes KOBJECT_UEVENT and returns a UEvent object
    58  func (s *socket) Decode(buf []byte) (ue *uevent.UEvent, err error) {
    59  	return uevent.Decode(buf)
    60  }
    61  
    62  // Reads bytes from the reader and writes them
    63  // to the buffer.
    64  func (r *reader) Read(buf *[]byte) error {
    65  	n, err := r.reader.Read(*buf)
    66  	if n == 0 {
    67  		return io.EOF
    68  	}
    69  	*buf = (*buf)[:n]
    70  	return err
    71  }
    72  
    73  // Decodes KOBJECT_UEVENT and returns a UEvent object
    74  func (r *reader) Decode(buf []byte) (ue *uevent.UEvent, err error) {
    75  	return uevent.Decode(buf)
    76  }
    77  

View as plain text