-
Notifications
You must be signed in to change notification settings - Fork 9
/
netpoll_windows_checklinkname0.go
154 lines (116 loc) · 3.63 KB
/
netpoll_windows_checklinkname0.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//go:build windows && (!go1.23 || (go1.23 && tfogo_checklinkname0))
package tfo
import (
"net"
"sync"
"time"
_ "unsafe"
"golang.org/x/sys/windows"
)
//go:linkname execIO internal/poll.execIO
func execIO(o *operation, submit func(o *operation) error) (int, error)
// pFD is a file descriptor. The net and os packages embed this type in
// a larger type representing a network connection or OS file.
//
// Stay in sync with FD in src/internal/poll/fd_windows.go
type pFD struct {
fdmuS uint64
fdmuR uint32
fdmuW uint32
// System file descriptor. Immutable until Close.
Sysfd windows.Handle
// Read operation.
rop operation
// Write operation.
wop operation
// I/O poller.
pd uintptr
// Used to implement pread/pwrite.
l sync.Mutex
// For console I/O.
lastbits []byte // first few bytes of the last incomplete rune in last write
readuint16 []uint16 // buffer to hold uint16s obtained with ReadConsole
readbyte []byte // buffer to hold decoding of readuint16 from utf16 to utf8
readbyteOffset int // readbyte[readOffset:] is yet to be consumed with file.Read
// Semaphore signaled when file is closed.
csema uint32
skipSyncNotif bool
// Whether this is a streaming descriptor, as opposed to a
// packet-based descriptor like a UDP socket.
IsStream bool
// Whether a zero byte read indicates EOF. This is false for a
// message based socket connection.
ZeroReadIsEOF bool
// Whether this is a file rather than a network socket.
isFile bool
// The kind of this file.
kind byte
}
func (fd *pFD) ConnectEx(ra windows.Sockaddr, b []byte) (n int, err error) {
n, err = execIO(&fd.wop, func(o *operation) error {
return windows.ConnectEx(o.fd.Sysfd, ra, &b[0], uint32(len(b)), &o.qty, &o.o)
})
return
}
// Network file descriptor.
//
// Copied from src/net/fd_posix.go
type netFD struct {
pfd pFD
// immutable until Close
family int
sotype int
isConnected bool // handshake completed or use of association with peer
net string
laddr net.Addr
raddr net.Addr
}
//go:linkname newFD net.newFD
func newFD(sysfd windows.Handle, family, sotype int, net string) (*netFD, error)
//go:linkname netFDInit net.(*netFD).init
func netFDInit(fd *netFD) error
//go:linkname netFDClose net.(*netFD).Close
func netFDClose(fd *netFD) error
//go:linkname netFDCtrlNetwork net.(*netFD).ctrlNetwork
func netFDCtrlNetwork(fd *netFD) string
//go:linkname netFDWrite net.(*netFD).Write
func netFDWrite(fd *netFD, p []byte) (int, error)
//go:linkname netFDSetWriteDeadline net.(*netFD).SetWriteDeadline
func netFDSetWriteDeadline(fd *netFD, t time.Time) error
func (fd *netFD) init() error {
return netFDInit(fd)
}
func (fd *netFD) Close() error {
return netFDClose(fd)
}
func (fd *netFD) ctrlNetwork() string {
return netFDCtrlNetwork(fd)
}
func (fd *netFD) Write(p []byte) (int, error) {
return netFDWrite(fd, p)
}
func (fd *netFD) SetWriteDeadline(t time.Time) error {
return netFDSetWriteDeadline(fd, t)
}
// Copied from src/net/rawconn.go
type rawConn struct {
fd *netFD
}
func newRawConn(fd *netFD) *rawConn {
return &rawConn{fd: fd}
}
//go:linkname rawConnControl net.(*rawConn).Control
func rawConnControl(c *rawConn, f func(uintptr)) error
//go:linkname rawConnRead net.(*rawConn).Read
func rawConnRead(c *rawConn, f func(uintptr) bool) error
//go:linkname rawConnWrite net.(*rawConn).Write
func rawConnWrite(c *rawConn, f func(uintptr) bool) error
func (c *rawConn) Control(f func(uintptr)) error {
return rawConnControl(c, f)
}
func (c *rawConn) Read(f func(uintptr) bool) error {
return rawConnRead(c, f)
}
func (c *rawConn) Write(f func(uintptr) bool) error {
return rawConnWrite(c, f)
}