From b0475528ce04cf37d36fe3abf6c3c0849834877e Mon Sep 17 00:00:00 2001 From: Justin Cormack Date: Wed, 24 May 2017 15:13:33 +0100 Subject: [PATCH] Remove use of cgo Define tcmakeraw directly in Go instead of using C. Allows for easier cross compile. Signed-off-by: Justin Cormack --- console_unix.go | 7 ++----- tc_darwin.go | 12 ++++++++++++ tc_freebsd.go | 12 ++++++++++++ tc_linux.go | 12 ++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/console_unix.go b/console_unix.go index fb27011..b3b268d 100644 --- a/console_unix.go +++ b/console_unix.go @@ -2,9 +2,6 @@ package console -// #include -import "C" - import ( "os" "unsafe" @@ -91,8 +88,8 @@ func (m *master) SetRaw() error { if err != nil { return err } - C.cfmakeraw((*C.struct_termios)(unsafe.Pointer(&rawState))) - rawState.Oflag = rawState.Oflag | C.OPOST + rawState = cfmakeraw(rawState) + rawState.Oflag = rawState.Oflag | unix.OPOST return tcset(m.f.Fd(), &rawState) } diff --git a/tc_darwin.go b/tc_darwin.go index d86c315..b3c8bd1 100644 --- a/tc_darwin.go +++ b/tc_darwin.go @@ -49,3 +49,15 @@ func saneTerminal(f *os.File) error { termios.Oflag &^= unix.ONLCR return tcset(f.Fd(), &termios) } + +func cfmakeraw(t unix.Termios) unix.Termios { + t.Iflag = uint64(uint32(t.Iflag) & ^uint32((unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON))) + t.Oflag = uint64(uint32(t.Oflag) & ^uint32(unix.OPOST)) + t.Lflag = uint64(uint32(t.Lflag) & ^(uint32(unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN))) + t.Cflag = uint64(uint32(t.Cflag) & ^(uint32(unix.CSIZE | unix.PARENB))) + t.Cflag = t.Cflag | unix.CS8 + t.Cc[unix.VMIN] = 1 + t.Cc[unix.VTIME] = 0 + + return t +} diff --git a/tc_freebsd.go b/tc_freebsd.go index 478f60a..4a29179 100644 --- a/tc_freebsd.go +++ b/tc_freebsd.go @@ -49,3 +49,15 @@ func saneTerminal(f *os.File) error { termios.Oflag &^= unix.ONLCR return tcset(f.Fd(), &termios) } + +func cfmakeraw(t unix.Termios) unix.Termios { + t.Iflag = t.Iflag & ^uint32((unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON)) + t.Oflag = t.Oflag & ^uint32(unix.OPOST) + t.Lflag = t.Lflag & ^(uint32(unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN)) + t.Cflag = t.Cflag & ^(uint32(unix.CSIZE | unix.PARENB)) + t.Cflag = t.Cflag | unix.CS8 + t.Cc[unix.VMIN] = 1 + t.Cc[unix.VTIME] = 0 + + return t +} diff --git a/tc_linux.go b/tc_linux.go index 67c89f0..9a29a70 100644 --- a/tc_linux.go +++ b/tc_linux.go @@ -49,3 +49,15 @@ func saneTerminal(f *os.File) error { termios.Oflag &^= unix.ONLCR return tcset(f.Fd(), &termios) } + +func cfmakeraw(t unix.Termios) unix.Termios { + t.Iflag = t.Iflag & ^uint32((unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON)) + t.Oflag = t.Oflag & ^uint32(unix.OPOST) + t.Lflag = t.Lflag & ^(uint32(unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN)) + t.Cflag = t.Cflag & ^(uint32(unix.CSIZE | unix.PARENB)) + t.Cflag = t.Cflag | unix.CS8 + t.Cc[unix.VMIN] = 1 + t.Cc[unix.VTIME] = 0 + + return t +}