|  | // 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 dragonfly freebsd netbsd openbsd | 
|  |  | 
|  | package net | 
|  |  | 
|  | import ( | 
|  | "runtime" | 
|  | "syscall" | 
|  | ) | 
|  |  | 
|  | func maxListenerBacklog() int { | 
|  | var ( | 
|  | n   uint32 | 
|  | err error | 
|  | ) | 
|  | switch runtime.GOOS { | 
|  | case "darwin": | 
|  | n, err = syscall.SysctlUint32("kern.ipc.somaxconn") | 
|  | case "freebsd": | 
|  | n, err = syscall.SysctlUint32("kern.ipc.soacceptqueue") | 
|  | case "netbsd": | 
|  | // NOTE: NetBSD has no somaxconn-like kernel state so far | 
|  | case "openbsd": | 
|  | n, err = syscall.SysctlUint32("kern.somaxconn") | 
|  | } | 
|  | if n == 0 || err != nil { | 
|  | return syscall.SOMAXCONN | 
|  | } | 
|  | // FreeBSD stores the backlog in a uint16, as does Linux. | 
|  | // Assume the other BSDs do too. Truncate number to avoid wrapping. | 
|  | // See issue 5030. | 
|  | if n > 1<<16-1 { | 
|  | n = 1<<16 - 1 | 
|  | } | 
|  | return int(n) | 
|  | } |