helper.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. errNoSuchInterface = errors.New("no such interface")
  11. errNoSuchMulticastInterface = errors.New("no such multicast interface")
  12. )
  13. func boolint(b bool) int {
  14. if b {
  15. return 1
  16. }
  17. return 0
  18. }
  19. func netAddrToIP4(a net.Addr) net.IP {
  20. switch v := a.(type) {
  21. case *net.UDPAddr:
  22. if ip := v.IP.To4(); ip != nil {
  23. return ip
  24. }
  25. case *net.IPAddr:
  26. if ip := v.IP.To4(); ip != nil {
  27. return ip
  28. }
  29. }
  30. return nil
  31. }
  32. func netIP4ToInterface(ip net.IP) (*net.Interface, error) {
  33. ift, err := net.Interfaces()
  34. if err != nil {
  35. return nil, err
  36. }
  37. for _, ifi := range ift {
  38. ifat, err := ifi.Addrs()
  39. if err != nil {
  40. return nil, err
  41. }
  42. for _, ifa := range ifat {
  43. switch v := ifa.(type) {
  44. case *net.IPAddr:
  45. if ip.Equal(v.IP) {
  46. return &ifi, nil
  47. }
  48. case *net.IPNet:
  49. if ip.Equal(v.IP) {
  50. return &ifi, nil
  51. }
  52. }
  53. }
  54. }
  55. return nil, errNoSuchInterface
  56. }
  57. func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) {
  58. if ifi == nil {
  59. return net.IPv4zero, nil
  60. }
  61. ifat, err := ifi.Addrs()
  62. if err != nil {
  63. return nil, err
  64. }
  65. for _, ifa := range ifat {
  66. switch v := ifa.(type) {
  67. case *net.IPAddr:
  68. if v.IP.To4() != nil {
  69. return v.IP, nil
  70. }
  71. case *net.IPNet:
  72. if v.IP.To4() != nil {
  73. return v.IP, nil
  74. }
  75. }
  76. }
  77. return nil, errNoSuchInterface
  78. }