Home | History | Annotate | Download | only in net
      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 
      7 package net
      8 
      9 import (
     10 	"runtime"
     11 	"syscall"
     12 )
     13 
     14 func 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