package term
import (
)
type fileReader interface {
byteReaderWithTimeout
Stop() error
Close()
}
func ( *os.File) (fileReader, error) {
, , := os.Pipe()
if != nil {
return nil,
}
return &bReader{file: , rStop: , wStop: }, nil
}
type bReader struct {
file *os.File
rStop *os.File
wStop *os.File
mutex sync.Mutex
}
func ( *bReader) ( time.Duration) (byte, error) {
.mutex.Lock()
defer .mutex.Unlock()
for {
, := sys.WaitForRead(, .file, .rStop)
if != nil {
if == syscall.EINTR {
continue
}
return 0,
}
if [1] {
var [1]byte
.rStop.Read([:])
return 0, ErrStopped
}
if ![0] {
return 0, errTimeout
}
var [1]byte
, := .file.Read([:])
if != nil {
return 0,
}
if != 1 {
return 0, io.ErrNoProgress
}
return [0], nil
}
}
func ( *bReader) () error {
, := .wStop.Write([]byte{'q'})
.mutex.Lock()
.mutex.Unlock()
return
}
func ( *bReader) () {
.rStop.Close()
.wStop.Close()
}