vendor/golang.org/x/sys/unix/sockcmsg_linux.go
changeset 242 2a9ec03fe5a1
child 251 1c52a0eeb952
equal deleted inserted replaced
241:e77dad242f4c 242:2a9ec03fe5a1
       
     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 }