stdio_conn.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package restic
  2. import (
  3. "net"
  4. "os"
  5. "time"
  6. )
  7. // Addr implements net.Addr for stdin/stdout.
  8. type Addr struct{}
  9. // Network returns the network type as a string.
  10. func (a Addr) Network() string {
  11. return "stdio"
  12. }
  13. func (a Addr) String() string {
  14. return "stdio"
  15. }
  16. // StdioConn implements a net.Conn via stdin/stdout.
  17. type StdioConn struct {
  18. stdin *os.File
  19. stdout *os.File
  20. }
  21. func (s *StdioConn) Read(p []byte) (int, error) {
  22. return s.stdin.Read(p)
  23. }
  24. func (s *StdioConn) Write(p []byte) (int, error) {
  25. return s.stdout.Write(p)
  26. }
  27. // Close closes both streams.
  28. func (s *StdioConn) Close() error {
  29. err1 := s.stdin.Close()
  30. err2 := s.stdout.Close()
  31. if err1 != nil {
  32. return err1
  33. }
  34. return err2
  35. }
  36. // LocalAddr returns nil.
  37. func (s *StdioConn) LocalAddr() net.Addr {
  38. return Addr{}
  39. }
  40. // RemoteAddr returns nil.
  41. func (s *StdioConn) RemoteAddr() net.Addr {
  42. return Addr{}
  43. }
  44. // SetDeadline sets the read/write deadline.
  45. func (s *StdioConn) SetDeadline(t time.Time) error {
  46. err1 := s.stdin.SetReadDeadline(t)
  47. err2 := s.stdout.SetWriteDeadline(t)
  48. if err1 != nil {
  49. return err1
  50. }
  51. return err2
  52. }
  53. // SetReadDeadline sets the read/write deadline.
  54. func (s *StdioConn) SetReadDeadline(t time.Time) error {
  55. return s.stdin.SetReadDeadline(t)
  56. }
  57. // SetWriteDeadline sets the read/write deadline.
  58. func (s *StdioConn) SetWriteDeadline(t time.Time) error {
  59. return s.stdout.SetWriteDeadline(t)
  60. }