|
|
|
@ -775,6 +775,70 @@ func (sa *SockaddrPPPoE) sockaddr() (unsafe.Pointer, _Socklen, error) { |
|
|
|
|
return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// SockaddrTIPC implements the Sockaddr interface for AF_TIPC type sockets.
|
|
|
|
|
// For more information on TIPC, see: http://tipc.sourceforge.net/.
|
|
|
|
|
type SockaddrTIPC struct { |
|
|
|
|
// Scope is the publication scopes when binding service/service range.
|
|
|
|
|
// Should be set to TIPC_CLUSTER_SCOPE or TIPC_NODE_SCOPE.
|
|
|
|
|
Scope int |
|
|
|
|
|
|
|
|
|
// Addr is the type of address used to manipulate a socket. Addr must be
|
|
|
|
|
// one of:
|
|
|
|
|
// - *TIPCSocketAddr: "id" variant in the C addr union
|
|
|
|
|
// - *TIPCServiceRange: "nameseq" variant in the C addr union
|
|
|
|
|
// - *TIPCServiceName: "name" variant in the C addr union
|
|
|
|
|
//
|
|
|
|
|
// If nil, EINVAL will be returned when the structure is used.
|
|
|
|
|
Addr TIPCAddr |
|
|
|
|
|
|
|
|
|
raw RawSockaddrTIPC |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TIPCAddr is implemented by types that can be used as an address for
|
|
|
|
|
// SockaddrTIPC. It is only implemented by *TIPCSocketAddr, *TIPCServiceRange,
|
|
|
|
|
// and *TIPCServiceName.
|
|
|
|
|
type TIPCAddr interface { |
|
|
|
|
tipcAddrtype() uint8 |
|
|
|
|
tipcAddr() [12]byte |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (sa *TIPCSocketAddr) tipcAddr() [12]byte { |
|
|
|
|
var out [12]byte |
|
|
|
|
copy(out[:], (*(*[unsafe.Sizeof(TIPCSocketAddr{})]byte)(unsafe.Pointer(sa)))[:]) |
|
|
|
|
return out |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (sa *TIPCSocketAddr) tipcAddrtype() uint8 { return TIPC_SOCKET_ADDR } |
|
|
|
|
|
|
|
|
|
func (sa *TIPCServiceRange) tipcAddr() [12]byte { |
|
|
|
|
var out [12]byte |
|
|
|
|
copy(out[:], (*(*[unsafe.Sizeof(TIPCServiceRange{})]byte)(unsafe.Pointer(sa)))[:]) |
|
|
|
|
return out |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (sa *TIPCServiceRange) tipcAddrtype() uint8 { return TIPC_SERVICE_RANGE } |
|
|
|
|
|
|
|
|
|
func (sa *TIPCServiceName) tipcAddr() [12]byte { |
|
|
|
|
var out [12]byte |
|
|
|
|
copy(out[:], (*(*[unsafe.Sizeof(TIPCServiceName{})]byte)(unsafe.Pointer(sa)))[:]) |
|
|
|
|
return out |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (sa *TIPCServiceName) tipcAddrtype() uint8 { return TIPC_SERVICE_ADDR } |
|
|
|
|
|
|
|
|
|
func (sa *SockaddrTIPC) sockaddr() (unsafe.Pointer, _Socklen, error) { |
|
|
|
|
if sa.Addr == nil { |
|
|
|
|
return nil, 0, EINVAL |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sa.raw.Family = AF_TIPC |
|
|
|
|
sa.raw.Scope = int8(sa.Scope) |
|
|
|
|
sa.raw.Addrtype = sa.Addr.tipcAddrtype() |
|
|
|
|
sa.raw.Addr = sa.Addr.tipcAddr() |
|
|
|
|
|
|
|
|
|
return unsafe.Pointer(&sa.raw), SizeofSockaddrTIPC, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { |
|
|
|
|
switch rsa.Addr.Family { |
|
|
|
|
case AF_NETLINK: |
|
|
|
@ -900,6 +964,27 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return sa, nil |
|
|
|
|
case AF_TIPC: |
|
|
|
|
pp := (*RawSockaddrTIPC)(unsafe.Pointer(rsa)) |
|
|
|
|
|
|
|
|
|
sa := &SockaddrTIPC{ |
|
|
|
|
Scope: int(pp.Scope), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Determine which union variant is present in pp.Addr by checking
|
|
|
|
|
// pp.Addrtype.
|
|
|
|
|
switch pp.Addrtype { |
|
|
|
|
case TIPC_SERVICE_RANGE: |
|
|
|
|
sa.Addr = (*TIPCServiceRange)(unsafe.Pointer(&pp.Addr)) |
|
|
|
|
case TIPC_SERVICE_ADDR: |
|
|
|
|
sa.Addr = (*TIPCServiceName)(unsafe.Pointer(&pp.Addr)) |
|
|
|
|
case TIPC_SOCKET_ADDR: |
|
|
|
|
sa.Addr = (*TIPCSocketAddr)(unsafe.Pointer(&pp.Addr)) |
|
|
|
|
default: |
|
|
|
|
return nil, EINVAL |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return sa, nil |
|
|
|
|
} |
|
|
|
|
return nil, EAFNOSUPPORT |
|
|
|
|