rawconn_msg.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Copyright 2017 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. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos
  5. // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos
  6. package socket
  7. import (
  8. "net"
  9. "os"
  10. )
  11. func (c *Conn) recvMsg(m *Message, flags int) error {
  12. m.raceWrite()
  13. var (
  14. operr error
  15. n int
  16. oobn int
  17. recvflags int
  18. from net.Addr
  19. )
  20. fn := func(s uintptr) bool {
  21. n, oobn, recvflags, from, operr = recvmsg(s, m.Buffers, m.OOB, flags, c.network)
  22. return ioComplete(flags, operr)
  23. }
  24. if err := c.c.Read(fn); err != nil {
  25. return err
  26. }
  27. if operr != nil {
  28. return os.NewSyscallError("recvmsg", operr)
  29. }
  30. m.Addr = from
  31. m.N = n
  32. m.NN = oobn
  33. m.Flags = recvflags
  34. return nil
  35. }
  36. func (c *Conn) sendMsg(m *Message, flags int) error {
  37. m.raceRead()
  38. var (
  39. operr error
  40. n int
  41. )
  42. fn := func(s uintptr) bool {
  43. n, operr = sendmsg(s, m.Buffers, m.OOB, m.Addr, flags)
  44. return ioComplete(flags, operr)
  45. }
  46. if err := c.c.Write(fn); err != nil {
  47. return err
  48. }
  49. if operr != nil {
  50. return os.NewSyscallError("sendmsg", operr)
  51. }
  52. m.N = n
  53. m.NN = len(m.OOB)
  54. return nil
  55. }