aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/hashicorp/go-sockaddr/unixsock.go
blob: f3be3f67e7746eda7b7a60a84d1e5cddacba9310 (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
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
128
129
130
131
132
133
134
135
package sockaddr

import (
	"fmt"
	"strings"
)

type UnixSock struct {
	SockAddr
	path string
}
type UnixSocks []*UnixSock

// unixAttrMap is a map of the UnixSockAddr type-specific attributes.
var unixAttrMap map[AttrName]func(UnixSock) string
var unixAttrs []AttrName

func init() {
	unixAttrInit()
}

// NewUnixSock creates an UnixSock from a string path.  String can be in the
// form of either URI-based string (e.g. `file:///etc/passwd`), an absolute
// path (e.g. `/etc/passwd`), or a relative path (e.g. `./foo`).
func NewUnixSock(s string) (ret UnixSock, err error) {
	ret.path = s
	return ret, nil
}

// CmpAddress follows the Cmp() standard protocol and returns:
//
// - -1 If the receiver should sort first because its name lexically sorts before arg
// - 0 if the SockAddr arg is not a UnixSock, or is a UnixSock with the same path.
// - 1 If the argument should sort first.
func (us UnixSock) CmpAddress(sa SockAddr) int {
	usb, ok := sa.(UnixSock)
	if !ok {
		return sortDeferDecision
	}

	return strings.Compare(us.Path(), usb.Path())
}

// DialPacketArgs returns the arguments required to be passed to net.DialUnix()
// with the `unixgram` network type.
func (us UnixSock) DialPacketArgs() (network, dialArgs string) {
	return "unixgram", us.path
}

// DialStreamArgs returns the arguments required to be passed to net.DialUnix()
// with the `unix` network type.
func (us UnixSock) DialStreamArgs() (network, dialArgs string) {
	return "unix", us.path
}

// Equal returns true if a SockAddr is equal to the receiving UnixSock.
func (us UnixSock) Equal(sa SockAddr) bool {
	usb, ok := sa.(UnixSock)
	if !ok {
		return false
	}

	if us.Path() != usb.Path() {
		return false
	}

	return true
}

// ListenPacketArgs returns the arguments required to be passed to
// net.ListenUnixgram() with the `unixgram` network type.
func (us UnixSock) ListenPacketArgs() (network, dialArgs string) {
	return "unixgram", us.path
}

// ListenStreamArgs returns the arguments required to be passed to
// net.ListenUnix() with the `unix` network type.
func (us UnixSock) ListenStreamArgs() (network, dialArgs string) {
	return "unix", us.path
}

// MustUnixSock is a helper method that must return an UnixSock or panic on
// invalid input.
func MustUnixSock(addr string) UnixSock {
	us, err := NewUnixSock(addr)
	if err != nil {
		panic(fmt.Sprintf("Unable to create a UnixSock from %+q: %v", addr, err))
	}
	return us
}

// Path returns the given path of the UnixSock
func (us UnixSock) Path() string {
	return us.path
}

// String returns the path of the UnixSock
func (us UnixSock) String() string {
	return fmt.Sprintf("%+q", us.path)
}

// Type is used as a type switch and returns TypeUnix
func (UnixSock) Type() SockAddrType {
	return TypeUnix
}

// UnixSockAttrs returns a list of attributes supported by the UnixSockAddr type
func UnixSockAttrs() []AttrName {
	return unixAttrs
}

// UnixSockAttr returns a string representation of an attribute for the given
// UnixSock.
func UnixSockAttr(us UnixSock, attrName AttrName) string {
	fn, found := unixAttrMap[attrName]
	if !found {
		return ""
	}

	return fn(us)
}

// unixAttrInit is called once at init()
func unixAttrInit() {
	// Sorted for human readability
	unixAttrs = []AttrName{
		"path",
	}

	unixAttrMap = map[AttrName]func(us UnixSock) string{
		"path": func(us UnixSock) string {
			return us.Path()
		},
	}
}