OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / net / internal / socket / rawconn_msg.go
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 // +build go1.9
6 // +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
7
8 package socket
9
10 import (
11         "os"
12         "syscall"
13 )
14
15 func (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
51 func (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 }