OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / net / internal / socket / rawconn.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
7 package socket
8
9 import (
10         "errors"
11         "net"
12         "os"
13         "syscall"
14 )
15
16 // A Conn represents a raw connection.
17 type Conn struct {
18         network string
19         c       syscall.RawConn
20 }
21
22 // NewConn returns a new raw connection.
23 func NewConn(c net.Conn) (*Conn, error) {
24         var err error
25         var cc Conn
26         switch c := c.(type) {
27         case *net.TCPConn:
28                 cc.network = "tcp"
29                 cc.c, err = c.SyscallConn()
30         case *net.UDPConn:
31                 cc.network = "udp"
32                 cc.c, err = c.SyscallConn()
33         case *net.IPConn:
34                 cc.network = "ip"
35                 cc.c, err = c.SyscallConn()
36         default:
37                 return nil, errors.New("unknown connection type")
38         }
39         if err != nil {
40                 return nil, err
41         }
42         return &cc, nil
43 }
44
45 func (o *Option) get(c *Conn, b []byte) (int, error) {
46         var operr error
47         var n int
48         fn := func(s uintptr) {
49                 n, operr = getsockopt(s, o.Level, o.Name, b)
50         }
51         if err := c.c.Control(fn); err != nil {
52                 return 0, err
53         }
54         return n, os.NewSyscallError("getsockopt", operr)
55 }
56
57 func (o *Option) set(c *Conn, b []byte) error {
58         var operr error
59         fn := func(s uintptr) {
60                 operr = setsockopt(s, o.Level, o.Name, b)
61         }
62         if err := c.c.Control(fn); err != nil {
63                 return err
64         }
65         return os.NewSyscallError("setsockopt", operr)
66 }