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  }