From c1bfa9934849aa7934f14dd1a9e24780530855fc Mon Sep 17 00:00:00 2001 From: Andrea Barberio Date: Thu, 29 Nov 2018 16:42:08 +0000 Subject: interfaces: added package with interface facilities --- interfaces/interfaces.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 interfaces/interfaces.go (limited to 'interfaces/interfaces.go') diff --git a/interfaces/interfaces.go b/interfaces/interfaces.go new file mode 100644 index 0000000..5761669 --- /dev/null +++ b/interfaces/interfaces.go @@ -0,0 +1,41 @@ +package interfaces + +import "net" + +// InterfaceMatcher is a function type used to match the interfaces we want. See +// GetInterfacesFunc below for usage. +type InterfaceMatcher func(net.Interface) bool + +// interfaceGetter is used for testing purposes +var interfaceGetter = net.Interfaces + +// GetInterfacesFunc loops through the available network interfaces, and returns +// a list of interfaces for which the passed InterfaceMatcher function returns +// true. +func GetInterfacesFunc(matcher InterfaceMatcher) ([]net.Interface, error) { + ifaces, err := interfaceGetter() + if err != nil { + return nil, err + } + ret := make([]net.Interface, 0) + for _, iface := range ifaces { + if matcher(iface) { + ret = append(ret, iface) + } + } + return ret, nil +} + +// GetLoopbackInterfaces returns a list of loopback interfaces. +func GetLoopbackInterfaces() ([]net.Interface, error) { + return GetInterfacesFunc(func(iface net.Interface) bool { + return iface.Flags&net.FlagLoopback != 0 + }) +} + +// GetNonLoopbackInterfaces returns a list of non-loopback interfaces. +func GetNonLoopbackInterfaces() ([]net.Interface, error) { + return GetInterfacesFunc(func(iface net.Interface) bool { + return iface.Flags&net.FlagLoopback == 0 + }) +} -- cgit v1.2.3