Source file src/pkg/syscall/sockcmsg_linux.go
1 // Copyright 2011 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 // Socket control messages
6
7 package syscall
8
9 import (
10 "unsafe"
11 )
12
13 // UnixCredentials encodes credentials into a socket control message
14 // for sending to another process. This can be used for
15 // authentication.
16 func UnixCredentials(ucred *Ucred) []byte {
17 buf := make([]byte, CmsgSpace(SizeofUcred))
18 cmsg := (*Cmsghdr)(unsafe.Pointer(&buf[0]))
19 cmsg.Level = SOL_SOCKET
20 cmsg.Type = SCM_CREDENTIALS
21 cmsg.SetLen(CmsgLen(SizeofUcred))
22 *((*Ucred)(cmsgData(cmsg))) = *ucred
23 return buf
24 }
25
26 // ParseUnixCredentials decodes a socket control message that contains
27 // credentials in a Ucred structure. To receive such a message, the
28 // SO_PASSCRED option must be enabled on the socket.
29 func ParseUnixCredentials(msg *SocketControlMessage) (*Ucred, error) {
30 if msg.Header.Level != SOL_SOCKET {
31 return nil, EINVAL
32 }
33 if msg.Header.Type != SCM_CREDENTIALS {
34 return nil, EINVAL
35 }
36 ucred := *(*Ucred)(unsafe.Pointer(&msg.Data[0]))
37 return &ucred, nil
38 }