Black Lives Matter. Support the Equal Justice Initiative.

Source file src/syscall/sockcmsg_linux.go

Documentation: syscall

     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 "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)(h.data(0)) = *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  	if uintptr(len(m.Data)) < unsafe.Sizeof(Ucred{}) {
    35  		return nil, EINVAL
    36  	}
    37  	ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
    38  	return &ucred, nil
    39  }
    40  

View as plain text