Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

293 rindas
6.5 KiB

  1. // Copyright 2009 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. // +build darwin dragonfly freebsd linux netbsd openbsd solaris
  5. package unix
  6. import (
  7. "runtime"
  8. "sync"
  9. "syscall"
  10. "unsafe"
  11. )
  12. var (
  13. Stdin = 0
  14. Stdout = 1
  15. Stderr = 2
  16. )
  17. const (
  18. darwin64Bit = runtime.GOOS == "darwin" && sizeofPtr == 8
  19. dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8
  20. netbsd32Bit = runtime.GOOS == "netbsd" && sizeofPtr == 4
  21. )
  22. // Do the interface allocations only once for common
  23. // Errno values.
  24. var (
  25. errEAGAIN error = syscall.EAGAIN
  26. errEINVAL error = syscall.EINVAL
  27. errENOENT error = syscall.ENOENT
  28. )
  29. // errnoErr returns common boxed Errno values, to prevent
  30. // allocations at runtime.
  31. func errnoErr(e syscall.Errno) error {
  32. switch e {
  33. case 0:
  34. return nil
  35. case EAGAIN:
  36. return errEAGAIN
  37. case EINVAL:
  38. return errEINVAL
  39. case ENOENT:
  40. return errENOENT
  41. }
  42. return e
  43. }
  44. // Mmap manager, for use by operating system-specific implementations.
  45. type mmapper struct {
  46. sync.Mutex
  47. active map[*byte][]byte // active mappings; key is last byte in mapping
  48. mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)
  49. munmap func(addr uintptr, length uintptr) error
  50. }
  51. func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
  52. if length <= 0 {
  53. return nil, EINVAL
  54. }
  55. // Map the requested memory.
  56. addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset)
  57. if errno != nil {
  58. return nil, errno
  59. }
  60. // Slice memory layout
  61. var sl = struct {
  62. addr uintptr
  63. len int
  64. cap int
  65. }{addr, length, length}
  66. // Use unsafe to turn sl into a []byte.
  67. b := *(*[]byte)(unsafe.Pointer(&sl))
  68. // Register mapping in m and return it.
  69. p := &b[cap(b)-1]
  70. m.Lock()
  71. defer m.Unlock()
  72. m.active[p] = b
  73. return b, nil
  74. }
  75. func (m *mmapper) Munmap(data []byte) (err error) {
  76. if len(data) == 0 || len(data) != cap(data) {
  77. return EINVAL
  78. }
  79. // Find the base of the mapping.
  80. p := &data[cap(data)-1]
  81. m.Lock()
  82. defer m.Unlock()
  83. b := m.active[p]
  84. if b == nil || &b[0] != &data[0] {
  85. return EINVAL
  86. }
  87. // Unmap the memory and update m.
  88. if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil {
  89. return errno
  90. }
  91. delete(m.active, p)
  92. return nil
  93. }
  94. func Read(fd int, p []byte) (n int, err error) {
  95. n, err = read(fd, p)
  96. if raceenabled {
  97. if n > 0 {
  98. raceWriteRange(unsafe.Pointer(&p[0]), n)
  99. }
  100. if err == nil {
  101. raceAcquire(unsafe.Pointer(&ioSync))
  102. }
  103. }
  104. return
  105. }
  106. func Write(fd int, p []byte) (n int, err error) {
  107. if raceenabled {
  108. raceReleaseMerge(unsafe.Pointer(&ioSync))
  109. }
  110. n, err = write(fd, p)
  111. if raceenabled && n > 0 {
  112. raceReadRange(unsafe.Pointer(&p[0]), n)
  113. }
  114. return
  115. }
  116. // For testing: clients can set this flag to force
  117. // creation of IPv6 sockets to return EAFNOSUPPORT.
  118. var SocketDisableIPv6 bool
  119. type Sockaddr interface {
  120. sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs
  121. }
  122. type SockaddrInet4 struct {
  123. Port int
  124. Addr [4]byte
  125. raw RawSockaddrInet4
  126. }
  127. type SockaddrInet6 struct {
  128. Port int
  129. ZoneId uint32
  130. Addr [16]byte
  131. raw RawSockaddrInet6
  132. }
  133. type SockaddrUnix struct {
  134. Name string
  135. raw RawSockaddrUnix
  136. }
  137. func Bind(fd int, sa Sockaddr) (err error) {
  138. ptr, n, err := sa.sockaddr()
  139. if err != nil {
  140. return err
  141. }
  142. return bind(fd, ptr, n)
  143. }
  144. func Connect(fd int, sa Sockaddr) (err error) {
  145. ptr, n, err := sa.sockaddr()
  146. if err != nil {
  147. return err
  148. }
  149. return connect(fd, ptr, n)
  150. }
  151. func Getpeername(fd int) (sa Sockaddr, err error) {
  152. var rsa RawSockaddrAny
  153. var len _Socklen = SizeofSockaddrAny
  154. if err = getpeername(fd, &rsa, &len); err != nil {
  155. return
  156. }
  157. return anyToSockaddr(&rsa)
  158. }
  159. func GetsockoptInt(fd, level, opt int) (value int, err error) {
  160. var n int32
  161. vallen := _Socklen(4)
  162. err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
  163. return int(n), err
  164. }
  165. func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
  166. var rsa RawSockaddrAny
  167. var len _Socklen = SizeofSockaddrAny
  168. if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil {
  169. return
  170. }
  171. if rsa.Addr.Family != AF_UNSPEC {
  172. from, err = anyToSockaddr(&rsa)
  173. }
  174. return
  175. }
  176. func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) {
  177. ptr, n, err := to.sockaddr()
  178. if err != nil {
  179. return err
  180. }
  181. return sendto(fd, p, flags, ptr, n)
  182. }
  183. func SetsockoptByte(fd, level, opt int, value byte) (err error) {
  184. return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1)
  185. }
  186. func SetsockoptInt(fd, level, opt int, value int) (err error) {
  187. var n = int32(value)
  188. return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4)
  189. }
  190. func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) {
  191. return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4)
  192. }
  193. func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) {
  194. return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq)
  195. }
  196. func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) {
  197. return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq)
  198. }
  199. func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error {
  200. return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter)
  201. }
  202. func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) {
  203. return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger)
  204. }
  205. func SetsockoptString(fd, level, opt int, s string) (err error) {
  206. return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), uintptr(len(s)))
  207. }
  208. func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) {
  209. return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv))
  210. }
  211. func Socket(domain, typ, proto int) (fd int, err error) {
  212. if domain == AF_INET6 && SocketDisableIPv6 {
  213. return -1, EAFNOSUPPORT
  214. }
  215. fd, err = socket(domain, typ, proto)
  216. return
  217. }
  218. func Socketpair(domain, typ, proto int) (fd [2]int, err error) {
  219. var fdx [2]int32
  220. err = socketpair(domain, typ, proto, &fdx)
  221. if err == nil {
  222. fd[0] = int(fdx[0])
  223. fd[1] = int(fdx[1])
  224. }
  225. return
  226. }
  227. func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
  228. if raceenabled {
  229. raceReleaseMerge(unsafe.Pointer(&ioSync))
  230. }
  231. return sendfile(outfd, infd, offset, count)
  232. }
  233. var ioSync int64
  234. func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) }
  235. func SetNonblock(fd int, nonblocking bool) (err error) {
  236. flag, err := fcntl(fd, F_GETFL, 0)
  237. if err != nil {
  238. return err
  239. }
  240. if nonblocking {
  241. flag |= O_NONBLOCK
  242. } else {
  243. flag &= ^O_NONBLOCK
  244. }
  245. _, err = fcntl(fd, F_SETFL, flag)
  246. return err
  247. }