github.com/sagernet/sing@v0.2.6/common/control/bind_finder.go (about)

     1  package control
     2  
     3  import "net"
     4  
     5  type InterfaceFinder interface {
     6  	InterfaceIndexByName(name string) (int, error)
     7  	InterfaceNameByIndex(index int) (string, error)
     8  }
     9  
    10  func DefaultInterfaceFinder() InterfaceFinder {
    11  	return (*netInterfaceFinder)(nil)
    12  }
    13  
    14  type netInterfaceFinder struct{}
    15  
    16  func (w *netInterfaceFinder) InterfaceIndexByName(name string) (int, error) {
    17  	netInterface, err := net.InterfaceByName(name)
    18  	if err != nil {
    19  		return 0, err
    20  	}
    21  	return netInterface.Index, nil
    22  }
    23  
    24  func (w *netInterfaceFinder) InterfaceNameByIndex(index int) (string, error) {
    25  	netInterface, err := net.InterfaceByIndex(index)
    26  	if err != nil {
    27  		return "", err
    28  	}
    29  	return netInterface.Name, nil
    30  }