package stty import ( "errors" "fmt" "os" "os/exec" "golang.org/x/sys/unix" "golang.org/x/term" ) type stty interface{ SetBaudRate(portPath string, baudrate int) error CheckBaudRate(portPath string) (baudrate int, err error) TestBaudRate(portPath string, baudrate int) error } var cmd stty func CMD() stty { return cmd } func init() { checkSttyCMD := exec.Command("stty", "--version") sttyOutput, err := checkSttyCMD.Output() if err != nil || len(sttyOutput) == 0 { cmd = &dummy{errors.Join(ERR_STTY_MISSING(),err)} } cmd = &real{} } func ValidateTtyFile(filepath string) error { file, err := os.Open(filepath) if err != nil { return errors.Join(ERR_CANNOT_OPEN_FILE(), fmt.Errorf(err.Error())) } defer file.Close() err = unix.Access(filepath, unix.W_OK) if err != nil { return errors.Join(ERR_NO_WRITE_ACCESS(), err) } if term.IsTerminal(int(file.Fd())) { return nil } return ERR_NOT_TTY() }