mirror of
https://github.com/golang/go
synced 2024-11-23 19:50:06 -07:00
net: don't return non-nil interface values as Source, Addr in OpError
Fixes #10992. Change-Id: Ia376e4de118993b43e5813da57ab25fea8122048 Reviewed-on: https://go-review.googlesource.com/10476 Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
38e3427b2f
commit
22829bd766
@ -23,12 +23,38 @@ func (e *OpError) isValid() error {
|
|||||||
return fmt.Errorf("OpError.Net is empty: %v", e)
|
return fmt.Errorf("OpError.Net is empty: %v", e)
|
||||||
}
|
}
|
||||||
for _, addr := range []Addr{e.Source, e.Addr} {
|
for _, addr := range []Addr{e.Source, e.Addr} {
|
||||||
if addr != nil {
|
switch addr := addr.(type) {
|
||||||
switch addr.(type) {
|
case nil:
|
||||||
case *TCPAddr, *UDPAddr, *IPAddr, *IPNet, *UnixAddr, *pipeAddr, fileAddr:
|
case *TCPAddr:
|
||||||
default:
|
if addr == nil {
|
||||||
return fmt.Errorf("OpError.Source or Addr is unknown type: %T, %v", addr, e)
|
return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
|
||||||
}
|
}
|
||||||
|
case *UDPAddr:
|
||||||
|
if addr == nil {
|
||||||
|
return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
|
||||||
|
}
|
||||||
|
case *IPAddr:
|
||||||
|
if addr == nil {
|
||||||
|
return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
|
||||||
|
}
|
||||||
|
case *IPNet:
|
||||||
|
if addr == nil {
|
||||||
|
return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
|
||||||
|
}
|
||||||
|
case *UnixAddr:
|
||||||
|
if addr == nil {
|
||||||
|
return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
|
||||||
|
}
|
||||||
|
case *pipeAddr:
|
||||||
|
if addr == nil {
|
||||||
|
return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
|
||||||
|
}
|
||||||
|
case fileAddr:
|
||||||
|
if addr == "" {
|
||||||
|
return fmt.Errorf("OpError.Source or Addr is empty: %#v, %v", addr, e)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("OpError.Source or Addr is unknown type: %T, %v", addr, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if e.Err == nil {
|
if e.Err == nil {
|
||||||
@ -133,6 +159,35 @@ func TestDialError(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestProtocolDialError(t *testing.T) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "nacl":
|
||||||
|
t.Skipf("not supported on %s", runtime.GOOS)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, network := range []string{"tcp", "udp", "ip:4294967296", "unix", "unixpacket", "unixgram"} {
|
||||||
|
var err error
|
||||||
|
switch network {
|
||||||
|
case "tcp":
|
||||||
|
_, err = DialTCP(network, nil, &TCPAddr{Port: 1 << 16})
|
||||||
|
case "udp":
|
||||||
|
_, err = DialUDP(network, nil, &UDPAddr{Port: 1 << 16})
|
||||||
|
case "ip:4294967296":
|
||||||
|
_, err = DialIP(network, nil, nil)
|
||||||
|
case "unix", "unixpacket", "unixgram":
|
||||||
|
_, err = DialUnix(network, nil, &UnixAddr{Name: "//"})
|
||||||
|
}
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("%s: should fail", network)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err = parseDialError(err); err != nil {
|
||||||
|
t.Errorf("%s: %v", network, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var listenErrorTests = []struct {
|
var listenErrorTests = []struct {
|
||||||
network, address string
|
network, address string
|
||||||
}{
|
}{
|
||||||
@ -222,6 +277,37 @@ func TestListenPacketError(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestProtocolListenError(t *testing.T) {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "nacl", "plan9":
|
||||||
|
t.Skipf("not supported on %s", runtime.GOOS)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, network := range []string{"tcp", "udp", "ip:4294967296", "unix", "unixpacket", "unixgram"} {
|
||||||
|
var err error
|
||||||
|
switch network {
|
||||||
|
case "tcp":
|
||||||
|
_, err = ListenTCP(network, &TCPAddr{Port: 1 << 16})
|
||||||
|
case "udp":
|
||||||
|
_, err = ListenUDP(network, &UDPAddr{Port: 1 << 16})
|
||||||
|
case "ip:4294967296":
|
||||||
|
_, err = ListenIP(network, nil)
|
||||||
|
case "unix", "unixpacket":
|
||||||
|
_, err = ListenUnix(network, &UnixAddr{Name: "//"})
|
||||||
|
case "unixgram":
|
||||||
|
_, err = ListenUnixgram(network, &UnixAddr{Name: "//"})
|
||||||
|
}
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("%s: should fail", network)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err = parseDialError(err); err != nil {
|
||||||
|
t.Errorf("%s: %v", network, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// parseReadError parses nestedErr and reports whether it is a valid
|
// parseReadError parses nestedErr and reports whether it is a valid
|
||||||
// error value from Read functions.
|
// error value from Read functions.
|
||||||
// It returns nil when nestedErr is valid.
|
// It returns nil when nestedErr is valid.
|
||||||
|
@ -30,6 +30,13 @@ func (a *IPAddr) isWildcard() bool {
|
|||||||
return a.IP.IsUnspecified()
|
return a.IP.IsUnspecified()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *IPAddr) opAddr() Addr {
|
||||||
|
if a == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
// ResolveIPAddr parses addr as an IP address of the form "host" or
|
// ResolveIPAddr parses addr as an IP address of the form "host" or
|
||||||
// "ipv6-host%zone" and resolves the domain name on the network net,
|
// "ipv6-host%zone" and resolves the domain name on the network net,
|
||||||
// which must be "ip", "ip4" or "ip6".
|
// which must be "ip", "ip4" or "ip6".
|
||||||
|
@ -47,7 +47,7 @@ func (c *IPConn) ReadMsgIP(b, oob []byte) (n, oobn, flags int, addr *IPAddr, err
|
|||||||
// SetWriteDeadline. On packet-oriented connections, write timeouts
|
// SetWriteDeadline. On packet-oriented connections, write timeouts
|
||||||
// are rare.
|
// are rare.
|
||||||
func (c *IPConn) WriteToIP(b []byte, addr *IPAddr) (int, error) {
|
func (c *IPConn) WriteToIP(b []byte, addr *IPAddr) (int, error) {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: syscall.EPLAN9}
|
return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteTo implements the PacketConn WriteTo method.
|
// WriteTo implements the PacketConn WriteTo method.
|
||||||
@ -59,7 +59,7 @@ func (c *IPConn) WriteTo(b []byte, addr Addr) (int, error) {
|
|||||||
// b and the associated out-of-band data from oob. It returns the
|
// b and the associated out-of-band data from oob. It returns the
|
||||||
// number of payload and out-of-band bytes written.
|
// number of payload and out-of-band bytes written.
|
||||||
func (c *IPConn) WriteMsgIP(b, oob []byte, addr *IPAddr) (n, oobn int, err error) {
|
func (c *IPConn) WriteMsgIP(b, oob []byte, addr *IPAddr) (n, oobn int, err error) {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: syscall.EPLAN9}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialIP connects to the remote address raddr on the network protocol
|
// DialIP connects to the remote address raddr on the network protocol
|
||||||
@ -70,7 +70,7 @@ func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func dialIP(netProto string, laddr, raddr *IPAddr, deadline time.Time) (*IPConn, error) {
|
func dialIP(netProto string, laddr, raddr *IPAddr, deadline time.Time) (*IPConn, error) {
|
||||||
return nil, &OpError{Op: "dial", Net: netProto, Source: laddr, Addr: raddr, Err: syscall.EPLAN9}
|
return nil, &OpError{Op: "dial", Net: netProto, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenIP listens for incoming IP packets addressed to the local
|
// ListenIP listens for incoming IP packets addressed to the local
|
||||||
@ -78,5 +78,5 @@ func dialIP(netProto string, laddr, raddr *IPAddr, deadline time.Time) (*IPConn,
|
|||||||
// methods can be used to receive and send IP packets with per-packet
|
// methods can be used to receive and send IP packets with per-packet
|
||||||
// addressing.
|
// addressing.
|
||||||
func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error) {
|
func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error) {
|
||||||
return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr, Err: syscall.EPLAN9}
|
return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
@ -147,18 +147,18 @@ func (c *IPConn) WriteToIP(b []byte, addr *IPAddr) (int, error) {
|
|||||||
return 0, syscall.EINVAL
|
return 0, syscall.EINVAL
|
||||||
}
|
}
|
||||||
if c.fd.isConnected {
|
if c.fd.isConnected {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: ErrWriteToConnected}
|
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
|
||||||
}
|
}
|
||||||
if addr == nil {
|
if addr == nil {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: errMissingAddress}
|
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
sa, err := addr.sockaddr(c.fd.family)
|
sa, err := addr.sockaddr(c.fd.family)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: err}
|
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
n, err := c.fd.writeTo(b, sa)
|
n, err := c.fd.writeTo(b, sa)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: err}
|
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
@ -183,19 +183,19 @@ func (c *IPConn) WriteMsgIP(b, oob []byte, addr *IPAddr) (n, oobn int, err error
|
|||||||
return 0, 0, syscall.EINVAL
|
return 0, 0, syscall.EINVAL
|
||||||
}
|
}
|
||||||
if c.fd.isConnected {
|
if c.fd.isConnected {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: ErrWriteToConnected}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
|
||||||
}
|
}
|
||||||
if addr == nil {
|
if addr == nil {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: errMissingAddress}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
var sa syscall.Sockaddr
|
var sa syscall.Sockaddr
|
||||||
sa, err = addr.sockaddr(c.fd.family)
|
sa, err = addr.sockaddr(c.fd.family)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: err}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
n, oobn, err = c.fd.writeMsg(b, oob, sa)
|
n, oobn, err = c.fd.writeMsg(b, oob, sa)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: err}
|
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -210,19 +210,19 @@ func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error) {
|
|||||||
func dialIP(netProto string, laddr, raddr *IPAddr, deadline time.Time) (*IPConn, error) {
|
func dialIP(netProto string, laddr, raddr *IPAddr, deadline time.Time) (*IPConn, error) {
|
||||||
net, proto, err := parseNetwork(netProto)
|
net, proto, err := parseNetwork(netProto)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &OpError{Op: "dial", Net: netProto, Source: laddr, Addr: raddr, Err: err}
|
return nil, &OpError{Op: "dial", Net: netProto, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
switch net {
|
switch net {
|
||||||
case "ip", "ip4", "ip6":
|
case "ip", "ip4", "ip6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "dial", Net: netProto, Source: laddr, Addr: raddr, Err: UnknownNetworkError(netProto)}
|
return nil, &OpError{Op: "dial", Net: netProto, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(netProto)}
|
||||||
}
|
}
|
||||||
if raddr == nil {
|
if raddr == nil {
|
||||||
return nil, &OpError{Op: "dial", Net: netProto, Source: laddr, Addr: raddr, Err: errMissingAddress}
|
return nil, &OpError{Op: "dial", Net: netProto, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
fd, err := internetSocket(net, laddr, raddr, deadline, syscall.SOCK_RAW, proto, "dial")
|
fd, err := internetSocket(net, laddr, raddr, deadline, syscall.SOCK_RAW, proto, "dial")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &OpError{Op: "dial", Net: netProto, Source: laddr, Addr: raddr, Err: err}
|
return nil, &OpError{Op: "dial", Net: netProto, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return newIPConn(fd), nil
|
return newIPConn(fd), nil
|
||||||
}
|
}
|
||||||
@ -234,16 +234,16 @@ func dialIP(netProto string, laddr, raddr *IPAddr, deadline time.Time) (*IPConn,
|
|||||||
func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error) {
|
func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error) {
|
||||||
net, proto, err := parseNetwork(netProto)
|
net, proto, err := parseNetwork(netProto)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &OpError{Op: "dial", Net: netProto, Source: nil, Addr: laddr, Err: err}
|
return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
switch net {
|
switch net {
|
||||||
case "ip", "ip4", "ip6":
|
case "ip", "ip4", "ip6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr, Err: UnknownNetworkError(netProto)}
|
return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(netProto)}
|
||||||
}
|
}
|
||||||
fd, err := internetSocket(net, laddr, nil, noDeadline, syscall.SOCK_RAW, proto, "listen")
|
fd, err := internetSocket(net, laddr, nil, noDeadline, syscall.SOCK_RAW, proto, "listen")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr, Err: err}
|
return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return newIPConn(fd), nil
|
return newIPConn(fd), nil
|
||||||
}
|
}
|
||||||
|
@ -140,6 +140,24 @@ func netErr(e error) {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
nonNilInterface := func(a Addr) bool {
|
||||||
|
switch a := a.(type) {
|
||||||
|
case *TCPAddr:
|
||||||
|
return a == nil
|
||||||
|
case *UDPAddr:
|
||||||
|
return a == nil
|
||||||
|
case *IPAddr:
|
||||||
|
return a == nil
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if nonNilInterface(oe.Source) {
|
||||||
|
oe.Source = nil
|
||||||
|
}
|
||||||
|
if nonNilInterface(oe.Addr) {
|
||||||
|
oe.Addr = nil
|
||||||
|
}
|
||||||
if pe, ok := oe.Err.(*os.PathError); ok {
|
if pe, ok := oe.Err.(*os.PathError); ok {
|
||||||
if _, ok = pe.Err.(syscall.ErrorString); ok {
|
if _, ok = pe.Err.(syscall.ErrorString); ok {
|
||||||
oe.Err = pe.Err
|
oe.Err = pe.Err
|
||||||
|
@ -32,6 +32,13 @@ func (a *TCPAddr) isWildcard() bool {
|
|||||||
return a.IP.IsUnspecified()
|
return a.IP.IsUnspecified()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *TCPAddr) opAddr() Addr {
|
||||||
|
if a == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
// ResolveTCPAddr parses addr as a TCP address of the form "host:port"
|
// ResolveTCPAddr parses addr as a TCP address of the form "host:port"
|
||||||
// or "[ipv6-host%zone]:port" and resolves a pair of domain name and
|
// or "[ipv6-host%zone]:port" and resolves a pair of domain name and
|
||||||
// port name on the network net, which must be "tcp", "tcp4" or
|
// port name on the network net, which must be "tcp", "tcp4" or
|
||||||
|
@ -117,10 +117,10 @@ func dialTCP(net string, laddr, raddr *TCPAddr, deadline time.Time) (*TCPConn, e
|
|||||||
switch net {
|
switch net {
|
||||||
case "tcp", "tcp4", "tcp6":
|
case "tcp", "tcp4", "tcp6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
if raddr == nil {
|
if raddr == nil {
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: errMissingAddress}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
fd, err := dialPlan9(net, laddr, raddr)
|
fd, err := dialPlan9(net, laddr, raddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -218,7 +218,7 @@ func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error) {
|
|||||||
switch net {
|
switch net {
|
||||||
case "tcp", "tcp4", "tcp6":
|
case "tcp", "tcp4", "tcp6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
if laddr == nil {
|
if laddr == nil {
|
||||||
laddr = &TCPAddr{}
|
laddr = &TCPAddr{}
|
||||||
|
@ -159,10 +159,10 @@ func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error) {
|
|||||||
switch net {
|
switch net {
|
||||||
case "tcp", "tcp4", "tcp6":
|
case "tcp", "tcp4", "tcp6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
if raddr == nil {
|
if raddr == nil {
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: errMissingAddress}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
return dialTCP(net, laddr, raddr, noDeadline)
|
return dialTCP(net, laddr, raddr, noDeadline)
|
||||||
}
|
}
|
||||||
@ -202,7 +202,7 @@ func dialTCP(net string, laddr, raddr *TCPAddr, deadline time.Time) (*TCPConn, e
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: err}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return newTCPConn(fd), nil
|
return newTCPConn(fd), nil
|
||||||
}
|
}
|
||||||
@ -316,7 +316,7 @@ func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error) {
|
|||||||
switch net {
|
switch net {
|
||||||
case "tcp", "tcp4", "tcp6":
|
case "tcp", "tcp4", "tcp6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
if laddr == nil {
|
if laddr == nil {
|
||||||
laddr = &TCPAddr{}
|
laddr = &TCPAddr{}
|
||||||
|
@ -32,6 +32,13 @@ func (a *UDPAddr) isWildcard() bool {
|
|||||||
return a.IP.IsUnspecified()
|
return a.IP.IsUnspecified()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *UDPAddr) opAddr() Addr {
|
||||||
|
if a == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
// ResolveUDPAddr parses addr as a UDP address of the form "host:port"
|
// ResolveUDPAddr parses addr as a UDP address of the form "host:port"
|
||||||
// or "[ipv6-host%zone]:port" and resolves a pair of domain name and
|
// or "[ipv6-host%zone]:port" and resolves a pair of domain name and
|
||||||
// port name on the network net, which must be "udp", "udp4" or
|
// port name on the network net, which must be "udp", "udp4" or
|
||||||
|
@ -74,7 +74,7 @@ func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error) {
|
|||||||
return 0, syscall.EINVAL
|
return 0, syscall.EINVAL
|
||||||
}
|
}
|
||||||
if addr == nil {
|
if addr == nil {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: errMissingAddress}
|
return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
h := new(udpHeader)
|
h := new(udpHeader)
|
||||||
h.raddr = addr.IP.To16()
|
h.raddr = addr.IP.To16()
|
||||||
@ -87,7 +87,7 @@ func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error) {
|
|||||||
i := copy(buf, h.Bytes())
|
i := copy(buf, h.Bytes())
|
||||||
copy(buf[i:], b)
|
copy(buf[i:], b)
|
||||||
if _, err := c.fd.data.Write(buf); err != nil {
|
if _, err := c.fd.data.Write(buf); err != nil {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: err}
|
return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return len(b), nil
|
return len(b), nil
|
||||||
}
|
}
|
||||||
@ -110,7 +110,7 @@ func (c *UDPConn) WriteTo(b []byte, addr Addr) (int, error) {
|
|||||||
// out-of-band data is copied from oob. It returns the number of
|
// out-of-band data is copied from oob. It returns the number of
|
||||||
// payload and out-of-band bytes written.
|
// payload and out-of-band bytes written.
|
||||||
func (c *UDPConn) WriteMsgUDP(b, oob []byte, addr *UDPAddr) (n, oobn int, err error) {
|
func (c *UDPConn) WriteMsgUDP(b, oob []byte, addr *UDPAddr) (n, oobn int, err error) {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: syscall.EPLAN9}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialUDP connects to the remote address raddr on the network net,
|
// DialUDP connects to the remote address raddr on the network net,
|
||||||
@ -127,10 +127,10 @@ func dialUDP(net string, laddr, raddr *UDPAddr, deadline time.Time) (*UDPConn, e
|
|||||||
switch net {
|
switch net {
|
||||||
case "udp", "udp4", "udp6":
|
case "udp", "udp4", "udp6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
if raddr == nil {
|
if raddr == nil {
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: errMissingAddress}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
fd, err := dialPlan9(net, laddr, raddr)
|
fd, err := dialPlan9(net, laddr, raddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -178,7 +178,7 @@ func ListenUDP(net string, laddr *UDPAddr) (*UDPConn, error) {
|
|||||||
switch net {
|
switch net {
|
||||||
case "udp", "udp4", "udp6":
|
case "udp", "udp4", "udp6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
if laddr == nil {
|
if laddr == nil {
|
||||||
laddr = &UDPAddr{}
|
laddr = &UDPAddr{}
|
||||||
@ -211,5 +211,5 @@ func ListenUDP(net string, laddr *UDPAddr) (*UDPConn, error) {
|
|||||||
// applications. There are golang.org/x/net/ipv4 and
|
// applications. There are golang.org/x/net/ipv4 and
|
||||||
// golang.org/x/net/ipv6 packages for general purpose uses.
|
// golang.org/x/net/ipv6 packages for general purpose uses.
|
||||||
func ListenMulticastUDP(network string, ifi *Interface, gaddr *UDPAddr) (*UDPConn, error) {
|
func ListenMulticastUDP(network string, ifi *Interface, gaddr *UDPAddr) (*UDPConn, error) {
|
||||||
return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: gaddr, Err: syscall.EPLAN9}
|
return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: gaddr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
@ -118,18 +118,18 @@ func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error) {
|
|||||||
return 0, syscall.EINVAL
|
return 0, syscall.EINVAL
|
||||||
}
|
}
|
||||||
if c.fd.isConnected {
|
if c.fd.isConnected {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: ErrWriteToConnected}
|
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
|
||||||
}
|
}
|
||||||
if addr == nil {
|
if addr == nil {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: errMissingAddress}
|
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
sa, err := addr.sockaddr(c.fd.family)
|
sa, err := addr.sockaddr(c.fd.family)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: err}
|
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
n, err := c.fd.writeTo(b, sa)
|
n, err := c.fd.writeTo(b, sa)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: err}
|
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
@ -156,19 +156,19 @@ func (c *UDPConn) WriteMsgUDP(b, oob []byte, addr *UDPAddr) (n, oobn int, err er
|
|||||||
return 0, 0, syscall.EINVAL
|
return 0, 0, syscall.EINVAL
|
||||||
}
|
}
|
||||||
if c.fd.isConnected && addr != nil {
|
if c.fd.isConnected && addr != nil {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: ErrWriteToConnected}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
|
||||||
}
|
}
|
||||||
if !c.fd.isConnected && addr == nil {
|
if !c.fd.isConnected && addr == nil {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: errMissingAddress}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
var sa syscall.Sockaddr
|
var sa syscall.Sockaddr
|
||||||
sa, err = addr.sockaddr(c.fd.family)
|
sa, err = addr.sockaddr(c.fd.family)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: err}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
n, oobn, err = c.fd.writeMsg(b, oob, sa)
|
n, oobn, err = c.fd.writeMsg(b, oob, sa)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: err}
|
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -180,10 +180,10 @@ func DialUDP(net string, laddr, raddr *UDPAddr) (*UDPConn, error) {
|
|||||||
switch net {
|
switch net {
|
||||||
case "udp", "udp4", "udp6":
|
case "udp", "udp4", "udp6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
if raddr == nil {
|
if raddr == nil {
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: errMissingAddress}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
return dialUDP(net, laddr, raddr, noDeadline)
|
return dialUDP(net, laddr, raddr, noDeadline)
|
||||||
}
|
}
|
||||||
@ -191,7 +191,7 @@ func DialUDP(net string, laddr, raddr *UDPAddr) (*UDPConn, error) {
|
|||||||
func dialUDP(net string, laddr, raddr *UDPAddr, deadline time.Time) (*UDPConn, error) {
|
func dialUDP(net string, laddr, raddr *UDPAddr, deadline time.Time) (*UDPConn, error) {
|
||||||
fd, err := internetSocket(net, laddr, raddr, deadline, syscall.SOCK_DGRAM, 0, "dial")
|
fd, err := internetSocket(net, laddr, raddr, deadline, syscall.SOCK_DGRAM, 0, "dial")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: err}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return newUDPConn(fd), nil
|
return newUDPConn(fd), nil
|
||||||
}
|
}
|
||||||
@ -207,7 +207,7 @@ func ListenUDP(net string, laddr *UDPAddr) (*UDPConn, error) {
|
|||||||
switch net {
|
switch net {
|
||||||
case "udp", "udp4", "udp6":
|
case "udp", "udp4", "udp6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
if laddr == nil {
|
if laddr == nil {
|
||||||
laddr = &UDPAddr{}
|
laddr = &UDPAddr{}
|
||||||
@ -234,10 +234,10 @@ func ListenMulticastUDP(network string, ifi *Interface, gaddr *UDPAddr) (*UDPCon
|
|||||||
switch network {
|
switch network {
|
||||||
case "udp", "udp4", "udp6":
|
case "udp", "udp4", "udp6":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: gaddr, Err: UnknownNetworkError(network)}
|
return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: gaddr.opAddr(), Err: UnknownNetworkError(network)}
|
||||||
}
|
}
|
||||||
if gaddr == nil || gaddr.IP == nil {
|
if gaddr == nil || gaddr.IP == nil {
|
||||||
return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: gaddr, Err: errMissingAddress}
|
return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: gaddr.opAddr(), Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
fd, err := internetSocket(network, gaddr, nil, noDeadline, syscall.SOCK_DGRAM, 0, "listen")
|
fd, err := internetSocket(network, gaddr, nil, noDeadline, syscall.SOCK_DGRAM, 0, "listen")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -23,6 +23,17 @@ func (a *UnixAddr) String() string {
|
|||||||
return a.Name
|
return a.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *UnixAddr) isWildcard() bool {
|
||||||
|
return a == nil || a.Name == ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *UnixAddr) opAddr() Addr {
|
||||||
|
if a == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
// ResolveUnixAddr parses addr as a Unix domain socket address.
|
// ResolveUnixAddr parses addr as a Unix domain socket address.
|
||||||
// The string net gives the network name, "unix", "unixgram" or
|
// The string net gives the network name, "unix", "unixgram" or
|
||||||
// "unixpacket".
|
// "unixpacket".
|
||||||
|
@ -47,7 +47,7 @@ func (c *UnixConn) ReadMsgUnix(b, oob []byte) (n, oobn, flags int, addr *UnixAdd
|
|||||||
// SetWriteDeadline. On packet-oriented connections, write timeouts
|
// SetWriteDeadline. On packet-oriented connections, write timeouts
|
||||||
// are rare.
|
// are rare.
|
||||||
func (c *UnixConn) WriteToUnix(b []byte, addr *UnixAddr) (int, error) {
|
func (c *UnixConn) WriteToUnix(b []byte, addr *UnixAddr) (int, error) {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: syscall.EPLAN9}
|
return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteTo implements the PacketConn WriteTo method.
|
// WriteTo implements the PacketConn WriteTo method.
|
||||||
@ -59,7 +59,7 @@ func (c *UnixConn) WriteTo(b []byte, addr Addr) (int, error) {
|
|||||||
// from b and the associated out-of-band data from oob. It returns
|
// from b and the associated out-of-band data from oob. It returns
|
||||||
// the number of payload and out-of-band bytes written.
|
// the number of payload and out-of-band bytes written.
|
||||||
func (c *UnixConn) WriteMsgUnix(b, oob []byte, addr *UnixAddr) (n, oobn int, err error) {
|
func (c *UnixConn) WriteMsgUnix(b, oob []byte, addr *UnixAddr) (n, oobn int, err error) {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: syscall.EPLAN9}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CloseRead shuts down the reading side of the Unix domain connection.
|
// CloseRead shuts down the reading side of the Unix domain connection.
|
||||||
@ -82,7 +82,7 @@ func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func dialUnix(net string, laddr, raddr *UnixAddr, deadline time.Time) (*UnixConn, error) {
|
func dialUnix(net string, laddr, raddr *UnixAddr, deadline time.Time) (*UnixConn, error) {
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: syscall.EPLAN9}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnixListener is a Unix domain socket listener. Clients should
|
// UnixListener is a Unix domain socket listener. Clients should
|
||||||
@ -95,7 +95,7 @@ type UnixListener struct {
|
|||||||
// ListenUnix announces on the Unix domain socket laddr and returns a
|
// ListenUnix announces on the Unix domain socket laddr and returns a
|
||||||
// Unix listener. The network net must be "unix" or "unixpacket".
|
// Unix listener. The network net must be "unix" or "unixpacket".
|
||||||
func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error) {
|
func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error) {
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: syscall.EPLAN9}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
|
||||||
// AcceptUnix accepts the next incoming call and returns the new
|
// AcceptUnix accepts the next incoming call and returns the new
|
||||||
@ -143,5 +143,5 @@ func (l *UnixListener) File() (*os.File, error) {
|
|||||||
// The returned connection's ReadFrom and WriteTo methods can be used
|
// The returned connection's ReadFrom and WriteTo methods can be used
|
||||||
// to receive and send packets with per-packet addressing.
|
// to receive and send packets with per-packet addressing.
|
||||||
func ListenUnixgram(net string, laddr *UnixAddr) (*UnixConn, error) {
|
func ListenUnixgram(net string, laddr *UnixAddr) (*UnixConn, error) {
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: syscall.EPLAN9}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: syscall.EPLAN9}
|
||||||
}
|
}
|
||||||
|
@ -87,10 +87,6 @@ func (a *UnixAddr) family() int {
|
|||||||
return syscall.AF_UNIX
|
return syscall.AF_UNIX
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *UnixAddr) isWildcard() bool {
|
|
||||||
return a == nil || a.Name == ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UnixAddr) sockaddr(family int) (syscall.Sockaddr, error) {
|
func (a *UnixAddr) sockaddr(family int) (syscall.Sockaddr, error) {
|
||||||
if a == nil {
|
if a == nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@ -175,18 +171,18 @@ func (c *UnixConn) WriteToUnix(b []byte, addr *UnixAddr) (int, error) {
|
|||||||
return 0, syscall.EINVAL
|
return 0, syscall.EINVAL
|
||||||
}
|
}
|
||||||
if c.fd.isConnected {
|
if c.fd.isConnected {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: ErrWriteToConnected}
|
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
|
||||||
}
|
}
|
||||||
if addr == nil {
|
if addr == nil {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: errMissingAddress}
|
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
if addr.Net != sotypeToNet(c.fd.sotype) {
|
if addr.Net != sotypeToNet(c.fd.sotype) {
|
||||||
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: syscall.EAFNOSUPPORT}
|
return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EAFNOSUPPORT}
|
||||||
}
|
}
|
||||||
sa := &syscall.SockaddrUnix{Name: addr.Name}
|
sa := &syscall.SockaddrUnix{Name: addr.Name}
|
||||||
n, err := c.fd.writeTo(b, sa)
|
n, err := c.fd.writeTo(b, sa)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: err}
|
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
@ -211,18 +207,18 @@ func (c *UnixConn) WriteMsgUnix(b, oob []byte, addr *UnixAddr) (n, oobn int, err
|
|||||||
return 0, 0, syscall.EINVAL
|
return 0, 0, syscall.EINVAL
|
||||||
}
|
}
|
||||||
if c.fd.sotype == syscall.SOCK_DGRAM && c.fd.isConnected {
|
if c.fd.sotype == syscall.SOCK_DGRAM && c.fd.isConnected {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: ErrWriteToConnected}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
|
||||||
}
|
}
|
||||||
var sa syscall.Sockaddr
|
var sa syscall.Sockaddr
|
||||||
if addr != nil {
|
if addr != nil {
|
||||||
if addr.Net != sotypeToNet(c.fd.sotype) {
|
if addr.Net != sotypeToNet(c.fd.sotype) {
|
||||||
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: syscall.EAFNOSUPPORT}
|
return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EAFNOSUPPORT}
|
||||||
}
|
}
|
||||||
sa = &syscall.SockaddrUnix{Name: addr.Name}
|
sa = &syscall.SockaddrUnix{Name: addr.Name}
|
||||||
}
|
}
|
||||||
n, oobn, err = c.fd.writeMsg(b, oob, sa)
|
n, oobn, err = c.fd.writeMsg(b, oob, sa)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: err}
|
err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -260,7 +256,7 @@ func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error) {
|
|||||||
switch net {
|
switch net {
|
||||||
case "unix", "unixgram", "unixpacket":
|
case "unix", "unixgram", "unixpacket":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
return dialUnix(net, laddr, raddr, noDeadline)
|
return dialUnix(net, laddr, raddr, noDeadline)
|
||||||
}
|
}
|
||||||
@ -268,7 +264,7 @@ func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error) {
|
|||||||
func dialUnix(net string, laddr, raddr *UnixAddr, deadline time.Time) (*UnixConn, error) {
|
func dialUnix(net string, laddr, raddr *UnixAddr, deadline time.Time) (*UnixConn, error) {
|
||||||
fd, err := unixSocket(net, laddr, raddr, "dial", deadline)
|
fd, err := unixSocket(net, laddr, raddr, "dial", deadline)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: err}
|
return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return newUnixConn(fd), nil
|
return newUnixConn(fd), nil
|
||||||
}
|
}
|
||||||
@ -287,14 +283,14 @@ func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error) {
|
|||||||
switch net {
|
switch net {
|
||||||
case "unix", "unixpacket":
|
case "unix", "unixpacket":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
if laddr == nil {
|
if laddr == nil {
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: errMissingAddress}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
fd, err := unixSocket(net, laddr, nil, "listen", noDeadline)
|
fd, err := unixSocket(net, laddr, nil, "listen", noDeadline)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: err}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return &UnixListener{fd: fd, path: fd.laddr.String()}, nil
|
return &UnixListener{fd: fd, path: fd.laddr.String()}, nil
|
||||||
}
|
}
|
||||||
@ -389,14 +385,14 @@ func ListenUnixgram(net string, laddr *UnixAddr) (*UnixConn, error) {
|
|||||||
switch net {
|
switch net {
|
||||||
case "unixgram":
|
case "unixgram":
|
||||||
default:
|
default:
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: UnknownNetworkError(net)}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
|
||||||
}
|
}
|
||||||
if laddr == nil {
|
if laddr == nil {
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: errMissingAddress}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: nil, Err: errMissingAddress}
|
||||||
}
|
}
|
||||||
fd, err := unixSocket(net, laddr, nil, "listen", noDeadline)
|
fd, err := unixSocket(net, laddr, nil, "listen", noDeadline)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: err}
|
return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: err}
|
||||||
}
|
}
|
||||||
return newUnixConn(fd), nil
|
return newUnixConn(fd), nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user