mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Merge pull request #33180 from tophj-ibm/switch-pkg-term-syscalls-to-x/sys
[pkg/term] refactor and switch syscall to x/sys
This commit is contained in:
commit
6f6ee6fd04
18 changed files with 101 additions and 321 deletions
21
pkg/term/tc.go
Normal file
21
pkg/term/tc.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// +build !windows
|
||||||
|
// +build !solaris !cgo
|
||||||
|
|
||||||
|
package term
|
||||||
|
|
||||||
|
import (
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
func tcget(fd uintptr, p *Termios) syscall.Errno {
|
||||||
|
_, _, err := unix.Syscall(unix.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(p)))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func tcset(fd uintptr, p *Termios) syscall.Errno {
|
||||||
|
_, _, err := unix.Syscall(unix.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(p)))
|
||||||
|
return err
|
||||||
|
}
|
|
@ -1,51 +0,0 @@
|
||||||
// +build linux,cgo
|
|
||||||
|
|
||||||
package term
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// #include <termios.h>
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
// Termios is the Unix API for terminal I/O.
|
|
||||||
// It is passthrough for syscall.Termios in order to make it portable with
|
|
||||||
// other platforms where it is not available or handled differently.
|
|
||||||
type Termios syscall.Termios
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
func MakeRaw(fd uintptr) (*State, error) {
|
|
||||||
var oldState State
|
|
||||||
if err := tcget(fd, &oldState.termios); err != 0 {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
newState := oldState.termios
|
|
||||||
|
|
||||||
C.cfmakeraw((*C.struct_termios)(unsafe.Pointer(&newState)))
|
|
||||||
newState.Oflag = newState.Oflag | C.OPOST
|
|
||||||
if err := tcset(fd, &newState); err != 0 {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &oldState, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func tcget(fd uintptr, p *Termios) syscall.Errno {
|
|
||||||
ret, err := C.tcgetattr(C.int(fd), (*C.struct_termios)(unsafe.Pointer(p)))
|
|
||||||
if ret != 0 {
|
|
||||||
return err.(syscall.Errno)
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func tcset(fd uintptr, p *Termios) syscall.Errno {
|
|
||||||
ret, err := C.tcsetattr(C.int(fd), C.TCSANOW, (*C.struct_termios)(unsafe.Pointer(p)))
|
|
||||||
if ret != 0 {
|
|
||||||
return err.(syscall.Errno)
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
// +build !windows
|
|
||||||
// +build !linux !cgo
|
|
||||||
// +build !linux !ppc64le
|
|
||||||
// +build !solaris !cgo
|
|
||||||
|
|
||||||
package term
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
func tcget(fd uintptr, p *Termios) syscall.Errno {
|
|
||||||
_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(p)))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func tcset(fd uintptr, p *Termios) syscall.Errno {
|
|
||||||
_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(p)))
|
|
||||||
return err
|
|
||||||
}
|
|
|
@ -5,6 +5,8 @@ package term
|
||||||
import (
|
import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
// #include <termios.h>
|
// #include <termios.h>
|
||||||
|
@ -13,7 +15,7 @@ import "C"
|
||||||
// Termios is the Unix API for terminal I/O.
|
// Termios is the Unix API for terminal I/O.
|
||||||
// It is passthrough for syscall.Termios in order to make it portable with
|
// It is passthrough for syscall.Termios in order to make it portable with
|
||||||
// other platforms where it is not available or handled differently.
|
// other platforms where it is not available or handled differently.
|
||||||
type Termios syscall.Termios
|
type Termios unix.Termios
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
// MakeRaw put the terminal connected to the given file descriptor into raw
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
// mode and returns the previous state of the terminal so that it can be
|
||||||
|
|
|
@ -10,7 +10,8 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -79,7 +80,7 @@ func SaveState(fd uintptr) (*State, error) {
|
||||||
// descriptor, with echo disabled.
|
// descriptor, with echo disabled.
|
||||||
func DisableEcho(fd uintptr, state *State) error {
|
func DisableEcho(fd uintptr, state *State) error {
|
||||||
newState := state.termios
|
newState := state.termios
|
||||||
newState.Lflag &^= syscall.ECHO
|
newState.Lflag &^= unix.ECHO
|
||||||
|
|
||||||
if err := tcset(fd, &newState); err != 0 {
|
if err := tcset(fd, &newState); err != 0 {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -6,10 +6,10 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"github.com/Azure/go-ansiterm/winterm"
|
"github.com/Azure/go-ansiterm/winterm"
|
||||||
"github.com/docker/docker/pkg/term/windows"
|
"github.com/docker/docker/pkg/term/windows"
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
// State holds the console mode for the terminal.
|
// State holds the console mode for the terminal.
|
||||||
|
@ -79,19 +79,19 @@ func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if emulateStdin {
|
if emulateStdin {
|
||||||
stdIn = windows.NewAnsiReader(syscall.STD_INPUT_HANDLE)
|
stdIn = windowsconsole.NewAnsiReader(windows.STD_INPUT_HANDLE)
|
||||||
} else {
|
} else {
|
||||||
stdIn = os.Stdin
|
stdIn = os.Stdin
|
||||||
}
|
}
|
||||||
|
|
||||||
if emulateStdout {
|
if emulateStdout {
|
||||||
stdOut = windows.NewAnsiWriter(syscall.STD_OUTPUT_HANDLE)
|
stdOut = windowsconsole.NewAnsiWriter(windows.STD_OUTPUT_HANDLE)
|
||||||
} else {
|
} else {
|
||||||
stdOut = os.Stdout
|
stdOut = os.Stdout
|
||||||
}
|
}
|
||||||
|
|
||||||
if emulateStderr {
|
if emulateStderr {
|
||||||
stdErr = windows.NewAnsiWriter(syscall.STD_ERROR_HANDLE)
|
stdErr = windowsconsole.NewAnsiWriter(windows.STD_ERROR_HANDLE)
|
||||||
} else {
|
} else {
|
||||||
stdErr = os.Stderr
|
stdErr = os.Stderr
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) {
|
||||||
|
|
||||||
// GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal.
|
// GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal.
|
||||||
func GetFdInfo(in interface{}) (uintptr, bool) {
|
func GetFdInfo(in interface{}) (uintptr, bool) {
|
||||||
return windows.GetHandleInfo(in)
|
return windowsconsole.GetHandleInfo(in)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetWinsize returns the window size based on the specified file descriptor.
|
// GetWinsize returns the window size based on the specified file descriptor.
|
||||||
|
@ -121,7 +121,7 @@ func GetWinsize(fd uintptr) (*Winsize, error) {
|
||||||
|
|
||||||
// IsTerminal returns true if the given file descriptor is a terminal.
|
// IsTerminal returns true if the given file descriptor is a terminal.
|
||||||
func IsTerminal(fd uintptr) bool {
|
func IsTerminal(fd uintptr) bool {
|
||||||
return windows.IsConsole(fd)
|
return windowsconsole.IsConsole(fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RestoreTerminal restores the terminal connected to the given file descriptor
|
// RestoreTerminal restores the terminal connected to the given file descriptor
|
||||||
|
|
42
pkg/term/termios_bsd.go
Normal file
42
pkg/term/termios_bsd.go
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
// +build darwin freebsd openbsd
|
||||||
|
|
||||||
|
package term
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
getTermios = unix.TIOCGETA
|
||||||
|
setTermios = unix.TIOCSETA
|
||||||
|
)
|
||||||
|
|
||||||
|
// Termios is the Unix API for terminal I/O.
|
||||||
|
type Termios unix.Termios
|
||||||
|
|
||||||
|
// MakeRaw put the terminal connected to the given file descriptor into raw
|
||||||
|
// mode and returns the previous state of the terminal so that it can be
|
||||||
|
// restored.
|
||||||
|
func MakeRaw(fd uintptr) (*State, error) {
|
||||||
|
var oldState State
|
||||||
|
if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, getTermios, uintptr(unsafe.Pointer(&oldState.termios))); err != 0 {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
newState := oldState.termios
|
||||||
|
newState.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON)
|
||||||
|
newState.Oflag &^= unix.OPOST
|
||||||
|
newState.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN)
|
||||||
|
newState.Cflag &^= (unix.CSIZE | unix.PARENB)
|
||||||
|
newState.Cflag |= unix.CS8
|
||||||
|
newState.Cc[unix.VMIN] = 1
|
||||||
|
newState.Cc[unix.VTIME] = 0
|
||||||
|
|
||||||
|
if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &oldState, nil
|
||||||
|
}
|
|
@ -1,69 +0,0 @@
|
||||||
package term
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
getTermios = syscall.TIOCGETA
|
|
||||||
setTermios = syscall.TIOCSETA
|
|
||||||
)
|
|
||||||
|
|
||||||
// Termios magic numbers, passthrough to the ones defined in syscall.
|
|
||||||
const (
|
|
||||||
IGNBRK = syscall.IGNBRK
|
|
||||||
PARMRK = syscall.PARMRK
|
|
||||||
INLCR = syscall.INLCR
|
|
||||||
IGNCR = syscall.IGNCR
|
|
||||||
ECHONL = syscall.ECHONL
|
|
||||||
CSIZE = syscall.CSIZE
|
|
||||||
ICRNL = syscall.ICRNL
|
|
||||||
ISTRIP = syscall.ISTRIP
|
|
||||||
PARENB = syscall.PARENB
|
|
||||||
ECHO = syscall.ECHO
|
|
||||||
ICANON = syscall.ICANON
|
|
||||||
ISIG = syscall.ISIG
|
|
||||||
IXON = syscall.IXON
|
|
||||||
BRKINT = syscall.BRKINT
|
|
||||||
INPCK = syscall.INPCK
|
|
||||||
OPOST = syscall.OPOST
|
|
||||||
CS8 = syscall.CS8
|
|
||||||
IEXTEN = syscall.IEXTEN
|
|
||||||
)
|
|
||||||
|
|
||||||
// Termios is the Unix API for terminal I/O.
|
|
||||||
type Termios struct {
|
|
||||||
Iflag uint64
|
|
||||||
Oflag uint64
|
|
||||||
Cflag uint64
|
|
||||||
Lflag uint64
|
|
||||||
Cc [20]byte
|
|
||||||
Ispeed uint64
|
|
||||||
Ospeed uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
func MakeRaw(fd uintptr) (*State, error) {
|
|
||||||
var oldState State
|
|
||||||
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
newState := oldState.termios
|
|
||||||
newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON)
|
|
||||||
newState.Oflag &^= OPOST
|
|
||||||
newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN)
|
|
||||||
newState.Cflag &^= (CSIZE | PARENB)
|
|
||||||
newState.Cflag |= CS8
|
|
||||||
newState.Cc[syscall.VMIN] = 1
|
|
||||||
newState.Cc[syscall.VTIME] = 0
|
|
||||||
|
|
||||||
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &oldState, nil
|
|
||||||
}
|
|
|
@ -1,69 +0,0 @@
|
||||||
package term
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
getTermios = syscall.TIOCGETA
|
|
||||||
setTermios = syscall.TIOCSETA
|
|
||||||
)
|
|
||||||
|
|
||||||
// Termios magic numbers, passthrough to the ones defined in syscall.
|
|
||||||
const (
|
|
||||||
IGNBRK = syscall.IGNBRK
|
|
||||||
PARMRK = syscall.PARMRK
|
|
||||||
INLCR = syscall.INLCR
|
|
||||||
IGNCR = syscall.IGNCR
|
|
||||||
ECHONL = syscall.ECHONL
|
|
||||||
CSIZE = syscall.CSIZE
|
|
||||||
ICRNL = syscall.ICRNL
|
|
||||||
ISTRIP = syscall.ISTRIP
|
|
||||||
PARENB = syscall.PARENB
|
|
||||||
ECHO = syscall.ECHO
|
|
||||||
ICANON = syscall.ICANON
|
|
||||||
ISIG = syscall.ISIG
|
|
||||||
IXON = syscall.IXON
|
|
||||||
BRKINT = syscall.BRKINT
|
|
||||||
INPCK = syscall.INPCK
|
|
||||||
OPOST = syscall.OPOST
|
|
||||||
CS8 = syscall.CS8
|
|
||||||
IEXTEN = syscall.IEXTEN
|
|
||||||
)
|
|
||||||
|
|
||||||
// Termios is the Unix API for terminal I/O.
|
|
||||||
type Termios struct {
|
|
||||||
Iflag uint32
|
|
||||||
Oflag uint32
|
|
||||||
Cflag uint32
|
|
||||||
Lflag uint32
|
|
||||||
Cc [20]byte
|
|
||||||
Ispeed uint32
|
|
||||||
Ospeed uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
func MakeRaw(fd uintptr) (*State, error) {
|
|
||||||
var oldState State
|
|
||||||
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
newState := oldState.termios
|
|
||||||
newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON)
|
|
||||||
newState.Oflag &^= OPOST
|
|
||||||
newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN)
|
|
||||||
newState.Cflag &^= (CSIZE | PARENB)
|
|
||||||
newState.Cflag |= CS8
|
|
||||||
newState.Cc[syscall.VMIN] = 1
|
|
||||||
newState.Cc[syscall.VTIME] = 0
|
|
||||||
|
|
||||||
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &oldState, nil
|
|
||||||
}
|
|
|
@ -1,46 +1,37 @@
|
||||||
// +build !cgo
|
|
||||||
|
|
||||||
package term
|
package term
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
getTermios = syscall.TCGETS
|
getTermios = unix.TCGETS
|
||||||
setTermios = syscall.TCSETS
|
setTermios = unix.TCSETS
|
||||||
)
|
)
|
||||||
|
|
||||||
// Termios is the Unix API for terminal I/O.
|
// Termios is the Unix API for terminal I/O.
|
||||||
type Termios struct {
|
type Termios unix.Termios
|
||||||
Iflag uint32
|
|
||||||
Oflag uint32
|
|
||||||
Cflag uint32
|
|
||||||
Lflag uint32
|
|
||||||
Cc [20]byte
|
|
||||||
Ispeed uint32
|
|
||||||
Ospeed uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
// MakeRaw put the terminal connected to the given file descriptor into raw
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
// mode and returns the previous state of the terminal so that it can be
|
||||||
// restored.
|
// restored.
|
||||||
func MakeRaw(fd uintptr) (*State, error) {
|
func MakeRaw(fd uintptr) (*State, error) {
|
||||||
var oldState State
|
var oldState State
|
||||||
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, getTermios, uintptr(unsafe.Pointer(&oldState.termios))); err != 0 {
|
if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, getTermios, uintptr(unsafe.Pointer(&oldState.termios))); err != 0 {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
newState := oldState.termios
|
newState := oldState.termios
|
||||||
|
|
||||||
newState.Iflag &^= (syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON)
|
newState.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON)
|
||||||
newState.Oflag |= syscall.OPOST
|
newState.Oflag |= unix.OPOST
|
||||||
newState.Lflag &^= (syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN)
|
newState.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN)
|
||||||
newState.Cflag &^= (syscall.CSIZE | syscall.PARENB)
|
newState.Cflag &^= (unix.CSIZE | unix.PARENB)
|
||||||
newState.Cflag |= syscall.CS8
|
newState.Cflag |= unix.CS8
|
||||||
|
|
||||||
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 {
|
if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &oldState, nil
|
return &oldState, nil
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
package term
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
getTermios = syscall.TIOCGETA
|
|
||||||
setTermios = syscall.TIOCSETA
|
|
||||||
)
|
|
||||||
|
|
||||||
// Termios magic numbers, passthrough to the ones defined in syscall.
|
|
||||||
const (
|
|
||||||
IGNBRK = syscall.IGNBRK
|
|
||||||
PARMRK = syscall.PARMRK
|
|
||||||
INLCR = syscall.INLCR
|
|
||||||
IGNCR = syscall.IGNCR
|
|
||||||
ECHONL = syscall.ECHONL
|
|
||||||
CSIZE = syscall.CSIZE
|
|
||||||
ICRNL = syscall.ICRNL
|
|
||||||
ISTRIP = syscall.ISTRIP
|
|
||||||
PARENB = syscall.PARENB
|
|
||||||
ECHO = syscall.ECHO
|
|
||||||
ICANON = syscall.ICANON
|
|
||||||
ISIG = syscall.ISIG
|
|
||||||
IXON = syscall.IXON
|
|
||||||
BRKINT = syscall.BRKINT
|
|
||||||
INPCK = syscall.INPCK
|
|
||||||
OPOST = syscall.OPOST
|
|
||||||
CS8 = syscall.CS8
|
|
||||||
IEXTEN = syscall.IEXTEN
|
|
||||||
)
|
|
||||||
|
|
||||||
// Termios is the Unix API for terminal I/O.
|
|
||||||
type Termios struct {
|
|
||||||
Iflag uint32
|
|
||||||
Oflag uint32
|
|
||||||
Cflag uint32
|
|
||||||
Lflag uint32
|
|
||||||
Cc [20]byte
|
|
||||||
Ispeed uint32
|
|
||||||
Ospeed uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
func MakeRaw(fd uintptr) (*State, error) {
|
|
||||||
var oldState State
|
|
||||||
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
newState := oldState.termios
|
|
||||||
newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON)
|
|
||||||
newState.Oflag &^= OPOST
|
|
||||||
newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN)
|
|
||||||
newState.Cflag &^= (CSIZE | PARENB)
|
|
||||||
newState.Cflag |= CS8
|
|
||||||
newState.Cc[syscall.VMIN] = 1
|
|
||||||
newState.Cc[syscall.VTIME] = 0
|
|
||||||
|
|
||||||
if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &oldState, nil
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
// +build windows
|
// +build windows
|
||||||
|
|
||||||
package windows
|
package windowsconsole
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// +build windows
|
// +build windows
|
||||||
|
|
||||||
package windows
|
package windowsconsole
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// +build windows
|
// +build windows
|
||||||
|
|
||||||
package windows
|
package windowsconsole
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// When asked for the set of standard streams (e.g., stdin, stdout, stderr), the code will create
|
// When asked for the set of standard streams (e.g., stdin, stdout, stderr), the code will create
|
||||||
// and return pseudo-streams that convert ANSI sequences to / from Windows Console API calls.
|
// and return pseudo-streams that convert ANSI sequences to / from Windows Console API calls.
|
||||||
|
|
||||||
package windows
|
package windowsconsole
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
// This file is necessary to pass the Docker tests.
|
// This file is necessary to pass the Docker tests.
|
||||||
|
|
||||||
package windows
|
package windowsconsole
|
||||||
|
|
|
@ -3,14 +3,15 @@
|
||||||
package term
|
package term
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetWinsize returns the window size based on the specified file descriptor.
|
// GetWinsize returns the window size based on the specified file descriptor.
|
||||||
func GetWinsize(fd uintptr) (*Winsize, error) {
|
func GetWinsize(fd uintptr) (*Winsize, error) {
|
||||||
ws := &Winsize{}
|
ws := &Winsize{}
|
||||||
_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(ws)))
|
_, _, err := unix.Syscall(unix.SYS_IOCTL, fd, uintptr(unix.TIOCGWINSZ), uintptr(unsafe.Pointer(ws)))
|
||||||
// Skipp errno = 0
|
// Skipp errno = 0
|
||||||
if err == 0 {
|
if err == 0 {
|
||||||
return ws, nil
|
return ws, nil
|
||||||
|
@ -20,7 +21,7 @@ func GetWinsize(fd uintptr) (*Winsize, error) {
|
||||||
|
|
||||||
// SetWinsize tries to set the specified window size for the specified file descriptor.
|
// SetWinsize tries to set the specified window size for the specified file descriptor.
|
||||||
func SetWinsize(fd uintptr, ws *Winsize) error {
|
func SetWinsize(fd uintptr, ws *Winsize) error {
|
||||||
_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(ws)))
|
_, _, err := unix.Syscall(unix.SYS_IOCTL, fd, uintptr(unix.TIOCSWINSZ), uintptr(unsafe.Pointer(ws)))
|
||||||
// Skipp errno = 0
|
// Skipp errno = 0
|
||||||
if err == 0 {
|
if err == 0 {
|
||||||
return nil
|
return nil
|
|
@ -1,10 +1,11 @@
|
||||||
// +build solaris
|
// +build solaris,cgo
|
||||||
|
|
||||||
package term
|
package term
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -22,7 +23,7 @@ import "C"
|
||||||
// GetWinsize returns the window size based on the specified file descriptor.
|
// GetWinsize returns the window size based on the specified file descriptor.
|
||||||
func GetWinsize(fd uintptr) (*Winsize, error) {
|
func GetWinsize(fd uintptr) (*Winsize, error) {
|
||||||
ws := &Winsize{}
|
ws := &Winsize{}
|
||||||
ret, err := C.my_ioctl(C.int(fd), C.int(syscall.TIOCGWINSZ), (*C.struct_winsize)(unsafe.Pointer(ws)))
|
ret, err := C.my_ioctl(C.int(fd), C.int(unix.TIOCGWINSZ), (*C.struct_winsize)(unsafe.Pointer(ws)))
|
||||||
// Skip retval = 0
|
// Skip retval = 0
|
||||||
if ret == 0 {
|
if ret == 0 {
|
||||||
return ws, nil
|
return ws, nil
|
||||||
|
@ -32,7 +33,7 @@ func GetWinsize(fd uintptr) (*Winsize, error) {
|
||||||
|
|
||||||
// SetWinsize tries to set the specified window size for the specified file descriptor.
|
// SetWinsize tries to set the specified window size for the specified file descriptor.
|
||||||
func SetWinsize(fd uintptr, ws *Winsize) error {
|
func SetWinsize(fd uintptr, ws *Winsize) error {
|
||||||
ret, err := C.my_ioctl(C.int(fd), C.int(syscall.TIOCSWINSZ), (*C.struct_winsize)(unsafe.Pointer(ws)))
|
ret, err := C.my_ioctl(C.int(fd), C.int(unix.TIOCSWINSZ), (*C.struct_winsize)(unsafe.Pointer(ws)))
|
||||||
// Skip retval = 0
|
// Skip retval = 0
|
||||||
if ret == 0 {
|
if ret == 0 {
|
||||||
return nil
|
return nil
|
Loading…
Reference in a new issue