diff options
author | Michael Stapelberg <stapelberg@debian.org> | 2013-03-04 21:27:36 +0100 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2013-03-04 21:27:36 +0100 |
commit | 04b08da9af0c450d645ab7389d1467308cfc2db8 (patch) | |
tree | db247935fa4f2f94408edc3acd5d0d4f997aa0d8 /src/pkg/net/sock_posix.go | |
parent | 917c5fb8ec48e22459d77e3849e6d388f93d3260 (diff) | |
download | golang-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.go | 67 |
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 +} |