2013-02-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
[official-gcc.git] / libgo / go / net / sock_posix.go
blob9cd149e466b381237ff75af45a152f01ab45e25d
1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // +build darwin freebsd linux netbsd openbsd windows
7 // Sockets
9 package net
11 import (
12 "syscall"
13 "time"
16 var listenerBacklog = maxListenerBacklog()
18 // Generic socket creation.
19 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) {
20 s, err := sysSocket(f, t, p)
21 if err != nil {
22 return nil, err
25 if err = setDefaultSockopts(s, f, t, ipv6only); err != nil {
26 closesocket(s)
27 return nil, err
30 if ulsa != nil {
31 // We provide a socket that listens to a wildcard
32 // address with reusable UDP port when the given ulsa
33 // is an appropriate UDP multicast address prefix.
34 // This makes it possible for a single UDP listener
35 // to join multiple different group addresses, for
36 // multiple UDP listeners that listen on the same UDP
37 // port to join the same group address.
38 if ulsa, err = listenerSockaddr(s, f, ulsa, toAddr); err != nil {
39 closesocket(s)
40 return nil, err
42 if err = syscall.Bind(s, ulsa); err != nil {
43 closesocket(s)
44 return nil, err
48 if fd, err = newFD(s, f, t, net); err != nil {
49 closesocket(s)
50 return nil, err
53 if ursa != nil {
54 fd.wdeadline.setTime(deadline)
55 if err = fd.connect(ursa); err != nil {
56 closesocket(s)
57 return nil, err
59 fd.isConnected = true
60 fd.wdeadline.set(0)
63 lsa, _ := syscall.Getsockname(s)
64 laddr := toAddr(lsa)
65 rsa, _ := syscall.Getpeername(s)
66 raddr := toAddr(rsa)
67 fd.setAddr(laddr, raddr)
68 return fd, nil