helper.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2012 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package ipv4
  5. import (
  6. "errors"
  7. "net"
  8. )
  9. var (
  10. errOpNoSupport = errors.New("operation not supported")
  11. errNoSuchInterface = errors.New("no such interface")
  12. errNoSuchMulticastInterface = errors.New("no such multicast interface")
  13. )
  14. func boolint(b bool) int {
  15. if b {
  16. return 1
  17. }
  18. return 0
  19. }
  20. func netAddrToIP4(a net.Addr) net.IP {
  21. switch v := a.(type) {
  22. case *net.UDPAddr:
  23. if ip := v.IP.To4(); ip != nil {
  24. return ip
  25. }
  26. case *net.IPAddr:
  27. if ip := v.IP.To4(); ip != nil {
  28. return ip
  29. }
  30. }
  31. return nil
  32. }
  33. func netIP4ToInterface(ip net.IP) (*net.Interface, error) {
  34. ift, err := net.Interfaces()
  35. if err != nil {
  36. return nil, err
  37. }
  38. for _, ifi := range ift {
  39. ifat, err := ifi.Addrs()
  40. if err != nil {
  41. return nil, err
  42. }
  43. for _, ifa := range ifat {
  44. switch v := ifa.(type) {
  45. case *net.IPAddr:
  46. if ip.Equal(v.IP) {
  47. return &ifi, nil
  48. }
  49. case *net.IPNet:
  50. if ip.Equal(v.IP) {
  51. return &ifi, nil
  52. }
  53. }
  54. }
  55. }
  56. return nil, errNoSuchInterface
  57. }
  58. func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) {
  59. if ifi == nil {
  60. return net.IPv4zero, nil
  61. }
  62. ifat, err := ifi.Addrs()
  63. if err != nil {
  64. return nil, err
  65. }
  66. for _, ifa := range ifat {
  67. switch v := ifa.(type) {
  68. case *net.IPAddr:
  69. if v.IP.To4() != nil {
  70. return v.IP, nil
  71. }
  72. case *net.IPNet:
  73. if v.IP.To4() != nil {
  74. return v.IP, nil
  75. }
  76. }
  77. }
  78. return nil, errNoSuchInterface
  79. }