write_linux.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package door
  2. import (
  3. "fmt"
  4. "syscall"
  5. )
  6. var writerChannel chan string
  7. func Writer(handle int) {
  8. for output := range writerChannel {
  9. buffer := []byte(output)
  10. n, err := syscall.Write(handle, buffer)
  11. if (err != nil) || (n != len(buffer)) {
  12. close(writerChannel)
  13. break
  14. }
  15. }
  16. }
  17. /*
  18. reading from a closed channel is easy to detect.
  19. res, ok := <-channel
  20. ok == false
  21. writing to a closed channel is a panic.
  22. */
  23. // Write string to client.
  24. func (d *Door) Write(output string) {
  25. if d.Disconnected {
  26. return
  27. }
  28. defer func() {
  29. if r := recover(); r != nil {
  30. fmt.println("Write error/HANGUP.")
  31. d.Disconnected = true
  32. }()
  33. writerChannel <- output
  34. /*
  35. buffer := []byte(output)
  36. n, err := syscall.Write(d.WRITEFD, buffer)
  37. if err != nil {
  38. fmt.Println("Write error/HANGUP?", n)
  39. d.Disconnected = true
  40. }
  41. // No, this isn't it. The # of bytes in buffer == bytes written.
  42. if n != len(buffer) {
  43. fmt.Printf("Write fail: %d != %d\n", len(buffer), n)
  44. }
  45. */
  46. }