mirror of
https://github.com/golang/go
synced 2024-11-18 22:34:45 -07:00
net: provide public access to file descriptors
Fixes #918. R=rsc, rog, brainman CC=golang-dev https://golang.org/cl/2904041
This commit is contained in:
parent
5df5d3276d
commit
a144e3ec36
@ -517,3 +517,17 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (nfd *netFD, err os.
|
|||||||
}
|
}
|
||||||
return nfd, nil
|
return nfd, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fd *netFD) dup() (f *os.File, err os.Error) {
|
||||||
|
ns, e := syscall.Dup(fd.sysfd)
|
||||||
|
if e != 0 {
|
||||||
|
return nil, &OpError{"dup", fd.net, fd.laddr, os.Errno(e)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We want blocking mode for the new fd, hence the double negative.
|
||||||
|
if e = syscall.SetNonblock(ns, false); e != 0 {
|
||||||
|
return nil, &OpError{"setnonblock", fd.net, fd.laddr, os.Errno(e)}
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.NewFile(ns, fd.sysfile.Name()), nil
|
||||||
|
}
|
||||||
|
@ -373,3 +373,8 @@ func init() {
|
|||||||
initErr = os.NewSyscallError("WSAStartup", e)
|
initErr = os.NewSyscallError("WSAStartup", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fd *netFD) dup() (f *os.File, err os.Error) {
|
||||||
|
// TODO: Implement this
|
||||||
|
return nil, os.NewSyscallError("dup", syscall.EWINDOWS)
|
||||||
|
}
|
||||||
|
@ -208,6 +208,11 @@ func (c *TCPConn) SetNoDelay(noDelay bool) os.Error {
|
|||||||
return setNoDelay(c.fd, noDelay)
|
return setNoDelay(c.fd, noDelay)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// File returns a copy of the underlying os.File, set to blocking mode.
|
||||||
|
// 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 (c *TCPConn) File() (f *os.File, err os.Error) { return c.fd.dup() }
|
||||||
|
|
||||||
// DialTCP is like Dial but can only connect to TCP networks
|
// DialTCP is like Dial but can only connect to TCP networks
|
||||||
// and returns a TCPConn structure.
|
// and returns a TCPConn structure.
|
||||||
func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error) {
|
func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error) {
|
||||||
@ -281,3 +286,8 @@ func (l *TCPListener) Close() os.Error {
|
|||||||
|
|
||||||
// Addr returns the listener's network address, a *TCPAddr.
|
// Addr returns the listener's network address, a *TCPAddr.
|
||||||
func (l *TCPListener) Addr() Addr { return l.fd.laddr }
|
func (l *TCPListener) Addr() Addr { return l.fd.laddr }
|
||||||
|
|
||||||
|
// File returns a copy of the underlying os.File, set to blocking mode.
|
||||||
|
// 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 (l *TCPListener) File() (f *os.File, err os.Error) { return l.fd.dup() }
|
||||||
|
@ -274,3 +274,8 @@ func (c *UDPConn) BindToDevice(device string) os.Error {
|
|||||||
defer c.fd.decref()
|
defer c.fd.decref()
|
||||||
return os.NewSyscallError("setsockopt", syscall.BindToDevice(c.fd.sysfd, device))
|
return os.NewSyscallError("setsockopt", syscall.BindToDevice(c.fd.sysfd, device))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// File returns a copy of the underlying os.File, set to blocking mode.
|
||||||
|
// 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 (c *UDPConn) File() (f *os.File, err os.Error) { return c.fd.dup() }
|
||||||
|
@ -277,6 +277,11 @@ func (c *UnixConn) WriteTo(b []byte, addr Addr) (n int, err os.Error) {
|
|||||||
return c.WriteToUnix(b, a)
|
return c.WriteToUnix(b, a)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// File returns a copy of the underlying os.File, set to blocking mode.
|
||||||
|
// 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 (c *UnixConn) File() (f *os.File, err os.Error) { return c.fd.dup() }
|
||||||
|
|
||||||
// DialUnix connects to the remote address raddr on the network net,
|
// DialUnix connects to the remote address raddr on the network net,
|
||||||
// which must be "unix" or "unixgram". If laddr is not nil, it is used
|
// which must be "unix" or "unixgram". If laddr is not nil, it is used
|
||||||
// as the local address for the connection.
|
// as the local address for the connection.
|
||||||
@ -369,6 +374,11 @@ func (l *UnixListener) Close() os.Error {
|
|||||||
// Addr returns the listener's network address.
|
// Addr returns the listener's network address.
|
||||||
func (l *UnixListener) Addr() Addr { return l.fd.laddr }
|
func (l *UnixListener) Addr() Addr { return l.fd.laddr }
|
||||||
|
|
||||||
|
// File returns a copy of the underlying os.File, set to blocking mode.
|
||||||
|
// 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 (l *UnixListener) File() (f *os.File, err os.Error) { return l.fd.dup() }
|
||||||
|
|
||||||
// ListenUnixgram listens for incoming Unix datagram packets addressed to the
|
// ListenUnixgram listens for incoming Unix datagram packets addressed to the
|
||||||
// local address laddr. The returned connection c's ReadFrom
|
// local address laddr. The returned connection c's ReadFrom
|
||||||
// and WriteTo methods can be used to receive and send UDP
|
// and WriteTo methods can be used to receive and send UDP
|
||||||
|
Loading…
Reference in New Issue
Block a user