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 dragonfly freebsd netbsd openbsd
6
7package net
8
9import (
10	"runtime"
11	"syscall"
12)
13
14func maxListenerBacklog() int {
15	var (
16		n   uint32
17		err error
18	)
19	switch runtime.GOOS {
20	case "darwin":
21		n, err = syscall.SysctlUint32("kern.ipc.somaxconn")
22	case "freebsd":
23		n, err = syscall.SysctlUint32("kern.ipc.soacceptqueue")
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	// FreeBSD stores the backlog in a uint16, as does Linux.
33	// Assume the other BSDs do too. Truncate number to avoid wrapping.
34	// See issue 5030.
35	if n > 1<<16-1 {
36		n = 1<<16 - 1
37	}
38	return int(n)
39}
40