/
mxlist.go
63 lines (56 loc) · 1.13 KB
/
mxlist.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
package gosmtpmx
import (
"math/rand"
"net"
"sort"
"time"
)
type MXlist map[uint16]*[]*net.MX
// NewMXList returns MXlist that groups []*net.MX by preference.
func NewMXList(rrs []*net.MX) MXlist {
list := make(MXlist)
for _, rr := range rrs {
if _, ok := list[rr.Pref]; !ok {
list[rr.Pref] = &[]*net.MX{rr}
continue
}
*list[rr.Pref] = append(*list[rr.Pref], rr)
}
return list
}
func NewImplicitMXList(name string) MXlist {
rrs := []*net.MX{
&net.MX{
Host: name,
Pref: 0,
},
}
return NewMXList(rrs)
}
// Shuffle shuffles MX RR between same preference in MXlist
func (list *MXlist) Shuffle() {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
// stretch...
r.Perm(1000)
for pref := range *list {
rrs := (*list)[pref]
for i, p := range r.Perm(len(*rrs)) {
cur := (*rrs)[i]
(*rrs)[i] = (*rrs)[p]
(*rrs)[p] = cur
}
}
}
// Prefs returns sorted preferences
func (list *MXlist) Prefs() []uint16 {
prefs := sort.IntSlice{}
for pref := range *list {
prefs = append(prefs, int(pref))
}
prefs.Sort()
ret := []uint16{}
for _, pref := range prefs {
ret = append(ret, uint16(pref))
}
return ret
}