blob: d6871d55f7268745a81e7454f6c33d16deab0608 [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
7package socket
8
9import (
10 "errors"
11 "net"
12 "os"
13 "syscall"
14)
15
16// A Conn represents a raw connection.
17type Conn struct {
18 network string
19 c syscall.RawConn
20}
21
22// NewConn returns a new raw connection.
23func 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
45func (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
57func (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}