diff options
Diffstat (limited to 'libgo/go/net/file_unix.go')
-rw-r--r-- | libgo/go/net/file_unix.go | 88 |
1 files changed, 32 insertions, 56 deletions
diff --git a/libgo/go/net/file_unix.go b/libgo/go/net/file_unix.go index 214a4196c8e..5b24c7d09d1 100644 --- a/libgo/go/net/file_unix.go +++ b/libgo/go/net/file_unix.go @@ -11,75 +11,59 @@ import ( "syscall" ) -func newFileFD(f *os.File) (*netFD, error) { - fd, err := dupCloseOnExec(int(f.Fd())) +func dupSocket(f *os.File) (int, error) { + s, err := dupCloseOnExec(int(f.Fd())) if err != nil { - return nil, os.NewSyscallError("dup", err) + return -1, err + } + if err := syscall.SetNonblock(s, true); err != nil { + closeFunc(s) + return -1, os.NewSyscallError("setnonblock", err) } + return s, nil +} - if err = syscall.SetNonblock(fd, true); err != nil { - closesocket(fd) +func newFileFD(f *os.File) (*netFD, error) { + s, err := dupSocket(f) + if err != nil { return nil, err } - - sotype, err := syscall.GetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_TYPE) + family := syscall.AF_UNSPEC + sotype, err := syscall.GetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_TYPE) if err != nil { - closesocket(fd) + closeFunc(s) return nil, os.NewSyscallError("getsockopt", err) } - - family := syscall.AF_UNSPEC - toAddr := sockaddrToTCP - lsa, _ := syscall.Getsockname(fd) + lsa, _ := syscall.Getsockname(s) + rsa, _ := syscall.Getpeername(s) switch lsa.(type) { - default: - closesocket(fd) - return nil, syscall.EINVAL case *syscall.SockaddrInet4: family = syscall.AF_INET - if sotype == syscall.SOCK_DGRAM { - toAddr = sockaddrToUDP - } else if sotype == syscall.SOCK_RAW { - toAddr = sockaddrToIP - } case *syscall.SockaddrInet6: family = syscall.AF_INET6 - if sotype == syscall.SOCK_DGRAM { - toAddr = sockaddrToUDP - } else if sotype == syscall.SOCK_RAW { - toAddr = sockaddrToIP - } case *syscall.SockaddrUnix: family = syscall.AF_UNIX - toAddr = sockaddrToUnix - if sotype == syscall.SOCK_DGRAM { - toAddr = sockaddrToUnixgram - } else if sotype == syscall.SOCK_SEQPACKET { - toAddr = sockaddrToUnixpacket - } + default: + closeFunc(s) + return nil, syscall.EPROTONOSUPPORT } - laddr := toAddr(lsa) - rsa, _ := syscall.Getpeername(fd) - raddr := toAddr(rsa) - - netfd, err := newFD(fd, family, sotype, laddr.Network()) + fd, err := newFD(s, family, sotype, "") if err != nil { - closesocket(fd) + closeFunc(s) return nil, err } - if err := netfd.init(); err != nil { - netfd.Close() + laddr := fd.addrFunc()(lsa) + raddr := fd.addrFunc()(rsa) + fd.net = laddr.Network() + if err := fd.init(); err != nil { + fd.Close() return nil, err } - netfd.setAddr(laddr, raddr) - return netfd, nil + fd.setAddr(laddr, raddr) + return fd, nil } -// FileConn returns a copy of the network connection corresponding to -// the open file f. It is the caller's responsibility to close f when -// finished. Closing c does not affect f, and closing f does not -// affect c. -func FileConn(f *os.File) (c Conn, err error) { +func fileConn(f *os.File) (Conn, error) { fd, err := newFileFD(f) if err != nil { return nil, err @@ -98,11 +82,7 @@ func FileConn(f *os.File) (c Conn, err error) { return nil, syscall.EINVAL } -// FileListener returns a copy of the network listener corresponding -// to the open file f. It is the caller's responsibility to close l -// when finished. Closing l does not affect f, and closing f does not -// affect l. -func FileListener(f *os.File) (l Listener, err error) { +func fileListener(f *os.File) (Listener, error) { fd, err := newFileFD(f) if err != nil { return nil, err @@ -117,11 +97,7 @@ func FileListener(f *os.File) (l Listener, err error) { return nil, syscall.EINVAL } -// FilePacketConn returns a copy of the packet network connection -// corresponding to the open file f. It is the caller's -// responsibility to close f when finished. Closing c does not affect -// f, and closing f does not affect c. -func FilePacketConn(f *os.File) (c PacketConn, err error) { +func filePacketConn(f *os.File) (PacketConn, error) { fd, err := newFileFD(f) if err != nil { return nil, err |