blob: b21d2e6418dfd5c80aa3019a3b95a0bb18536aa8 [file] [log] [blame]
David K. Bainbridge215e0242017-09-05 23:18:24 -07001// 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// +build go1.9
6// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
7
8package socket
9
10import (
11 "os"
12 "syscall"
13)
14
15func (c *Conn) recvMsg(m *Message, flags int) error {
16 var h msghdr
17 vs := make([]iovec, len(m.Buffers))
18 var sa []byte
19 if c.network != "tcp" {
20 sa = make([]byte, sizeofSockaddrInet6)
21 }
22 h.pack(vs, m.Buffers, m.OOB, sa)
23 var operr error
24 var n int
25 fn := func(s uintptr) bool {
26 n, operr = recvmsg(s, &h, flags)
27 if operr == syscall.EAGAIN {
28 return false
29 }
30 return true
31 }
32 if err := c.c.Read(fn); err != nil {
33 return err
34 }
35 if operr != nil {
36 return os.NewSyscallError("recvmsg", operr)
37 }
38 if c.network != "tcp" {
39 var err error
40 m.Addr, err = parseInetAddr(sa[:], c.network)
41 if err != nil {
42 return err
43 }
44 }
45 m.N = n
46 m.NN = h.controllen()
47 m.Flags = h.flags()
48 return nil
49}
50
51func (c *Conn) sendMsg(m *Message, flags int) error {
52 var h msghdr
53 vs := make([]iovec, len(m.Buffers))
54 var sa []byte
55 if m.Addr != nil {
56 sa = marshalInetAddr(m.Addr)
57 }
58 h.pack(vs, m.Buffers, m.OOB, sa)
59 var operr error
60 var n int
61 fn := func(s uintptr) bool {
62 n, operr = sendmsg(s, &h, flags)
63 if operr == syscall.EAGAIN {
64 return false
65 }
66 return true
67 }
68 if err := c.c.Write(fn); err != nil {
69 return err
70 }
71 if operr != nil {
72 return os.NewSyscallError("sendmsg", operr)
73 }
74 m.N = n
75 m.NN = len(m.OOB)
76 return nil
77}