@@ -97,21 +97,26 @@ func parseMessages(msgs []netlink.Message, proto int) ([]Socket, error) {
9797 return sockets , nil
9898}
9999
100- func List () ([]Socket , error ) {
101- // open NETLINK_INET_DIAG once and reuse
102- var sockets []Socket
100+ func NewLister () (* Lister , error ) {
103101 conn , err := netlink .Dial (unix .NETLINK_SOCK_DIAG , nil )
104102 if err != nil {
105- return sockets , fmt .Errorf ("failed to open netlink connection: %w" , err )
103+ return nil , fmt .Errorf ("failed to open netlink connection: %w" , err )
106104 }
107- defer conn .Close ()
105+ return & Lister {conn : conn }, nil
106+ }
107+
108+ type Lister struct {
109+ conn * netlink.Conn
110+ }
108111
112+ func (lister * Lister ) List () ([]Socket , error ) {
109113 protos := []int {unix .IPPROTO_TCP , unix .IPPROTO_UDP }
110114 families := []int {unix .AF_INET , unix .AF_INET6 }
111115
116+ var sockets []Socket
112117 for _ , proto := range protos {
113118 for _ , fam := range families {
114- msgs , err := query (conn , fam , proto )
119+ msgs , err := query (lister . conn , fam , proto )
115120 if err != nil {
116121 continue
117122 }
@@ -124,3 +129,7 @@ func List() ([]Socket, error) {
124129 }
125130 return sockets , nil
126131}
132+
133+ func (lister * Lister ) Close () error {
134+ return lister .conn .Close ()
135+ }
0 commit comments