Source file
src/net/rawconn.go
1
2
3
4
5 package net
6
7 import (
8 "runtime"
9 "syscall"
10 )
11
12
13
14
15
16
17
18
19
20
21 type rawConn struct {
22 fd *netFD
23 }
24
25 func (c *rawConn) ok() bool { return c != nil && c.fd != nil }
26
27 func (c *rawConn) Control(f func(uintptr)) error {
28 if !c.ok() {
29 return syscall.EINVAL
30 }
31 err := c.fd.pfd.RawControl(f)
32 runtime.KeepAlive(c.fd)
33 if err != nil {
34 err = &OpError{Op: "raw-control", Net: c.fd.net, Source: nil, Addr: c.fd.laddr, Err: err}
35 }
36 return err
37 }
38
39 func (c *rawConn) Read(f func(uintptr) bool) error {
40 if !c.ok() {
41 return syscall.EINVAL
42 }
43 err := c.fd.pfd.RawRead(f)
44 runtime.KeepAlive(c.fd)
45 if err != nil {
46 err = &OpError{Op: "raw-read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
47 }
48 return err
49 }
50
51 func (c *rawConn) Write(f func(uintptr) bool) error {
52 if !c.ok() {
53 return syscall.EINVAL
54 }
55 err := c.fd.pfd.RawWrite(f)
56 runtime.KeepAlive(c.fd)
57 if err != nil {
58 err = &OpError{Op: "raw-write", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
59 }
60 return err
61 }
62
63 func newRawConn(fd *netFD) (*rawConn, error) {
64 return &rawConn{fd: fd}, nil
65 }
66
67 type rawListener struct {
68 rawConn
69 }
70
71 func (l *rawListener) Read(func(uintptr) bool) error {
72 return syscall.EINVAL
73 }
74
75 func (l *rawListener) Write(func(uintptr) bool) error {
76 return syscall.EINVAL
77 }
78
79 func newRawListener(fd *netFD) (*rawListener, error) {
80 return &rawListener{rawConn{fd: fd}}, nil
81 }
82
View as plain text