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
5package net
6
7import (
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.
18func Pipe() (Conn, Conn) {
19	r1, w1 := io.Pipe()
20	r2, w2 := io.Pipe()
21
22	return &pipe{r1, w2}, &pipe{r2, w1}
23}
24
25type pipe struct {
26	*io.PipeReader
27	*io.PipeWriter
28}
29
30type pipeAddr int
31
32func (pipeAddr) Network() string {
33	return "pipe"
34}
35
36func (pipeAddr) String() string {
37	return "pipe"
38}
39
40func (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
49func (p *pipe) LocalAddr() Addr {
50	return pipeAddr(0)
51}
52
53func (p *pipe) RemoteAddr() Addr {
54	return pipeAddr(0)
55}
56
57func (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
61func (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
65func (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