Home | History | Annotate | Download | only in net
      1 // Copyright 2010 The Go Authors.  All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package net
      6 
      7 import (
      8 	"errors"
      9 	"io"
     10 	"time"
     11 )
     12 
     13 // Pipe creates a synchronous, in-memory, full duplex
     14 // network connection; both ends implement the Conn interface.
     15 // Reads on one end are matched with writes on the other,
     16 // copying data directly between the two; there is no internal
     17 // buffering.
     18 func Pipe() (Conn, Conn) {
     19 	r1, w1 := io.Pipe()
     20 	r2, w2 := io.Pipe()
     21 
     22 	return &pipe{r1, w2}, &pipe{r2, w1}
     23 }
     24 
     25 type pipe struct {
     26 	*io.PipeReader
     27 	*io.PipeWriter
     28 }
     29 
     30 type pipeAddr int
     31 
     32 func (pipeAddr) Network() string {
     33 	return "pipe"
     34 }
     35 
     36 func (pipeAddr) String() string {
     37 	return "pipe"
     38 }
     39 
     40 func (p *pipe) Close() error {
     41 	err := p.PipeReader.Close()
     42 	err1 := p.PipeWriter.Close()
     43 	if err == nil {
     44 		err = err1
     45 	}
     46 	return err
     47 }
     48 
     49 func (p *pipe) LocalAddr() Addr {
     50 	return pipeAddr(0)
     51 }
     52 
     53 func (p *pipe) RemoteAddr() Addr {
     54 	return pipeAddr(0)
     55 }
     56 
     57 func (p *pipe) SetDeadline(t time.Time) error {
     58 	return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
     59 }
     60 
     61 func (p *pipe) SetReadDeadline(t time.Time) error {
     62 	return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
     63 }
     64 
     65 func (p *pipe) SetWriteDeadline(t time.Time) error {
     66 	return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
     67 }
     68