diff --git a/portlist/portlist.go b/portlist/portlist.go index 3b9d6d76c..921f92066 100644 --- a/portlist/portlist.go +++ b/portlist/portlist.go @@ -6,6 +6,7 @@ package portlist import ( "fmt" + "sort" "strings" ) @@ -76,6 +77,7 @@ func GetList(prev List) (List, error) { if err != nil { return nil, fmt.Errorf("listPorts: %s", err) } + pl = sortAndDedup(pl) if pl.sameInodes(prev) { // Nothing changed, skip inode lookup return prev, nil @@ -86,3 +88,22 @@ func GetList(prev List) (List, error) { } return pl, nil } + +// sortAndDedup sorts ps in place (by Port.lessThan) and then returns +// a subset of it with duplicate (Proto, Port) removed. +func sortAndDedup(ps List) List { + sort.Slice(ps, func(i, j int) bool { + return (&ps[i]).lessThan(&ps[j]) + }) + out := ps[:0] + var last Port + for _, p := range ps { + protoPort := Port{Proto: p.Proto, Port: p.Port} + if last == protoPort { + continue + } + out = append(out, p) + last = protoPort + } + return out +} diff --git a/portlist/portlist_linux.go b/portlist/portlist_linux.go index ab7d3b98b..6488c4933 100644 --- a/portlist/portlist_linux.go +++ b/portlist/portlist_linux.go @@ -12,7 +12,6 @@ import ( "os" "path/filepath" "runtime" - "sort" "strconv" "strings" "syscall" @@ -71,11 +70,6 @@ func listPorts() (List, error) { l = append(l, ports...) } - - sort.Slice(l, func(i, j int) bool { - return (&l[i]).lessThan(&l[j]) - }) - return l, nil }