summaryrefslogtreecommitdiffstats
path: root/plugin/rpcplugin/main.go
blob: 241d70bc956138351d2983ab29f37467e4ef9368 (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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package rpcplugin

import (
	"bufio"
	"encoding/binary"
	"fmt"
	"log"
	"os"
)

// Makes a set of hooks available via RPC. This function never returns.
func Main(hooks interface{}) {
	ipc, err := InheritedProcessIPC()
	if err != nil {
		log.Fatal(err.Error())
	}
	muxer := NewMuxer(ipc, true)
	id, conn := muxer.Serve()
	buf := make([]byte, 11)
	buf[0] = 0
	n := binary.PutVarint(buf[1:], id)
	if _, err := muxer.Write(buf[:1+n]); err != nil {
		log.Fatal(err.Error())
	}
	ServeHooks(hooks, conn, muxer)
	os.Exit(0)
}

// Returns the hooks being served by a call to Main.
func ConnectMain(muxer *Muxer) (*RemoteHooks, error) {
	buf := make([]byte, 1)
	if _, err := muxer.Read(buf); err != nil {
		return nil, err
	} else if buf[0] != 0 {
		return nil, fmt.Errorf("unexpected control byte")
	}
	reader := bufio.NewReader(muxer)
	id, err := binary.ReadVarint(reader)
	if err != nil {
		return nil, err
	}

	return ConnectHooks(muxer.Connect(id), muxer)
}