OLD | NEW |
1 // Copyright 2009 The Go Authors. All rights reserved. | 1 // Copyright 2009 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 // +build darwin freebsd linux netbsd openbsd windows | 5 // +build darwin freebsd linux netbsd openbsd windows |
6 | 6 |
7 // Sockets | 7 // Sockets |
8 | 8 |
9 package net | 9 package net |
10 | 10 |
11 import ( | 11 import ( |
12 "io" | 12 "io" |
13 "syscall" | 13 "syscall" |
14 ) | 14 ) |
15 | 15 |
16 var listenerBacklog = maxListenerBacklog() | 16 var listenerBacklog = maxListenerBacklog() |
17 | 17 |
18 // Generic socket creation. | 18 // Generic socket creation. |
19 func socket(net string, f, t, p int, ipv6only bool, ulsa, ursa syscall.Sockaddr,
toAddr func(syscall.Sockaddr) Addr) (fd *netFD, err error) { | 19 func socket(net string, f, t, p int, ipv6only bool, ulsa, ursa syscall.Sockaddr,
toAddr func(syscall.Sockaddr) Addr, beforeConnect chan<- *netFD) (fd *netFD, er
r error) { |
20 // See ../syscall/exec_unix.go for description of ForkLock. | 20 // See ../syscall/exec_unix.go for description of ForkLock. |
21 syscall.ForkLock.RLock() | 21 syscall.ForkLock.RLock() |
22 s, err := syscall.Socket(f, t, p) | 22 s, err := syscall.Socket(f, t, p) |
23 if err != nil { | 23 if err != nil { |
24 syscall.ForkLock.RUnlock() | 24 syscall.ForkLock.RUnlock() |
25 return nil, err | 25 return nil, err |
26 } | 26 } |
27 syscall.CloseOnExec(s) | 27 syscall.CloseOnExec(s) |
28 syscall.ForkLock.RUnlock() | 28 syscall.ForkLock.RUnlock() |
29 | 29 |
(...skipping 13 matching lines...) Expand all Loading... |
43 return nil, err | 43 return nil, err |
44 } | 44 } |
45 } | 45 } |
46 | 46 |
47 if fd, err = newFD(s, f, t, net); err != nil { | 47 if fd, err = newFD(s, f, t, net); err != nil { |
48 closesocket(s) | 48 closesocket(s) |
49 return nil, err | 49 return nil, err |
50 } | 50 } |
51 | 51 |
52 if ursa != nil { | 52 if ursa != nil { |
| 53 if beforeConnect != nil { |
| 54 beforeConnect <- fd |
| 55 } |
53 if err = fd.connect(ursa); err != nil { | 56 if err = fd.connect(ursa); err != nil { |
54 closesocket(s) | 57 closesocket(s) |
55 fd.Close() | 58 fd.Close() |
56 return nil, err | 59 return nil, err |
57 } | 60 } |
58 fd.isConnected = true | 61 fd.isConnected = true |
59 } | 62 } |
60 | 63 |
61 lsa, _ := syscall.Getsockname(s) | 64 lsa, _ := syscall.Getsockname(s) |
62 var laddr Addr | 65 var laddr Addr |
(...skipping 11 matching lines...) Expand all Loading... |
74 type writerOnly struct { | 77 type writerOnly struct { |
75 io.Writer | 78 io.Writer |
76 } | 79 } |
77 | 80 |
78 // Fallback implementation of io.ReaderFrom's ReadFrom, when sendfile isn't | 81 // Fallback implementation of io.ReaderFrom's ReadFrom, when sendfile isn't |
79 // applicable. | 82 // applicable. |
80 func genericReadFrom(w io.Writer, r io.Reader) (n int64, err error) { | 83 func genericReadFrom(w io.Writer, r io.Reader) (n int64, err error) { |
81 // Use wrapper to hide existing r.ReadFrom from io.Copy. | 84 // Use wrapper to hide existing r.ReadFrom from io.Copy. |
82 return io.Copy(writerOnly{w}, r) | 85 return io.Copy(writerOnly{w}, r) |
83 } | 86 } |
OLD | NEW |