| // Copyright 2011 The Go Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style | 
 | // license that can be found in the LICENSE file. | 
 |  | 
 | // Socket control messages | 
 |  | 
 | package syscall | 
 |  | 
 | import "unsafe" | 
 |  | 
 | // UnixCredentials encodes credentials into a socket control message | 
 | // for sending to another process. This can be used for | 
 | // authentication. | 
 | func UnixCredentials(ucred *Ucred) []byte { | 
 | 	b := make([]byte, CmsgSpace(SizeofUcred)) | 
 | 	h := (*Cmsghdr)(unsafe.Pointer(&b[0])) | 
 | 	h.Level = SOL_SOCKET | 
 | 	h.Type = SCM_CREDENTIALS | 
 | 	h.SetLen(CmsgLen(SizeofUcred)) | 
 | 	*(*Ucred)(h.data(0)) = *ucred | 
 | 	return b | 
 | } | 
 |  | 
 | // ParseUnixCredentials decodes a socket control message that contains | 
 | // credentials in a Ucred structure. To receive such a message, the | 
 | // SO_PASSCRED option must be enabled on the socket. | 
 | func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) { | 
 | 	if m.Header.Level != SOL_SOCKET { | 
 | 		return nil, EINVAL | 
 | 	} | 
 | 	if m.Header.Type != SCM_CREDENTIALS { | 
 | 		return nil, EINVAL | 
 | 	} | 
 | 	if uintptr(len(m.Data)) < unsafe.Sizeof(Ucred{}) { | 
 | 		return nil, EINVAL | 
 | 	} | 
 | 	ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0])) | 
 | 	return &ucred, nil | 
 | } |