|  | @@ -9,6 +9,8 @@ import (
 | 
	
		
			
				|  |  |  	"strings"
 | 
	
		
			
				|  |  |  	"syscall"
 | 
	
		
			
				|  |  |  	"time"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	"golang.org/x/sys/unix"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /*
 | 
	
	
		
			
				|  | @@ -185,6 +187,7 @@ func (d *Door) ReadDropfile(filename string) {
 | 
	
		
			
				|  |  |  	d.config.time_left, err = strconv.Atoi(lines[8])
 | 
	
		
			
				|  |  |  	d.config.emulation, err = strconv.Atoi(lines[9])
 | 
	
		
			
				|  |  |  	d.config.node_number, err = strconv.Atoi(lines[10])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	d.READFD = d.config.comm_handle
 | 
	
		
			
				|  |  |  	//if d.READFD == 0 {
 | 
	
		
			
				|  |  |  	//	d.WRITEFD = 1
 | 
	
	
		
			
				|  | @@ -235,6 +238,57 @@ func (d *Door) detect() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +func tcgetattr(fd uintptr) (*unix.Termios, error) {
 | 
	
		
			
				|  |  | +	return unix.IoctlGetTermios(int(fd), unix.TCGETS)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func cfmakeraw(attr *unix.Termios) {
 | 
	
		
			
				|  |  | +	attr.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.ISTRIP | unix.PARMRK |
 | 
	
		
			
				|  |  | +		unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
 | 
	
		
			
				|  |  | +	attr.Oflag &^= unix.OPOST
 | 
	
		
			
				|  |  | +	attr.Cflag &^= unix.CSIZE | unix.PARENB
 | 
	
		
			
				|  |  | +	attr.Cflag |= unix.CS8
 | 
	
		
			
				|  |  | +	attr.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.IEXTEN | unix.ISIG
 | 
	
		
			
				|  |  | +	attr.Cc[unix.VMIN] = 0
 | 
	
		
			
				|  |  | +	attr.Cc[unix.VTIME] = 1
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	/*
 | 
	
		
			
				|  |  | +		attr.Iflag &^= unix.BRKINT | unix.INLCR | unix.ICRNL | unix.INPCK | unix.ISTRIP | unix.IXON
 | 
	
		
			
				|  |  | +		attr.Oflag &^= unix.OPOST
 | 
	
		
			
				|  |  | +		attr.Cflag &^= unix.CSIZE | unix.PARENB
 | 
	
		
			
				|  |  | +		attr.Cflag |= unix.CS8
 | 
	
		
			
				|  |  | +		attr.Lflag &^= unix.ECHO | unix.ICANON | unix.IEXTEN | unix.ISIG
 | 
	
		
			
				|  |  | +		attr.Cc[unix.VMIN] = 1
 | 
	
		
			
				|  |  | +		attr.Cc[unix.VTIME] = 0
 | 
	
		
			
				|  |  | +	*/
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const (
 | 
	
		
			
				|  |  | +	TCIFLUSH  = 0
 | 
	
		
			
				|  |  | +	TCOFLUSH  = 1
 | 
	
		
			
				|  |  | +	TCIOFLUSH = 2
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	TCSANOW   = 0
 | 
	
		
			
				|  |  | +	TCSADRAIN = 1
 | 
	
		
			
				|  |  | +	TCSAFLUSH = 2
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Tcsetattr sets the current serial port settings.
 | 
	
		
			
				|  |  | +func tcsetattr(fd, action uintptr, argp *unix.Termios) error {
 | 
	
		
			
				|  |  | +	var request uintptr
 | 
	
		
			
				|  |  | +	switch action {
 | 
	
		
			
				|  |  | +	case TCSANOW:
 | 
	
		
			
				|  |  | +		request = unix.TCSETS
 | 
	
		
			
				|  |  | +	case TCSADRAIN:
 | 
	
		
			
				|  |  | +		request = unix.TCSETSW
 | 
	
		
			
				|  |  | +	case TCSAFLUSH:
 | 
	
		
			
				|  |  | +		request = unix.TCSETSF
 | 
	
		
			
				|  |  | +	default:
 | 
	
		
			
				|  |  | +		return unix.EINVAL
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return unix.IoctlSetTermios(int(fd), uint(request), argp)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func (d *Door) Init() {
 | 
	
		
			
				|  |  |  	var dropfile string
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -248,9 +302,15 @@ func (d *Door) Init() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	d.ReadDropfile(dropfile)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	fmt.Printf("BBS %s, User %s / Handle %s / File %d\n", d.config.BBSID, d.config.real_name, d.config.handle, d.config.comm_handle)
 | 
	
		
			
				|  |  | +	fmt.Printf("BBS %s, User %s / Handle %s / File %d\n", d.config.BBSID, d.config.real_name, d.config.handle, d.READFD)
 | 
	
		
			
				|  |  |  	// putting the linux terminal into raw mode ...
 | 
	
		
			
				|  |  |  	// requires golang.org/x/sys/unix  unix.Ioctlgetermios, etc.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// I'm still getting terminal echo, terminal still not in raw mode (needs CR to submit)
 | 
	
		
			
				|  |  | +	a, _ := tcgetattr(uintptr(d.READFD))
 | 
	
		
			
				|  |  | +	cfmakeraw(a)
 | 
	
		
			
				|  |  | +	_ = tcsetattr(uintptr(d.READFD), TCSANOW, a)
 | 
	
		
			
				|  |  | +	// _ = tcsetattr(uintptr(d.READFD), TCSAFLUSH, a)
 | 
	
		
			
				|  |  |  	d.detect()
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |