Browse code

Use BSD raw mode on darwin. Fixes nano, tmux and others

Docker-DCO-1.1-Signed-off-by: Guillaume J. Charmes <guillaume@charmes.net> (github: creack)

Guillaume J. Charmes authored on 2014/03/14 03:11:02
Showing 2 changed files
... ...
@@ -9,16 +9,24 @@ const (
9 9
 	getTermios = syscall.TIOCGETA
10 10
 	setTermios = syscall.TIOCSETA
11 11
 
12
-	ECHO   = 0x00000008
13
-	ONLCR  = 0x2
14
-	ISTRIP = 0x20
15
-	INLCR  = 0x40
16
-	ISIG   = 0x80
17
-	IGNCR  = 0x80
18
-	ICANON = 0x100
19
-	ICRNL  = 0x100
20
-	IXOFF  = 0x400
21
-	IXON   = 0x200
12
+	IGNBRK = syscall.IGNBRK
13
+	PARMRK = syscall.PARMRK
14
+	INLCR  = syscall.INLCR
15
+	IGNCR  = syscall.IGNCR
16
+	ECHONL = syscall.ECHONL
17
+	CSIZE  = syscall.CSIZE
18
+	ICRNL  = syscall.ICRNL
19
+	ISTRIP = syscall.ISTRIP
20
+	PARENB = syscall.PARENB
21
+	ECHO   = syscall.ECHO
22
+	ICANON = syscall.ICANON
23
+	ISIG   = syscall.ISIG
24
+	IXON   = syscall.IXON
25
+	BRKINT = syscall.BRKINT
26
+	INPCK  = syscall.INPCK
27
+	OPOST  = syscall.OPOST
28
+	CS8    = syscall.CS8
29
+	IEXTEN = syscall.IEXTEN
22 30
 )
23 31
 
24 32
 type Termios struct {
... ...
@@ -41,10 +49,13 @@ func MakeRaw(fd uintptr) (*State, error) {
41 41
 	}
42 42
 
43 43
 	newState := oldState.termios
44
-	newState.Iflag &^= (ISTRIP | INLCR | IGNCR | IXON | IXOFF)
45
-	newState.Iflag |= ICRNL
46
-	newState.Oflag |= ONLCR
47
-	newState.Lflag &^= (ECHO | ICANON | ISIG)
44
+	newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON)
45
+	newState.Oflag &^= OPOST
46
+	newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN)
47
+	newState.Cflag &^= (CSIZE | PARENB)
48
+	newState.Cflag |= CS8
49
+	newState.Cc[syscall.VMIN] = 1
50
+	newState.Cc[syscall.VTIME] = 0
48 51
 
49 52
 	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 {
50 53
 		return nil, err
... ...
@@ -47,8 +47,6 @@ func MakeRaw(fd uintptr) (*State, error) {
47 47
 	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 {
48 48
 		return nil, err
49 49
 	}
50
-	//	C.makeraw()
51
-	//	return &oldState, nil
52 50
 
53 51
 	newState := oldState.termios
54 52
 	newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON)