github.com/database64128/shadowsocks-go@v1.7.0/conn/sockaddr_linuxsolaris.go (about)

     1  //go:build linux || solaris
     2  
     3  package conn
     4  
     5  import (
     6  	"net/netip"
     7  	"unsafe"
     8  
     9  	"golang.org/x/sys/unix"
    10  )
    11  
    12  func AddrPortToSockaddrValue(addrPort netip.AddrPort) (rsa6 unix.RawSockaddrInet6, namelen uint32) {
    13  	addr, port := addrPort.Addr(), addrPort.Port()
    14  	p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
    15  	p[0] = byte(port >> 8)
    16  	p[1] = byte(port)
    17  	if addr.Is4() {
    18  		rsa6.Family = unix.AF_INET
    19  		a := (*[4]byte)(unsafe.Pointer(&rsa6.Flowinfo))
    20  		*a = addr.As4()
    21  		namelen = unix.SizeofSockaddrInet4
    22  		return
    23  	}
    24  	rsa6.Family = unix.AF_INET6
    25  	rsa6.Addr = addr.As16()
    26  	namelen = unix.SizeofSockaddrInet6
    27  	return
    28  }
    29  
    30  func AddrPortToSockaddrInet4(addrPort netip.AddrPort) unix.RawSockaddrInet4 {
    31  	addr := addrPort.Addr()
    32  	port := addrPort.Port()
    33  	rsa4 := unix.RawSockaddrInet4{
    34  		Family: unix.AF_INET,
    35  		Addr:   addr.As4(),
    36  	}
    37  	p := (*[2]byte)(unsafe.Pointer(&rsa4.Port))
    38  	p[0] = byte(port >> 8)
    39  	p[1] = byte(port)
    40  	return rsa4
    41  }
    42  
    43  func AddrPortToSockaddrInet6(addrPort netip.AddrPort) unix.RawSockaddrInet6 {
    44  	addr := addrPort.Addr()
    45  	port := addrPort.Port()
    46  	rsa6 := unix.RawSockaddrInet6{
    47  		Family: unix.AF_INET6,
    48  		Addr:   addr.As16(),
    49  	}
    50  	p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
    51  	p[0] = byte(port >> 8)
    52  	p[1] = byte(port)
    53  	return rsa6
    54  }