package syscall
import (
)
func ( int) int {
return cmsgAlignOf(SizeofCmsghdr) +
}
func ( int) int {
return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf()
}
func ( *Cmsghdr) ( uintptr) unsafe.Pointer {
return unsafe.Pointer(uintptr(unsafe.Pointer()) + uintptr(cmsgAlignOf(SizeofCmsghdr)) + )
}
type SocketControlMessage struct {
Header Cmsghdr
Data []byte
}
func ( []byte) ([]SocketControlMessage, error) {
var []SocketControlMessage
:= 0
for +CmsgLen(0) <= len() {
, , := socketControlMessageHeaderAndData([:])
if != nil {
return nil,
}
:= SocketControlMessage{Header: *, Data: }
= append(, )
+= cmsgAlignOf(int(.Len))
}
return , nil
}
func ( []byte) (*Cmsghdr, []byte, error) {
:= (*Cmsghdr)(unsafe.Pointer(&[0]))
if .Len < SizeofCmsghdr || uint64(.Len) > uint64(len()) {
return nil, nil, EINVAL
}
return , [cmsgAlignOf(SizeofCmsghdr):.Len], nil
}
func ( ...int) []byte {
:= len() * 4
:= make([]byte, CmsgSpace())
:= (*Cmsghdr)(unsafe.Pointer(&[0]))
.Level = SOL_SOCKET
.Type = SCM_RIGHTS
.SetLen(CmsgLen())
for , := range {
*(*int32)(.data(4 * uintptr())) = int32()
}
return
}
func ( *SocketControlMessage) ([]int, error) {
if .Header.Level != SOL_SOCKET {
return nil, EINVAL
}
if .Header.Type != SCM_RIGHTS {
return nil, EINVAL
}
:= make([]int, len(.Data)>>2)
for , := 0, 0; < len(.Data); += 4 {
[] = int(*(*int32)(unsafe.Pointer(&.Data[])))
++
}
return , nil
}