-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtransport.go
105 lines (87 loc) · 2.19 KB
/
transport.go
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package xenstore
import (
"io"
"net"
"os"
)
// Transport is an interface for sending and receiving data from XenStore.
type Transport interface {
// Send a packet to the XenStore backend.
Send(*Packet) error
// Receive a packet from the XenStore backend.
Receive() (*Packet, error)
// Close if required by the underlying implementation.
Close() error
}
// ReadWriteTransport is an implementation of the Transport interface which works for any
// io.ReadWriteCloser..
type ReadWriteTransport struct {
rw io.ReadWriteCloser
open bool
}
func (r *ReadWriteTransport) Close() error {
if r.open {
r.open = false
return r.rw.Close()
}
// Possibly this should return an error as it is already closed
return nil
}
func (r *ReadWriteTransport) Send(p *Packet) error {
if !r.open {
panic("Send on closed transport")
}
return p.Pack(r.rw)
}
func (r *ReadWriteTransport) Receive() (*Packet, error) {
if !r.open {
panic("Receive on closed transport")
}
p := &Packet{}
return p, p.Unpack(r.rw)
}
// Check if the underlying io.ReadWriteCloser has been closed yet.
func (r *ReadWriteTransport) IsOpen() bool {
return r.open
}
// UnixSocketTransport is an implementation of Transport which sends/receives data from
// XenStore using a unix socket.
type UnixSocketTransport struct {
*ReadWriteTransport
Path string
}
// NewUnixSocketTransport creates a new connected UnixSocketTransport.
func NewUnixSocketTransport(path string) (*UnixSocketTransport, error) {
c, err := net.Dial("unix", path)
if err != nil {
return nil, err
}
return &UnixSocketTransport{
&ReadWriteTransport{
rw: c,
open: true,
},
path,
}, nil
}
// XenBusTransport is an implementation of Transport which sends/receives data from
// XenStore using the special XenBus device on Linux (and possibly other Unix operating
// systems)
type XenBusTransport struct {
*ReadWriteTransport
Path string
}
// Create a new connected XenBusTransport.
func NewXenBusTransport(path string) (*XenBusTransport, error) {
file, err := os.OpenFile(path, os.O_RDWR, os.ModeCharDevice|os.ModePerm)
if err != nil {
return nil, err
}
return &XenBusTransport{
&ReadWriteTransport{
rw: file,
open: true,
},
path,
}, nil
}