summaryrefslogtreecommitdiff
path: root/src/pkg/net/sock_posix.go
diff options
context:
space:
mode:
authorMichael Stapelberg <stapelberg@debian.org>2013-03-04 21:27:36 +0100
committerMichael Stapelberg <michael@stapelberg.de>2013-03-04 21:27:36 +0100
commit04b08da9af0c450d645ab7389d1467308cfc2db8 (patch)
treedb247935fa4f2f94408edc3acd5d0d4f997aa0d8 /src/pkg/net/sock_posix.go
parent917c5fb8ec48e22459d77e3849e6d388f93d3260 (diff)
downloadgolang-upstream/1.1_hg20130304.tar.gz
Imported Upstream version 1.1~hg20130304upstream/1.1_hg20130304
Diffstat (limited to 'src/pkg/net/sock_posix.go')
-rw-r--r--src/pkg/net/sock_posix.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/pkg/net/sock_posix.go b/src/pkg/net/sock_posix.go
new file mode 100644
index 000000000..b50a892b1
--- /dev/null
+++ b/src/pkg/net/sock_posix.go
@@ -0,0 +1,67 @@
+// 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
+
+package net
+
+import (
+ "syscall"
+ "time"
+)
+
+var listenerBacklog = maxListenerBacklog()
+
+// Generic POSIX socket creation.
+func socket(net string, f, t, p int, ipv6only bool, ulsa, ursa syscall.Sockaddr, deadline time.Time, toAddr func(syscall.Sockaddr) Addr) (fd *netFD, err error) {
+ s, err := sysSocket(f, t, p)
+ if err != nil {
+ return nil, err
+ }
+
+ if err = setDefaultSockopts(s, f, t, ipv6only); err != nil {
+ closesocket(s)
+ return nil, err
+ }
+
+ if ulsa != nil {
+ // We provide a socket that listens to a wildcard
+ // address with reusable UDP port when the given ulsa
+ // is an appropriate UDP multicast address prefix.
+ // This makes it possible for a single UDP listener
+ // to join multiple different group addresses, for
+ // multiple UDP listeners that listen on the same UDP
+ // port to join the same group address.
+ if ulsa, err = listenerSockaddr(s, f, ulsa, toAddr); err != nil {
+ closesocket(s)
+ return nil, err
+ }
+ if err = syscall.Bind(s, ulsa); 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 {
+ fd.wdeadline.setTime(deadline)
+ if err = fd.connect(ursa); err != nil {
+ closesocket(s)
+ return nil, err
+ }
+ fd.isConnected = true
+ fd.wdeadline.set(0)
+ }
+
+ lsa, _ := syscall.Getsockname(s)
+ laddr := toAddr(lsa)
+ rsa, _ := syscall.Getpeername(s)
+ raddr := toAddr(rsa)
+ fd.setAddr(laddr, raddr)
+ return fd, nil
+}