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 <iant@golang.org>
diff --git a/internal/netreflect/socket.go b/internal/netreflect/socket.go
deleted file mode 100644
index 1495b65..0000000
--- a/internal/netreflect/socket.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-
-// Package netreflect implements run-time reflection for the
-// facilities of net package.
-//
-// This package works only for Go 1.8 or below.
-package netreflect
-
-import (
- "errors"
- "net"
-)
-
-var (
- errInvalidType = errors.New("invalid type")
- errOpNoSupport = errors.New("operation not supported")
-)
-
-// SocketOf returns the socket descriptor of c.
-func SocketOf(c net.Conn) (uintptr, error) {
- switch c.(type) {
- case *net.TCPConn, *net.UDPConn, *net.IPConn, *net.UnixConn:
- return socketOf(c)
- default:
- return 0, errInvalidType
- }
-}
-
-// PacketSocketOf returns the socket descriptor of c.
-func PacketSocketOf(c net.PacketConn) (uintptr, error) {
- switch c.(type) {
- case *net.UDPConn, *net.IPConn, *net.UnixConn:
- return socketOf(c.(net.Conn))
- default:
- return 0, errInvalidType
- }
-}
diff --git a/internal/netreflect/socket_posix.go b/internal/netreflect/socket_posix.go
deleted file mode 100644
index 410c092..0000000
--- a/internal/netreflect/socket_posix.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
-
-package netreflect
-
-import (
- "net"
- "reflect"
- "runtime"
-)
-
-func socketOf(c net.Conn) (uintptr, error) {
- v := reflect.ValueOf(c)
- switch e := v.Elem(); e.Kind() {
- case reflect.Struct:
- fd := e.FieldByName("conn").FieldByName("fd")
- switch e := fd.Elem(); e.Kind() {
- case reflect.Struct:
- sysfd := e.FieldByName("sysfd")
- if runtime.GOOS == "windows" {
- return uintptr(sysfd.Uint()), nil
- }
- return uintptr(sysfd.Int()), nil
- }
- }
- return 0, errInvalidType
-}
diff --git a/internal/netreflect/socket_stub.go b/internal/netreflect/socket_stub.go
deleted file mode 100644
index 17b20c4..0000000
--- a/internal/netreflect/socket_stub.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows
-
-package netreflect
-
-import "net"
-
-func socketOf(c net.Conn) (uintptr, error) { return 0, errOpNoSupport }
diff --git a/internal/netreflect/socket_test.go b/internal/netreflect/socket_test.go
deleted file mode 100644
index b3aad0d..0000000
--- a/internal/netreflect/socket_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
-
-package netreflect_test
-
-import (
- "net"
- "os"
- "testing"
-
- "golang.org/x/net/internal/netreflect"
- "golang.org/x/net/internal/nettest"
-)
-
-func TestSocketOf(t *testing.T) {
- for _, network := range []string{"tcp", "unix", "unixpacket"} {
- if !nettest.TestableNetwork(network) {
- continue
- }
- ln, err := nettest.NewLocalListener(network)
- if err != nil {
- t.Error(err)
- continue
- }
- defer func() {
- path := ln.Addr().String()
- ln.Close()
- if network == "unix" || network == "unixpacket" {
- os.Remove(path)
- }
- }()
- c, err := net.Dial(ln.Addr().Network(), ln.Addr().String())
- if err != nil {
- t.Error(err)
- continue
- }
- defer c.Close()
- if _, err := netreflect.SocketOf(c); err != nil {
- t.Error(err)
- continue
- }
- }
-}
-
-func TestPacketSocketOf(t *testing.T) {
- for _, network := range []string{"udp", "unixgram"} {
- if !nettest.TestableNetwork(network) {
- continue
- }
- c, err := nettest.NewLocalPacketListener(network)
- if err != nil {
- t.Error(err)
- continue
- }
- defer c.Close()
- if _, err := netreflect.PacketSocketOf(c); err != nil {
- t.Error(err)
- continue
- }
- }
-}
diff --git a/internal/socket/reflect.go b/internal/socket/reflect.go
index 2368eec..bb179f1 100644
--- a/internal/socket/reflect.go
+++ b/internal/socket/reflect.go
@@ -7,10 +7,11 @@
package socket
import (
+ "errors"
"net"
"os"
-
- "golang.org/x/net/internal/netreflect"
+ "reflect"
+ "runtime"
)
// A Conn represents a raw connection.
@@ -24,7 +25,7 @@
}
func (o *Option) get(c *Conn, b []byte) (int, error) {
- s, err := netreflect.SocketOf(c.c)
+ s, err := socketOf(c.c)
if err != nil {
return 0, err
}
@@ -33,9 +34,29 @@
}
func (o *Option) set(c *Conn, b []byte) error {
- s, err := netreflect.SocketOf(c.c)
+ s, err := socketOf(c.c)
if err != nil {
return err
}
return os.NewSyscallError("setsockopt", setsockopt(s, o.Level, o.Name, b))
}
+
+func socketOf(c net.Conn) (uintptr, error) {
+ switch c.(type) {
+ case *net.TCPConn, *net.UDPConn, *net.IPConn:
+ v := reflect.ValueOf(c)
+ switch e := v.Elem(); e.Kind() {
+ case reflect.Struct:
+ fd := e.FieldByName("conn").FieldByName("fd")
+ switch e := fd.Elem(); e.Kind() {
+ case reflect.Struct:
+ sysfd := e.FieldByName("sysfd")
+ if runtime.GOOS == "windows" {
+ return uintptr(sysfd.Uint()), nil
+ }
+ return uintptr(sysfd.Int()), nil
+ }
+ }
+ }
+ return 0, errors.New("invalid type")
+}