summaryrefslogtreecommitdiffstats
path: root/plugin/rpcplugin/ipc.go
blob: bbb3db06e8885bcc392d1dda9974d2b2d3c1493e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package rpcplugin

import (
	"io"
	"os"
)

// Returns a new IPC for the parent process and a set of files to pass on to the child.
//
// The returned files must be closed after the child process is started.
func NewIPC() (io.ReadWriteCloser, []*os.File, error) {
	parentReader, childWriter, err := os.Pipe()
	if err != nil {
		return nil, nil, err
	}
	childReader, parentWriter, err := os.Pipe()
	if err != nil {
		parentReader.Close()
		childWriter.Close()
		return nil, nil, err
	}
	return NewReadWriteCloser(NewAsyncReadCloser(parentReader), NewAsyncWriteCloser(parentWriter)), []*os.File{childReader, childWriter}, nil
}

// Returns the IPC instance inherited by the process from its parent.
func InheritedIPC(fd0, fd1 uintptr) (io.ReadWriteCloser, error) {
	return NewReadWriteCloser(os.NewFile(fd0, ""), os.NewFile(fd1, "")), nil
}