forked from gallir/smart-relayer
/
listener.go
86 lines (71 loc) · 1.65 KB
/
listener.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
package lib
import (
"log"
"net"
"os"
)
type Listener struct {
config RelayerConfig
listener net.Listener
}
// MewListener check sockets and files and return a listener alread listening
func NewListener(c RelayerConfig) (l *Listener, e error) {
l = &Listener{
config: c,
}
l.clean()
connType := c.ListenScheme()
addr := c.ListenHost()
l.listener, e = net.Listen(connType, addr)
if e != nil {
l.listener = nil
log.Println("Error listening to", addr, e)
return nil, e
}
if connType == "unix" {
// Make sure is accesible for everyone
os.Chmod(addr, 0777)
}
log.Printf("Starting listening at %s for target %s", addr, c.Host())
return l, nil
}
func (l *Listener) Close() error {
if l.listener != nil {
e := l.listener.Close()
l.listener = nil
return e
}
return nil
}
func (l *Listener) Addr() net.Addr {
if l.listener != nil {
return l.listener.Addr()
}
return nil
}
func (l *Listener) Accept() (net.Conn, error) {
if l.listener == nil {
log.Panicln("Trying to accept from a closed listener")
}
return l.listener.Accept()
}
func (l *Listener) clean() {
connType := l.config.ListenScheme()
addr := l.config.ListenHost()
// Check that the socket does not exist
if connType == "unix" {
if s, err := os.Stat(addr); err == nil {
if (s.Mode() & os.ModeSocket) > 0 {
// Remove existing socket
if l.listener == nil {
// We are starting but there was a previous socket file
log.Println("Warning, removing existing socket", addr)
os.Remove(addr)
}
} else {
log.Println("socket", addr, s.Mode(), os.ModeSocket)
log.Fatalf("Socket %s exists and it's not a Unix socket", addr)
}
}
}
}