input_linux.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package door
  2. import (
  3. "bufio"
  4. "bytes"
  5. "io"
  6. "log"
  7. "syscall"
  8. "time"
  9. "unicode"
  10. )
  11. var ReaderInterval = time.Duration(200) * time.Millisecond
  12. var ReaderTimeval syscall.Timeval = syscall.Timeval{0, 200}
  13. // syscall.FdSet clear all
  14. func clearAll(fdSetPtr *syscall.FdSet) {
  15. for index := range (*fdSetPtr).Bits {
  16. (*fdSetPtr).Bits[index] = 0
  17. }
  18. }
  19. // syscall.FdSet set fd
  20. func set(fdSetPtr *syscall.FdSet, fd int) {
  21. (*fdSetPtr).Bits[fd/64] |= 1 << uint64(fd%64)
  22. }
  23. const READ_SIZE = 16 // Size of read buffer
  24. // go routine Reader for input
  25. // This "times out" every ReaderTimeval
  26. func Reader(d *Door) {
  27. // I need non-blocking reads here.
  28. defer func() {
  29. log.Printf("~Reader\n")
  30. if d.ReaderCanClose {
  31. d.wg.Done()
  32. }
  33. }()
  34. defer func() {
  35. if err := recover(); err != nil {
  36. log.Printf("Reader: %#v\n", err)
  37. }
  38. }()
  39. var fdset syscall.FdSet
  40. var readbuffer [READ_SIZE]byte
  41. var runebuffer bytes.Buffer
  42. var runeread = bufio.NewReaderSize(&runebuffer, 1)
  43. for {
  44. clearAll(&fdset)
  45. set(&fdset, d.READFD)
  46. v, err := syscall.Select(d.READFD+1, &fdset, nil, nil, &ReaderTimeval)
  47. if err == syscall.EINTR {
  48. continue
  49. }
  50. // log.Printf("Select: %#v / %#v\n", v, err)
  51. if v == -1 {
  52. log.Printf("Reader ERR: %#v\n", err)
  53. d.readerMutex.Lock()
  54. if !d.ReaderClosed {
  55. d.ReaderClosed = true
  56. close(d.readerChannel)
  57. }
  58. return
  59. }
  60. if v == 0 {
  61. // timeout
  62. continue
  63. }
  64. // The buffer used here must have len & cap to size you want to read.
  65. // use [BUFF_SIZE]byte for readone
  66. r, err := syscall.Read(d.READFD, readbuffer[:])
  67. if r == -1 {
  68. log.Println("syscall.Read -1 (closed)")
  69. d.readerMutex.Lock()
  70. defer d.readerMutex.Unlock()
  71. if !d.ReaderClosed {
  72. d.ReaderClosed = true
  73. d.Disconnected = true
  74. close(d.readerChannel)
  75. }
  76. return
  77. }
  78. if r == 0 {
  79. log.Printf("Select said ready, but: %#v %#v\n", r, err)
  80. d.readerMutex.Lock()
  81. defer d.readerMutex.Unlock()
  82. if !d.ReaderClosed {
  83. d.ReaderClosed = true
  84. d.Disconnected = true
  85. close(d.readerChannel)
  86. }
  87. return
  88. }
  89. if DEBUG_INPUT {
  90. log.Printf("Reader << %d, %#v\n", r, readbuffer[:r])
  91. }
  92. runebuffer.Write(readbuffer[:r])
  93. var input rune
  94. // Is this unicode?
  95. err = nil
  96. for err == nil {
  97. //RuneRead:
  98. input, _, err = runeread.ReadRune()
  99. if err == io.EOF {
  100. continue
  101. }
  102. if err != nil {
  103. log.Printf("ReadRune: %#v\n", err)
  104. // errors EOF
  105. continue // break for loop
  106. }
  107. if input == unicode.ReplacementChar {
  108. runeread.UnreadRune()
  109. b, _ := runeread.ReadByte()
  110. if DEBUG_INPUT {
  111. log.Printf("Reader (byte) >> %x\n", b)
  112. }
  113. d.readerChannel <- rune(b)
  114. } else {
  115. if DEBUG_INPUT {
  116. log.Printf("Reader >> %x\n", input)
  117. }
  118. d.readerChannel <- input
  119. }
  120. } // goto RuneRead
  121. // buffer = append(buffer, readone[0])
  122. /*
  123. Take2:
  124. input, size = utf8.DecodeRune(buffer)
  125. if input != utf8.RuneError {
  126. d.readerChannel <- input
  127. for size > 0 {
  128. ArrayDelete(&buffer, 0)
  129. size--
  130. }
  131. if len(buffer) > 0 {
  132. goto Take2
  133. }
  134. timeoutCount = 0
  135. } else {
  136. // Not a valid rune
  137. continue
  138. }
  139. */
  140. // d.readerChannel <- rune(buffer[0])
  141. }
  142. }