rawconn_msg.go 1.2 KB

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