rawconn_msg.go raw

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