-
Notifications
You must be signed in to change notification settings - Fork 4
/
unix_addr.go
127 lines (110 loc) · 2.7 KB
/
unix_addr.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package flagvar
import (
"fmt"
"strings"
"net"
)
// UnixAddr is a `flag.Value` for Unix addresses.
// The `Network` field is used if set, otherwise "unix".
type UnixAddr struct {
Network string
Value *net.UnixAddr
Text string
}
// Help returns a string suitable for inclusion in a flag help message.
func (fv *UnixAddr) Help() string {
return "a UNIX domain socket address"
}
// Set is flag.Value.Set
func (fv *UnixAddr) Set(v string) error {
network := "unix"
if fv.Network != "" {
network = fv.Network
}
unixAddr, err := net.ResolveUnixAddr(network, v)
if err != nil {
return err
}
fv.Text = v
fv.Value = unixAddr
return nil
}
func (fv *UnixAddr) String() string {
return fv.Text
}
// UnixAddrs is a `flag.Value` for UnixAddr addresses.
// The `Network` field is used if set, otherwise "unix".
type UnixAddrs struct {
Network string
Values []*net.UnixAddr
Texts []string
}
// Help returns a string suitable for inclusion in a flag help message.
func (fv *UnixAddrs) Help() string {
return "a UNIX domain socket address"
}
// Set is flag.Value.Set
func (fv *UnixAddrs) Set(v string) error {
network := "unix"
if fv.Network != "" {
network = fv.Network
}
unixAddr, err := net.ResolveUnixAddr(network, v)
if err != nil {
return err
}
fv.Texts = append(fv.Texts, v)
fv.Values = append(fv.Values, unixAddr)
return nil
}
func (fv *UnixAddrs) String() string {
return strings.Join(fv.Texts, ",")
}
// UnixAddrsCSV is a `flag.Value` for UnixAddr addresses.
// The `Network` field is used if set, otherwise "unix".
// If `Accumulate` is set, the values of all instances of the flag are accumulated.
// The `Separator` field is used instead of the comma when set.
type UnixAddrsCSV struct {
Network string
Separator string
Accumulate bool
Values []*net.UnixAddr
Texts []string
}
// Help returns a string suitable for inclusion in a flag help message.
func (fv *UnixAddrsCSV) Help() string {
separator := ","
if fv.Separator != "" {
separator = fv.Separator
}
return fmt.Sprintf("%q-separated list of UNIX domain socket addresses", separator)
}
// Set is flag.Value.Set
func (fv *UnixAddrsCSV) Set(v string) error {
network := "unix"
if fv.Network != "" {
network = fv.Network
}
separator := fv.Separator
if separator == "" {
separator = ","
}
if !fv.Accumulate {
fv.Values = fv.Values[:0]
fv.Texts = fv.Texts[:0]
}
parts := strings.Split(v, separator)
for _, part := range parts {
part = strings.TrimSpace(part)
unixAddr, err := net.ResolveUnixAddr(network, part)
if err != nil {
return err
}
fv.Texts = append(fv.Texts, part)
fv.Values = append(fv.Values, unixAddr)
}
return nil
}
func (fv *UnixAddrsCSV) String() string {
return strings.Join(fv.Texts, ",")
}