From e8aac5c357a69c62e92a5199d2c4ee492806ce88 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Sat, 1 Jun 2013 15:51:45 -0700 Subject: [PATCH] Remove cgo from term Upstream-commit: 64f346779fbe4ba9587ec65eedd0e8373f7e29c0 Component: engine --- components/engine/term/term.go | 12 +++--- components/engine/term/termios_linux.go | 50 +++++++------------------ 2 files changed, 19 insertions(+), 43 deletions(-) diff --git a/components/engine/term/term.go b/components/engine/term/term.go index 290bf174ad..ab90a3ef73 100644 --- a/components/engine/term/term.go +++ b/components/engine/term/term.go @@ -8,13 +8,13 @@ import ( ) type Termios struct { - Iflag uintptr - Oflag uintptr - Cflag uintptr - Lflag uintptr + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 Cc [20]byte - Ispeed uintptr - Ospeed uintptr + Ispeed uint32 + Ospeed uint32 } const ( diff --git a/components/engine/term/termios_linux.go b/components/engine/term/termios_linux.go index 92f21edde2..31a10a307c 100644 --- a/components/engine/term/termios_linux.go +++ b/components/engine/term/termios_linux.go @@ -5,26 +5,6 @@ import ( "unsafe" ) -// #include -// #include -/* -void MakeRaw(int fd) { - struct termios t; - - // FIXME: Handle errors? - ioctl(fd, TCGETS, &t); - - t.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); - t.c_oflag &= ~OPOST; - t.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG); - t.c_cflag &= ~(CSIZE | PARENB); - t.c_cflag |= CS8; - - ioctl(fd, TCSETS, &t); -} -*/ -import "C" - const ( getTermios = syscall.TCGETS setTermios = syscall.TCSETS @@ -35,24 +15,20 @@ const ( // restored. func MakeRaw(fd int) (*State, error) { var oldState State - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), syscall.TCGETS, uintptr(unsafe.Pointer(&oldState.termios)), 0, 0, 0); err != 0 { + if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), getTermios, uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { + return nil, err + } + + newState := oldState.termios + + newState.Iflag &^= (syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON) + newState.Oflag &^= syscall.OPOST + newState.Lflag &^= (syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN) + newState.Cflag &^= (syscall.CSIZE | syscall.PARENB) + newState.Cflag |= syscall.CS8 + + if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 { return nil, err } - C.MakeRaw(C.int(fd)) return &oldState, nil - - // FIXME: post on goland issues this: very same as the C function bug non-working - - // newState := oldState.termios - - // newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON) - // newState.Oflag &^= OPOST - // newState.Lflag &^= (ECHO | syscall.ECHONL | ICANON | ISIG | IEXTEN) - // newState.Cflag &^= (CSIZE | syscall.PARENB) - // newState.Cflag |= CS8 - - // if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), syscall.TCSETS, uintptr(unsafe.Pointer(&newState))); err != 0 { - // return nil, err - // } - // return &oldState, nil }