package door import ( "log" "syscall" ) func Reader(handle int) { // I don't need the select anymore. Let the read block. buffer := make([]byte, 1) for { r, err := syscall.Read(d.READFD, buffer) if err != nil { log.Printf("Reader ERR: %#v\n", err) close(readerChannel) break } if read == 1 { readerChannel <- buffer[0] } else { log.Printf("READ FAILED %d\n", read) close(readerChannel) break } } } /* // Low level read key function. // This gets the raw keys from the client, it doesn't handle extended keys, // functions, arrows. // Return key, or -1 (Timeout/No key available), -2 hangup func (d *Door) getch() int { var fdsetRead syscall.FdSet clearAll(&fdsetRead) set(&fdsetRead, d.READFD) // 100 Usec seems like a good value, works with QModem in dosbox. timeout := syscall.Timeval{Sec: 0, Usec: 100} v, err := syscall.Select(d.READFD+1, &fdsetRead, nil, nil, &timeout) if v == -1 { // hangup return -2 } if v == 0 { // timeout return -1 } buffer := make([]byte, 1) r, err := syscall.Read(d.READFD, buffer) if r != 1 { // I'm getting write error here... (when disconnected) log.Printf("Read said ready, but didn't read a character %d %v.\n", r, err) // hangup d.Disconnected = true return -2 } return int(buffer[0]) } */