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