Skip to content

Commit e1564c3

Browse files
committed
internal/socket: merge internal/netreflect into internal/socket package
Updates golang/go#19051. Change-Id: I4d86de8ea3fb03e40dd50bc0351562fbfa2c46a7 Reviewed-on: https://go-review.googlesource.com/38277 Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent bd58382 commit e1564c3

File tree

5 files changed

+25
-153
lines changed

5 files changed

+25
-153
lines changed

internal/netreflect/socket.go

Lines changed: 0 additions & 41 deletions
This file was deleted.

internal/netreflect/socket_posix.go

Lines changed: 0 additions & 31 deletions
This file was deleted.

internal/netreflect/socket_stub.go

Lines changed: 0 additions & 12 deletions
This file was deleted.

internal/netreflect/socket_test.go

Lines changed: 0 additions & 65 deletions
This file was deleted.

internal/socket/reflect.go

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
package socket
88

99
import (
10+
"errors"
1011
"net"
1112
"os"
12-
13-
"golang.org/x/net/internal/netreflect"
13+
"reflect"
14+
"runtime"
1415
)
1516

1617
// A Conn represents a raw connection.
@@ -24,7 +25,7 @@ func NewConn(c net.Conn) (*Conn, error) {
2425
}
2526

2627
func (o *Option) get(c *Conn, b []byte) (int, error) {
27-
s, err := netreflect.SocketOf(c.c)
28+
s, err := socketOf(c.c)
2829
if err != nil {
2930
return 0, err
3031
}
@@ -33,9 +34,29 @@ func (o *Option) get(c *Conn, b []byte) (int, error) {
3334
}
3435

3536
func (o *Option) set(c *Conn, b []byte) error {
36-
s, err := netreflect.SocketOf(c.c)
37+
s, err := socketOf(c.c)
3738
if err != nil {
3839
return err
3940
}
4041
return os.NewSyscallError("setsockopt", setsockopt(s, o.Level, o.Name, b))
4142
}
43+
44+
func socketOf(c net.Conn) (uintptr, error) {
45+
switch c.(type) {
46+
case *net.TCPConn, *net.UDPConn, *net.IPConn:
47+
v := reflect.ValueOf(c)
48+
switch e := v.Elem(); e.Kind() {
49+
case reflect.Struct:
50+
fd := e.FieldByName("conn").FieldByName("fd")
51+
switch e := fd.Elem(); e.Kind() {
52+
case reflect.Struct:
53+
sysfd := e.FieldByName("sysfd")
54+
if runtime.GOOS == "windows" {
55+
return uintptr(sysfd.Uint()), nil
56+
}
57+
return uintptr(sysfd.Int()), nil
58+
}
59+
}
60+
}
61+
return 0, errors.New("invalid type")
62+
}

0 commit comments

Comments
 (0)