Files
indra/pkg/proc/opts/normalize/addresses.go

70 lines
1.6 KiB
Go

package normalize
import (
"net"
"strconv"
"github.com/indra-labs/indra"
log2 "github.com/indra-labs/indra/pkg/proc/log"
)
var (
log = log2.GetLogger(indra.PathBase)
check = log.E.Chk
)
// Address returns addr with the passed default port appended if there is not
// already a port specified.
func Address(addr, defaultPort string, userOnly bool) (a string, e error) {
var p string
a, p, e = net.SplitHostPort(addr)
if log.E.Chk(e) || p == "" {
return net.JoinHostPort(a, defaultPort), e
}
if userOnly {
p = ClampPortRange(p, defaultPort, 1024, 65535)
} else {
p = ClampPortRange(p, defaultPort, 1, 65535)
}
return net.JoinHostPort(a, p), e
}
// Addresses returns a new slice with all the passed peer addresses normalized
// with the given default port, and all duplicates removed.
func Addresses(addrs []string, defaultPort string, userOnly bool) (a []string,
e error) {
for i := range addrs {
addrs[i], e = Address(addrs[i], defaultPort, userOnly)
}
a = RemoveDuplicateAddresses(addrs)
return
}
// RemoveDuplicateAddresses returns a new slice with all duplicate entries in
// addrs removed.
func RemoveDuplicateAddresses(addrs []string) (result []string) {
result = make([]string, 0, len(addrs))
seen := map[string]struct{}{}
for _, val := range addrs {
if _, ok := seen[val]; !ok {
result = append(result, val)
seen[val] = struct{}{}
}
}
return result
}
func ClampPortRange(port, defaultPort string, min, max int) string {
p, err := strconv.Atoi(port)
if err != nil {
return defaultPort
}
if p < min {
port = strconv.FormatInt(int64(min), 10)
} else if p > max {
port = strconv.FormatInt(int64(max), 10)
}
return port
}