38
33
return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen)
41
func cmsgData(cmsg *Cmsghdr) unsafe.Pointer {
42
return unsafe.Pointer(uintptr(unsafe.Pointer(cmsg)) + SizeofCmsghdr)
36
func cmsgData(h *Cmsghdr) unsafe.Pointer {
37
return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr)))
40
// SocketControlMessage represents a socket control message.
45
41
type SocketControlMessage struct {
50
func ParseSocketControlMessage(buf []byte) ([]SocketControlMessage, error) {
55
cmsgs []SocketControlMessage
58
for len(buf) >= CmsgLen(0) {
59
h, dbuf, e = socketControlMessageHeaderAndData(buf)
46
// ParseSocketControlMessage parses b as an array of socket control
48
func ParseSocketControlMessage(b []byte) ([]SocketControlMessage, error) {
49
var msgs []SocketControlMessage
51
for i+CmsgLen(0) <= len(b) {
52
h, dbuf, err := socketControlMessageHeaderAndData(b[i:])
63
m := SocketControlMessage{}
65
m.Data = dbuf[:int(h.Len)-cmsgAlignOf(SizeofCmsghdr)]
66
cmsgs = append(cmsgs, m)
67
buf = buf[cmsgAlignOf(int(h.Len)):]
56
m := SocketControlMessage{Header: *h, Data: dbuf}
57
msgs = append(msgs, m)
58
i += cmsgAlignOf(int(h.Len))
73
func socketControlMessageHeaderAndData(buf []byte) (*Cmsghdr, []byte, error) {
74
h := (*Cmsghdr)(unsafe.Pointer(&buf[0]))
75
if h.Len < SizeofCmsghdr || int(h.Len) > len(buf) {
63
func socketControlMessageHeaderAndData(b []byte) (*Cmsghdr, []byte, error) {
64
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
65
if h.Len < SizeofCmsghdr || int(h.Len) > len(b) {
76
66
return nil, nil, EINVAL
78
return h, buf[cmsgAlignOf(SizeofCmsghdr):], nil
68
return h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil
81
71
// UnixRights encodes a set of open file descriptors into a socket
82
72
// control message for sending to another process.
83
73
func UnixRights(fds ...int) []byte {
84
74
datalen := len(fds) * 4
85
buf := make([]byte, CmsgSpace(datalen))
86
cmsg := (*Cmsghdr)(unsafe.Pointer(&buf[0]))
87
cmsg.Level = SOL_SOCKET
88
cmsg.Type = SCM_RIGHTS
89
cmsg.SetLen(CmsgLen(datalen))
91
data := uintptr(cmsgData(cmsg))
75
b := make([]byte, CmsgSpace(datalen))
76
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
79
h.SetLen(CmsgLen(datalen))
80
data := uintptr(cmsgData(h))
92
81
for _, fd := range fds {
93
82
*(*int32)(unsafe.Pointer(data)) = int32(fd)
100
88
// ParseUnixRights decodes a socket control message that contains an
101
89
// integer array of open file descriptors from another process.
102
func ParseUnixRights(msg *SocketControlMessage) ([]int, error) {
103
if msg.Header.Level != SOL_SOCKET {
106
if msg.Header.Type != SCM_RIGHTS {
109
fds := make([]int, len(msg.Data)>>2)
110
for i, j := 0, 0; i < len(msg.Data); i += 4 {
111
fds[j] = int(*(*int32)(unsafe.Pointer(&msg.Data[i])))
90
func ParseUnixRights(m *SocketControlMessage) ([]int, error) {
91
if m.Header.Level != SOL_SOCKET {
94
if m.Header.Type != SCM_RIGHTS {
97
fds := make([]int, len(m.Data)>>2)
98
for i, j := 0, 0; i < len(m.Data); i += 4 {
99
fds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i])))