github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/net/sock_unix.go (about) 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 freebsd linux netbsd openbsd 6 7 package net 8 9 import "syscall" 10 11 func listenerSockaddr(s, f int, la syscall.Sockaddr, toAddr func(syscall.Sockaddr) Addr) (syscall.Sockaddr, error) { 12 a := toAddr(la) 13 if a == nil { 14 return la, nil 15 } 16 switch a := a.(type) { 17 case *TCPAddr, *UnixAddr: 18 if err := setDefaultListenerSockopts(s); err != nil { 19 return nil, err 20 } 21 case *UDPAddr: 22 if a.IP.IsMulticast() { 23 if err := setDefaultMulticastSockopts(s); err != nil { 24 return nil, err 25 } 26 switch f { 27 case syscall.AF_INET: 28 a.IP = IPv4zero 29 case syscall.AF_INET6: 30 a.IP = IPv6unspecified 31 } 32 return a.sockaddr(f) 33 } 34 } 35 return la, nil 36 }