github.com/pmorton/docker@v1.5.0/pkg/term/termios_linux.go (about)

     1  // +build !cgo
     2  
     3  package term
     4  
     5  import (
     6  	"syscall"
     7  	"unsafe"
     8  )
     9  
    10  const (
    11  	getTermios = syscall.TCGETS
    12  	setTermios = syscall.TCSETS
    13  )
    14  
    15  type Termios struct {
    16  	Iflag  uint32
    17  	Oflag  uint32
    18  	Cflag  uint32
    19  	Lflag  uint32
    20  	Cc     [20]byte
    21  	Ispeed uint32
    22  	Ospeed uint32
    23  }
    24  
    25  // MakeRaw put the terminal connected to the given file descriptor into raw
    26  // mode and returns the previous state of the terminal so that it can be
    27  // restored.
    28  func MakeRaw(fd uintptr) (*State, error) {
    29  	var oldState State
    30  	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, getTermios, uintptr(unsafe.Pointer(&oldState.termios))); err != 0 {
    31  		return nil, err
    32  	}
    33  
    34  	newState := oldState.termios
    35  
    36  	newState.Iflag &^= (syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON)
    37  	newState.Oflag &^= syscall.OPOST
    38  	newState.Lflag &^= (syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN)
    39  	newState.Cflag &^= (syscall.CSIZE | syscall.PARENB)
    40  	newState.Cflag |= syscall.CS8
    41  
    42  	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 {
    43  		return nil, err
    44  	}
    45  	return &oldState, nil
    46  }