@@ -78,7 +78,6 @@ type operation struct {
78
78
79
79
// fields used only by net package
80
80
buf syscall.WSABuf
81
- msg windows.WSAMsg
82
81
rsa * syscall.RawSockaddrAny
83
82
bufs []syscall.WSABuf
84
83
}
@@ -112,10 +111,7 @@ func (fd *FD) overlapped(o *operation) *syscall.Overlapped {
112
111
113
112
func (o * operation ) InitBuf (buf []byte ) {
114
113
o .buf .Len = uint32 (len (buf ))
115
- o .buf .Buf = nil
116
- if len (buf ) != 0 {
117
- o .buf .Buf = & buf [0 ]
118
- }
114
+ o .buf .Buf = unsafe .SliceData (buf )
119
115
}
120
116
121
117
func (o * operation ) InitBufs (buf * [][]byte ) {
@@ -148,19 +144,18 @@ func (o *operation) ClearBufs() {
148
144
o .bufs = o .bufs [:0 ]
149
145
}
150
146
151
- func (o * operation ) InitMsg (p []byte , oob []byte ) {
152
- o .InitBuf (p )
153
- o .msg .Buffers = & o .buf
154
- o .msg .BufferCount = 1
155
-
156
- o .msg .Name = nil
157
- o .msg .Namelen = 0
158
-
159
- o .msg .Flags = 0
160
- o .msg .Control .Len = uint32 (len (oob ))
161
- o .msg .Control .Buf = nil
162
- if len (oob ) != 0 {
163
- o .msg .Control .Buf = & oob [0 ]
147
+ func newWSAMsg (p []byte , oob []byte , flags int ) windows.WSAMsg {
148
+ return windows.WSAMsg {
149
+ Buffers : & syscall.WSABuf {
150
+ Len : uint32 (len (p )),
151
+ Buf : unsafe .SliceData (p ),
152
+ },
153
+ BufferCount : 1 ,
154
+ Control : syscall.WSABuf {
155
+ Len : uint32 (len (oob )),
156
+ Buf : unsafe .SliceData (oob ),
157
+ },
158
+ Flags : uint32 (flags ),
164
159
}
165
160
}
166
161
@@ -1279,23 +1274,22 @@ func (fd *FD) ReadMsg(p []byte, oob []byte, flags int) (int, int, int, syscall.S
1279
1274
}
1280
1275
1281
1276
o := & fd .rop
1282
- o .InitMsg (p , oob )
1283
1277
if o .rsa == nil {
1284
1278
o .rsa = new (syscall.RawSockaddrAny )
1285
1279
}
1286
- o . msg . Name = ( syscall . Pointer )( unsafe . Pointer ( o . rsa ) )
1287
- o . msg .Namelen = int32 ( unsafe .Sizeof ( * o .rsa ))
1288
- o . msg .Flags = uint32 ( flags )
1280
+ msg := newWSAMsg ( p , oob , flags )
1281
+ msg .Name = ( syscall . Pointer )( unsafe .Pointer ( o .rsa ))
1282
+ msg .Namelen = int32 ( unsafe . Sizeof ( * o . rsa ) )
1289
1283
n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1290
- err = windows .WSARecvMsg (fd .Sysfd , & o . msg , & qty , & o .o , nil )
1284
+ err = windows .WSARecvMsg (fd .Sysfd , & msg , & qty , & o .o , nil )
1291
1285
return qty , err
1292
1286
})
1293
1287
err = fd .eofError (n , err )
1294
1288
var sa syscall.Sockaddr
1295
1289
if err == nil {
1296
1290
sa , err = o .rsa .Sockaddr ()
1297
1291
}
1298
- return n , int (o . msg .Control .Len ), int (o . msg .Flags ), sa , err
1292
+ return n , int (msg .Control .Len ), int (msg .Flags ), sa , err
1299
1293
}
1300
1294
1301
1295
// ReadMsgInet4 is ReadMsg, but specialized to return a syscall.SockaddrInet4.
@@ -1310,22 +1304,21 @@ func (fd *FD) ReadMsgInet4(p []byte, oob []byte, flags int, sa4 *syscall.Sockadd
1310
1304
}
1311
1305
1312
1306
o := & fd .rop
1313
- o .InitMsg (p , oob )
1314
1307
if o .rsa == nil {
1315
1308
o .rsa = new (syscall.RawSockaddrAny )
1316
1309
}
1317
- o . msg . Name = ( syscall . Pointer )( unsafe . Pointer ( o . rsa ) )
1318
- o . msg .Namelen = int32 ( unsafe .Sizeof ( * o .rsa ))
1319
- o . msg .Flags = uint32 ( flags )
1310
+ msg := newWSAMsg ( p , oob , flags )
1311
+ msg .Name = ( syscall . Pointer )( unsafe .Pointer ( o .rsa ))
1312
+ msg .Namelen = int32 ( unsafe . Sizeof ( * o . rsa ) )
1320
1313
n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1321
- err = windows .WSARecvMsg (fd .Sysfd , & o . msg , & qty , & o .o , nil )
1314
+ err = windows .WSARecvMsg (fd .Sysfd , & msg , & qty , & o .o , nil )
1322
1315
return qty , err
1323
1316
})
1324
1317
err = fd .eofError (n , err )
1325
1318
if err == nil {
1326
1319
rawToSockaddrInet4 (o .rsa , sa4 )
1327
1320
}
1328
- return n , int (o . msg .Control .Len ), int (o . msg .Flags ), err
1321
+ return n , int (msg .Control .Len ), int (msg .Flags ), err
1329
1322
}
1330
1323
1331
1324
// ReadMsgInet6 is ReadMsg, but specialized to return a syscall.SockaddrInet6.
@@ -1340,22 +1333,21 @@ func (fd *FD) ReadMsgInet6(p []byte, oob []byte, flags int, sa6 *syscall.Sockadd
1340
1333
}
1341
1334
1342
1335
o := & fd .rop
1343
- o .InitMsg (p , oob )
1344
1336
if o .rsa == nil {
1345
1337
o .rsa = new (syscall.RawSockaddrAny )
1346
1338
}
1347
- o . msg . Name = ( syscall . Pointer )( unsafe . Pointer ( o . rsa ) )
1348
- o . msg .Namelen = int32 ( unsafe .Sizeof ( * o .rsa ))
1349
- o . msg .Flags = uint32 ( flags )
1339
+ msg := newWSAMsg ( p , oob , flags )
1340
+ msg .Name = ( syscall . Pointer )( unsafe .Pointer ( o .rsa ))
1341
+ msg .Namelen = int32 ( unsafe . Sizeof ( * o . rsa ) )
1350
1342
n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1351
- err = windows .WSARecvMsg (fd .Sysfd , & o . msg , & qty , & o .o , nil )
1343
+ err = windows .WSARecvMsg (fd .Sysfd , & msg , & qty , & o .o , nil )
1352
1344
return qty , err
1353
1345
})
1354
1346
err = fd .eofError (n , err )
1355
1347
if err == nil {
1356
1348
rawToSockaddrInet6 (o .rsa , sa6 )
1357
1349
}
1358
- return n , int (o . msg .Control .Len ), int (o . msg .Flags ), err
1350
+ return n , int (msg .Control .Len ), int (msg .Flags ), err
1359
1351
}
1360
1352
1361
1353
// WriteMsg wraps the WSASendMsg network call.
@@ -1370,7 +1362,7 @@ func (fd *FD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (int, int, err
1370
1362
defer fd .writeUnlock ()
1371
1363
1372
1364
o := & fd .wop
1373
- o . InitMsg (p , oob )
1365
+ msg := newWSAMsg (p , oob , 0 )
1374
1366
if sa != nil {
1375
1367
if o .rsa == nil {
1376
1368
o .rsa = new (syscall.RawSockaddrAny )
@@ -1379,14 +1371,14 @@ func (fd *FD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (int, int, err
1379
1371
if err != nil {
1380
1372
return 0 , 0 , err
1381
1373
}
1382
- o . msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1383
- o . msg .Namelen = len
1374
+ msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1375
+ msg .Namelen = len
1384
1376
}
1385
1377
n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1386
- err = windows .WSASendMsg (fd .Sysfd , & o . msg , 0 , nil , & o .o , nil )
1378
+ err = windows .WSASendMsg (fd .Sysfd , & msg , 0 , nil , & o .o , nil )
1387
1379
return qty , err
1388
1380
})
1389
- return n , int (o . msg .Control .Len ), err
1381
+ return n , int (msg .Control .Len ), err
1390
1382
}
1391
1383
1392
1384
// WriteMsgInet4 is WriteMsg specialized for syscall.SockaddrInet4.
@@ -1401,18 +1393,18 @@ func (fd *FD) WriteMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (in
1401
1393
defer fd .writeUnlock ()
1402
1394
1403
1395
o := & fd .wop
1404
- o .InitMsg (p , oob )
1405
1396
if o .rsa == nil {
1406
1397
o .rsa = new (syscall.RawSockaddrAny )
1407
1398
}
1408
1399
len := sockaddrInet4ToRaw (o .rsa , sa )
1409
- o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1410
- o .msg .Namelen = len
1400
+ msg := newWSAMsg (p , oob , 0 )
1401
+ msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1402
+ msg .Namelen = len
1411
1403
n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1412
- err = windows .WSASendMsg (fd .Sysfd , & o . msg , 0 , nil , & o .o , nil )
1404
+ err = windows .WSASendMsg (fd .Sysfd , & msg , 0 , nil , & o .o , nil )
1413
1405
return qty , err
1414
1406
})
1415
- return n , int (o . msg .Control .Len ), err
1407
+ return n , int (msg .Control .Len ), err
1416
1408
}
1417
1409
1418
1410
// WriteMsgInet6 is WriteMsg specialized for syscall.SockaddrInet6.
@@ -1427,18 +1419,18 @@ func (fd *FD) WriteMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (in
1427
1419
defer fd .writeUnlock ()
1428
1420
1429
1421
o := & fd .wop
1430
- o .InitMsg (p , oob )
1431
1422
if o .rsa == nil {
1432
1423
o .rsa = new (syscall.RawSockaddrAny )
1433
1424
}
1425
+ msg := newWSAMsg (p , oob , 0 )
1434
1426
len := sockaddrInet6ToRaw (o .rsa , sa )
1435
- o . msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1436
- o . msg .Namelen = len
1427
+ msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1428
+ msg .Namelen = len
1437
1429
n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1438
- err = windows .WSASendMsg (fd .Sysfd , & o . msg , 0 , nil , & o .o , nil )
1430
+ err = windows .WSASendMsg (fd .Sysfd , & msg , 0 , nil , & o .o , nil )
1439
1431
return qty , err
1440
1432
})
1441
- return n , int (o . msg .Control .Len ), err
1433
+ return n , int (msg .Control .Len ), err
1442
1434
}
1443
1435
1444
1436
func DupCloseOnExec (fd int ) (int , string , error ) {
0 commit comments