OSDN Git Service

net, syscall: Use native endianness for GNU/Linux netlink code.
[pf3gnuchains/gcc-fork.git] / libgo / go / 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 }