37 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			37 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// 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 unix
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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)(cmsgData(h))) = *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
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
							 | 
						||
| 
								 | 
							
									return &ucred, nil
							 | 
						||
| 
								 | 
							
								}
							 |