Source file src/pkg/net/sock_linux.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 // Sockets for Linux
6
7 package net
8
9 import "syscall"
10
11 func maxListenerBacklog() int {
12 fd, err := open("/proc/sys/net/core/somaxconn")
13 if err != nil {
14 return syscall.SOMAXCONN
15 }
16 defer fd.close()
17 l, ok := fd.readLine()
18 if !ok {
19 return syscall.SOMAXCONN
20 }
21 f := getFields(l)
22 n, _, ok := dtoi(f[0], 0)
23 if n == 0 || !ok {
24 return syscall.SOMAXCONN
25 }
26 return n
27 }
28
29 func listenerSockaddr(s, f int, la syscall.Sockaddr, toAddr func(syscall.Sockaddr) Addr) (syscall.Sockaddr, error) {
30 a := toAddr(la)
31 if a == nil {
32 return la, nil
33 }
34 switch v := a.(type) {
35 case *TCPAddr, *UnixAddr:
36 err := setDefaultListenerSockopts(s)
37 if err != nil {
38 return nil, err
39 }
40 case *UDPAddr:
41 if v.IP.IsMulticast() {
42 err := setDefaultMulticastSockopts(s)
43 if err != nil {
44 return nil, err
45 }
46 switch f {
47 case syscall.AF_INET:
48 v.IP = IPv4zero
49 case syscall.AF_INET6:
50 v.IP = IPv6unspecified
51 }
52 return v.sockaddr(f)
53 }
54 }
55 return la, nil
56 }