blob: 7c693a271f7898adf5475fe5977055a09127bfe5 [file] [log] [blame]
Mikio Harad3c59f62012-01-14 13:42:18 +09001// 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
9package net
10
11import (
12 "runtime"
13 "syscall"
14)
15
16func 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}
Mikio Hara2f63afd2012-02-01 01:53:26 +090034
35func 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 *UDPAddr:
42 if v.IP.IsMulticast() {
43 err := setDefaultMulticastSockopts(s)
44 if err != nil {
45 return nil, err
46 }
47 switch f {
48 case syscall.AF_INET:
49 v.IP = IPv4zero
50 case syscall.AF_INET6:
51 v.IP = IPv6unspecified
52 }
53 return v.sockaddr(f)
54 }
55 }
56 return la, nil
57}