summaryrefslogtreecommitdiff
path: root/libgo/go/net/sock_posix.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/net/sock_posix.go')
-rw-r--r--libgo/go/net/sock_posix.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/libgo/go/net/sock_posix.go b/libgo/go/net/sock_posix.go
new file mode 100644
index 000000000000..dc5247a7f38e
--- /dev/null
+++ b/libgo/go/net/sock_posix.go
@@ -0,0 +1,83 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin freebsd linux netbsd openbsd windows
+
+// Sockets
+
+package net
+
+import (
+ "io"
+ "syscall"
+)
+
+var listenerBacklog = maxListenerBacklog()
+
+// Generic socket creation.
+func socket(net string, f, t, p int, ipv6only bool, ulsa, ursa syscall.Sockaddr, toAddr func(syscall.Sockaddr) Addr) (fd *netFD, err error) {
+ // See ../syscall/exec_unix.go for description of ForkLock.
+ syscall.ForkLock.RLock()
+ s, err := syscall.Socket(f, t, p)
+ if err != nil {
+ syscall.ForkLock.RUnlock()
+ return nil, err
+ }
+ syscall.CloseOnExec(s)
+ syscall.ForkLock.RUnlock()
+
+ if err = setDefaultSockopts(s, f, t, ipv6only); err != nil {
+ closesocket(s)
+ return nil, err
+ }
+
+ var blsa syscall.Sockaddr
+ if ulsa != nil {
+ if blsa, err = listenerSockaddr(s, f, ulsa, toAddr); err != nil {
+ closesocket(s)
+ return nil, err
+ }
+ if err = syscall.Bind(s, blsa); err != nil {
+ closesocket(s)
+ return nil, err
+ }
+ }
+
+ if fd, err = newFD(s, f, t, net); err != nil {
+ closesocket(s)
+ return nil, err
+ }
+
+ if ursa != nil {
+ if err = fd.connect(ursa); err != nil {
+ closesocket(s)
+ fd.Close()
+ return nil, err
+ }
+ fd.isConnected = true
+ }
+
+ lsa, _ := syscall.Getsockname(s)
+ var laddr Addr
+ if ulsa != nil && blsa != ulsa {
+ laddr = toAddr(ulsa)
+ } else {
+ laddr = toAddr(lsa)
+ }
+ rsa, _ := syscall.Getpeername(s)
+ raddr := toAddr(rsa)
+ fd.setAddr(laddr, raddr)
+ return fd, nil
+}
+
+type writerOnly struct {
+ io.Writer
+}
+
+// Fallback implementation of io.ReaderFrom's ReadFrom, when sendfile isn't
+// applicable.
+func genericReadFrom(w io.Writer, r io.Reader) (n int64, err error) {
+ // Use wrapper to hide existing r.ReadFrom from io.Copy.
+ return io.Copy(writerOnly{w}, r)
+}