Commit 45cb2e1b authored by Mikio Hara's avatar Mikio Hara

net: make Dial, Listen and ListenPacket return consistent error value

Update #4856

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/12763044
parent ca3ed9f3
...@@ -85,10 +85,10 @@ func parseNetwork(net string) (afnet string, proto int, err error) { ...@@ -85,10 +85,10 @@ func parseNetwork(net string) (afnet string, proto int, err error) {
func resolveAddr(op, net, addr string, deadline time.Time) (Addr, error) { func resolveAddr(op, net, addr string, deadline time.Time) (Addr, error) {
afnet, _, err := parseNetwork(net) afnet, _, err := parseNetwork(net)
if err != nil { if err != nil {
return nil, &OpError{op, net, nil, err} return nil, err
} }
if op == "dial" && addr == "" { if op == "dial" && addr == "" {
return nil, &OpError{op, net, nil, errMissingAddress} return nil, errMissingAddress
} }
switch afnet { switch afnet {
case "unix", "unixgram", "unixpacket": case "unix", "unixgram", "unixpacket":
...@@ -148,7 +148,7 @@ func (d *Dialer) Dial(network, address string) (Conn, error) { ...@@ -148,7 +148,7 @@ func (d *Dialer) Dial(network, address string) (Conn, error) {
func dial(net, addr string, la, ra Addr, deadline time.Time) (c Conn, err error) { func dial(net, addr string, la, ra Addr, deadline time.Time) (c Conn, err error) {
if la != nil && la.Network() != ra.Network() { if la != nil && la.Network() != ra.Network() {
return nil, &OpError{"dial", net, ra, errors.New("mismatched local addr type " + la.Network())} return nil, &OpError{Op: "dial", Net: net, Addr: ra, Err: errors.New("mismatched local address type " + la.Network())}
} }
switch ra := ra.(type) { switch ra := ra.(type) {
case *TCPAddr: case *TCPAddr:
...@@ -164,7 +164,7 @@ func dial(net, addr string, la, ra Addr, deadline time.Time) (c Conn, err error) ...@@ -164,7 +164,7 @@ func dial(net, addr string, la, ra Addr, deadline time.Time) (c Conn, err error)
la, _ := la.(*UnixAddr) la, _ := la.(*UnixAddr)
c, err = dialUnix(net, la, ra, deadline) c, err = dialUnix(net, la, ra, deadline)
default: default:
err = &OpError{"dial", net + " " + addr, ra, UnknownNetworkError(net)} err = &OpError{Op: "dial", Net: net, Addr: ra, Err: &AddrError{Err: "unexpected address type", Addr: addr}}
} }
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -186,15 +186,16 @@ func (a stringAddr) String() string { return a.addr } ...@@ -186,15 +186,16 @@ func (a stringAddr) String() string { return a.addr }
func Listen(net, laddr string) (Listener, error) { func Listen(net, laddr string) (Listener, error) {
la, err := resolveAddr("listen", net, laddr, noDeadline) la, err := resolveAddr("listen", net, laddr, noDeadline)
if err != nil { if err != nil {
return nil, err return nil, &OpError{Op: "listen", Net: net, Addr: nil, Err: err}
} }
switch la := la.(type) { switch la := la.(type) {
case *TCPAddr: case *TCPAddr:
return ListenTCP(net, la) return ListenTCP(net, la)
case *UnixAddr: case *UnixAddr:
return ListenUnix(net, la) return ListenUnix(net, la)
default:
return nil, &OpError{Op: "listen", Net: net, Addr: la, Err: &AddrError{Err: "unexpected address type", Addr: laddr}}
} }
return nil, UnknownNetworkError(net)
} }
// ListenPacket announces on the local network address laddr. // ListenPacket announces on the local network address laddr.
...@@ -204,7 +205,7 @@ func Listen(net, laddr string) (Listener, error) { ...@@ -204,7 +205,7 @@ func Listen(net, laddr string) (Listener, error) {
func ListenPacket(net, laddr string) (PacketConn, error) { func ListenPacket(net, laddr string) (PacketConn, error) {
la, err := resolveAddr("listen", net, laddr, noDeadline) la, err := resolveAddr("listen", net, laddr, noDeadline)
if err != nil { if err != nil {
return nil, err return nil, &OpError{Op: "listen", Net: net, Addr: nil, Err: err}
} }
switch la := la.(type) { switch la := la.(type) {
case *UDPAddr: case *UDPAddr:
...@@ -213,6 +214,7 @@ func ListenPacket(net, laddr string) (PacketConn, error) { ...@@ -213,6 +214,7 @@ func ListenPacket(net, laddr string) (PacketConn, error) {
return ListenIP(net, la) return ListenIP(net, la)
case *UnixAddr: case *UnixAddr:
return ListenUnixgram(net, la) return ListenUnixgram(net, la)
default:
return nil, &OpError{Op: "listen", Net: net, Addr: la, Err: &AddrError{Err: "unexpected address type", Addr: laddr}}
} }
return nil, UnknownNetworkError(net)
} }
...@@ -24,7 +24,7 @@ func resolveAndDialChannel(net, addr string, localAddr Addr, deadline time.Time) ...@@ -24,7 +24,7 @@ func resolveAndDialChannel(net, addr string, localAddr Addr, deadline time.Time)
if timeout <= 0 { if timeout <= 0 {
ra, err := resolveAddr("dial", net, addr, noDeadline) ra, err := resolveAddr("dial", net, addr, noDeadline)
if err != nil { if err != nil {
return nil, err return nil, &OpError{Op: "dial", Net: net, Addr: nil, Err: err}
} }
return dial(net, addr, localAddr, ra, noDeadline) return dial(net, addr, localAddr, ra, noDeadline)
} }
...@@ -42,7 +42,7 @@ func resolveAndDialChannel(net, addr string, localAddr Addr, deadline time.Time) ...@@ -42,7 +42,7 @@ func resolveAndDialChannel(net, addr string, localAddr Addr, deadline time.Time)
} }
ra, err := resolveAddr("dial", net, addr, noDeadline) ra, err := resolveAddr("dial", net, addr, noDeadline)
if err != nil { if err != nil {
ch <- pair{nil, err} ch <- pair{nil, &OpError{Op: "dial", Net: net, Addr: nil, Err: err}}
return return
} }
resolvedAddr <- ra // in case we need it for OpError resolvedAddr <- ra // in case we need it for OpError
...@@ -64,7 +64,7 @@ func resolveAndDialChannel(net, addr string, localAddr Addr, deadline time.Time) ...@@ -64,7 +64,7 @@ func resolveAndDialChannel(net, addr string, localAddr Addr, deadline time.Time)
Op: "dial", Op: "dial",
Net: net, Net: net,
Addr: ra, Addr: ra,
Err: &timeoutError{}, Err: errTimeout,
} }
return nil, err return nil, err
case p := <-ch: case p := <-ch:
......
...@@ -41,7 +41,7 @@ func sysInit() { ...@@ -41,7 +41,7 @@ func sysInit() {
func resolveAndDial(net, addr string, localAddr Addr, deadline time.Time) (Conn, error) { func resolveAndDial(net, addr string, localAddr Addr, deadline time.Time) (Conn, error) {
ra, err := resolveAddr("dial", net, addr, deadline) ra, err := resolveAddr("dial", net, addr, deadline)
if err != nil { if err != nil {
return nil, err return nil, &OpError{Op: "dial", Net: net, Addr: nil, Err: err}
} }
return dial(net, addr, localAddr, ra, deadline) return dial(net, addr, localAddr, ra, deadline)
} }
......
...@@ -87,7 +87,7 @@ func resolveAndDial(net, addr string, localAddr Addr, deadline time.Time) (Conn, ...@@ -87,7 +87,7 @@ func resolveAndDial(net, addr string, localAddr Addr, deadline time.Time) (Conn,
} }
ra, err := resolveAddr("dial", net, addr, deadline) ra, err := resolveAddr("dial", net, addr, deadline)
if err != nil { if err != nil {
return nil, err return nil, &OpError{Op: "dial", Net: net, Addr: nil, Err: err}
} }
return dial(net, addr, localAddr, ra, deadline) return dial(net, addr, localAddr, ra, deadline)
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment