socket_bsd.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // socket_bsd.go -- Socket handling specific to *BSD based systems.
  2. // Copyright 2010 The Go Authors. All rights reserved.
  3. // Use of this source code is governed by a BSD-style
  4. // license that can be found in the LICENSE file.
  5. // +build darwin dragonfly freebsd openbsd netbsd
  6. package syscall
  7. import "unsafe"
  8. const SizeofSockaddrInet4 = 16
  9. const SizeofSockaddrInet6 = 28
  10. const SizeofSockaddrUnix = 110
  11. const SizeofSockaddrDatalink = 20
  12. type RawSockaddrInet4 struct {
  13. Len uint8
  14. Family uint8
  15. Port uint16
  16. Addr [4]byte /* in_addr */
  17. Zero [8]uint8
  18. }
  19. func (sa *RawSockaddrInet4) setLen() Socklen_t {
  20. sa.Len = SizeofSockaddrInet4
  21. return SizeofSockaddrInet4
  22. }
  23. type RawSockaddrInet6 struct {
  24. Len uint8
  25. Family uint8
  26. Port uint16
  27. Flowinfo uint32
  28. Addr [16]byte /* in6_addr */
  29. Scope_id uint32
  30. }
  31. func (sa *RawSockaddrInet6) setLen() Socklen_t {
  32. sa.Len = SizeofSockaddrInet6
  33. return SizeofSockaddrInet6
  34. }
  35. type RawSockaddrUnix struct {
  36. Len uint8
  37. Family uint8
  38. Path [108]int8
  39. }
  40. func (sa *RawSockaddrUnix) setLen(n int) {
  41. sa.Len = uint8(3 + n) // 2 for Family, Len; 1 for NUL.
  42. }
  43. func (sa *RawSockaddrUnix) getLen() (int, error) {
  44. if sa.Len < 2 || sa.Len > SizeofSockaddrUnix {
  45. return 0, EINVAL
  46. }
  47. // Some BSDs include the trailing NUL in the length, whereas
  48. // others do not. Work around this by subtracting the leading
  49. // family and len. The path is then scanned to see if a NUL
  50. // terminator still exists within the length.
  51. n := int(sa.Len) - 2 // subtract leading Family, Len
  52. for i := 0; i < n; i++ {
  53. if sa.Path[i] == 0 {
  54. // found early NUL; assume Len included the NUL
  55. // or was overestimating.
  56. n = i
  57. break
  58. }
  59. }
  60. return n, nil
  61. }
  62. func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
  63. return sl
  64. }
  65. type SockaddrDatalink struct {
  66. Len uint8
  67. Family uint8
  68. Index uint16
  69. Type uint8
  70. Nlen uint8
  71. Alen uint8
  72. Slen uint8
  73. Data [12]int8
  74. raw RawSockaddrDatalink
  75. }
  76. func (sa *SockaddrDatalink) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
  77. if sa.Index == 0 {
  78. return nil, 0, EINVAL
  79. }
  80. sa.raw.Len = sa.Len
  81. sa.raw.Family = AF_LINK
  82. sa.raw.Index = sa.Index
  83. sa.raw.Type = sa.Type
  84. sa.raw.Nlen = sa.Nlen
  85. sa.raw.Alen = sa.Alen
  86. sa.raw.Slen = sa.Slen
  87. for i := 0; i < len(sa.raw.Data); i++ {
  88. sa.raw.Data[i] = sa.Data[i]
  89. }
  90. return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), SizeofSockaddrDatalink, nil
  91. }
  92. type RawSockaddrDatalink struct {
  93. Len uint8
  94. Family uint8
  95. Index uint16
  96. Type uint8
  97. Nlen uint8
  98. Alen uint8
  99. Slen uint8
  100. Data [12]int8
  101. }
  102. type RawSockaddr struct {
  103. Len uint8
  104. Family uint8
  105. Data [14]int8
  106. }
  107. // BindToDevice binds the socket associated with fd to device.
  108. func BindToDevice(fd int, device string) (err error) {
  109. return ENOSYS
  110. }
  111. func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {
  112. return nil, EAFNOSUPPORT
  113. }
  114. func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) {
  115. var value IPv6MTUInfo
  116. vallen := Socklen_t(SizeofIPv6MTUInfo)
  117. err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
  118. return &value, err
  119. }