package term
import (
"golang.org/x/sys/unix"
)
type state struct {
termios unix .Termios
}
func isTerminal(fd int ) bool {
_ , err := unix .IoctlGetTermios (fd , ioctlReadTermios )
return err == nil
}
func makeRaw(fd int ) (*State , error ) {
termios , err := unix .IoctlGetTermios (fd , ioctlReadTermios )
if err != nil {
return nil , err
}
oldState := State {state {termios : *termios }}
termios .Iflag &^= unix .IGNBRK | unix .BRKINT | unix .PARMRK | unix .ISTRIP | unix .INLCR | unix .IGNCR | unix .ICRNL | unix .IXON
termios .Oflag &^= unix .OPOST
termios .Lflag &^= unix .ECHO | unix .ECHONL | unix .ICANON | unix .ISIG | unix .IEXTEN
termios .Cflag &^= unix .CSIZE | unix .PARENB
termios .Cflag |= unix .CS8
termios .Cc [unix .VMIN ] = 1
termios .Cc [unix .VTIME ] = 0
if err := unix .IoctlSetTermios (fd , ioctlWriteTermios , termios ); err != nil {
return nil , err
}
return &oldState , nil
}
func getState(fd int ) (*State , error ) {
termios , err := unix .IoctlGetTermios (fd , ioctlReadTermios )
if err != nil {
return nil , err
}
return &State {state {termios : *termios }}, nil
}
func restore(fd int , state *State ) error {
return unix .IoctlSetTermios (fd , ioctlWriteTermios , &state .termios )
}
func getSize(fd int ) (width , height int , err error ) {
ws , err := unix .IoctlGetWinsize (fd , unix .TIOCGWINSZ )
if err != nil {
return 0 , 0 , err
}
return int (ws .Col ), int (ws .Row ), nil
}
type passwordReader int
func (r passwordReader ) Read (buf []byte ) (int , error ) {
return unix .Read (int (r ), buf )
}
func readPassword(fd int ) ([]byte , error ) {
termios , err := unix .IoctlGetTermios (fd , ioctlReadTermios )
if err != nil {
return nil , err
}
newState := *termios
newState .Lflag &^= unix .ECHO
newState .Lflag |= unix .ICANON | unix .ISIG
newState .Iflag |= unix .ICRNL
if err := unix .IoctlSetTermios (fd , ioctlWriteTermios , &newState ); err != nil {
return nil , err
}
defer unix .IoctlSetTermios (fd , ioctlWriteTermios , termios )
return readPasswordLine (passwordReader (fd ))
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .