github.com/titanous/docker@v1.4.1/pkg/term/tc_linux_cgo.go (about)

     1  // +build linux,cgo
     2  
     3  package term
     4  
     5  import (
     6  	"syscall"
     7  	"unsafe"
     8  )
     9  
    10  // #include <termios.h>
    11  import "C"
    12  
    13  type Termios syscall.Termios
    14  
    15  // MakeRaw put the terminal connected to the given file descriptor into raw
    16  // mode and returns the previous state of the terminal so that it can be
    17  // restored.
    18  func MakeRaw(fd uintptr) (*State, error) {
    19  	var oldState State
    20  	if err := tcget(fd, &oldState.termios); err != 0 {
    21  		return nil, err
    22  	}
    23  
    24  	newState := oldState.termios
    25  
    26  	C.cfmakeraw((*C.struct_termios)(unsafe.Pointer(&newState)))
    27  	if err := tcset(fd, &newState); err != 0 {
    28  		return nil, err
    29  	}
    30  	return &oldState, nil
    31  }
    32  
    33  func tcget(fd uintptr, p *Termios) syscall.Errno {
    34  	ret, err := C.tcgetattr(C.int(fd), (*C.struct_termios)(unsafe.Pointer(p)))
    35  	if ret != 0 {
    36  		return err.(syscall.Errno)
    37  	}
    38  	return 0
    39  }
    40  
    41  func tcset(fd uintptr, p *Termios) syscall.Errno {
    42  	ret, err := C.tcsetattr(C.int(fd), C.TCSANOW, (*C.struct_termios)(unsafe.Pointer(p)))
    43  	if ret != 0 {
    44  		return err.(syscall.Errno)
    45  	}
    46  	return 0
    47  }