Imported Upstream version 4.7.2
[platform/upstream/gcc48.git] / libgo / go / net / sock_bsd.go
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.
4
5 // +build darwin freebsd netbsd openbsd
6
7 // Sockets for BSD variants
8
9 package net
10
11 import (
12         "runtime"
13         "syscall"
14 )
15
16 func maxListenerBacklog() int {
17         var (
18                 n   uint32
19                 err error
20         )
21         switch runtime.GOOS {
22         case "darwin", "freebsd":
23                 n, err = syscall.SysctlUint32("kern.ipc.somaxconn")
24         case "netbsd":
25                 // NOTE: NetBSD has no somaxconn-like kernel state so far
26         case "openbsd":
27                 n, err = syscall.SysctlUint32("kern.somaxconn")
28         }
29         if n == 0 || err != nil {
30                 return syscall.SOMAXCONN
31         }
32         return int(n)
33 }
34
35 func listenerSockaddr(s, f int, la syscall.Sockaddr, toAddr func(syscall.Sockaddr) Addr) (syscall.Sockaddr, error) {
36         a := toAddr(la)
37         if a == nil {
38                 return la, nil
39         }
40         switch v := a.(type) {
41         case *TCPAddr, *UnixAddr:
42                 err := setDefaultListenerSockopts(s)
43                 if err != nil {
44                         return nil, err
45                 }
46         case *UDPAddr:
47                 if v.IP.IsMulticast() {
48                         err := setDefaultMulticastSockopts(s)
49                         if err != nil {
50                                 return nil, err
51                         }
52                         switch f {
53                         case syscall.AF_INET:
54                                 v.IP = IPv4zero
55                         case syscall.AF_INET6:
56                                 v.IP = IPv6unspecified
57                         }
58                         return v.sockaddr(f)
59                 }
60         }
61         return la, nil
62 }