github.com/Andyfoo/golang/x/sys@v0.0.0-20190901054642-57c1bf301704/unix/sockcmsg_linux.go (about)

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