package ws
import (
"fmt"
"os"
"golang.org/x/sys/unix"
)
func restore(fd int, t *unix.Termios) error {
return unix.IoctlSetTermios(fd, unix.TCSETS, t)
}
// setupTerm sets the terminal with raw mode attributes for input, whereby
// 'OPOST' is not set.
func setupTerm() (int, *unix.Termios, error) {
var (
err error
fd int
term *unix.Termios
oldTerm = &unix.Termios{}
)
if fd, err = unix.Open("/dev/tty", unix.O_RDONLY, 0); err != nil {
return 0, nil, err
}
if term, err = unix.IoctlGetTermios(fd, unix.TCGETS); err != nil {
return 0, nil, err
}
*oldTerm = *term
term.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP |
unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
term.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
term.Cflag &^= unix.CSIZE | unix.PARENB
term.Cflag |= unix.CS8
term.Cc[unix.VMIN] = 1
term.Cc[unix.VTIME] = 0
if err = unix.IoctlSetTermios(fd, unix.TCSETS, term); err != nil {
return 0, nil, err
}
return fd, oldTerm, nil
}
func checkFile(name string) error {
var (
err error
stat os.FileInfo
)
if stat, err = os.Stat(name); err != nil {
return fmt.Errorf("unable to check metadata for file '%s': %v", name, err)
}
if !stat.Mode().IsRegular() {
return fmt.Errorf("file '%s' is not regular")
}
if stat.Mode()&0444 == 0 {
return fmt.Errorf("file '%s' is not readable")
}
return nil
}