38 lines
		
	
	
		
			915 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			915 B
		
	
	
	
		
			C
		
	
	
	
	
	
#include <errno.h>
 | 
						|
#include <string.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <sys/socket.h>
 | 
						|
#include <sys/ucred.h>
 | 
						|
 | 
						|
/*
 | 
						|
 * get the effective user ID and effective group ID of a peer
 | 
						|
 * connected through a Unix domain socket.
 | 
						|
 */
 | 
						|
int getpeereid(int sd, uid_t *euid, gid_t *egid) {
 | 
						|
	int rc;
 | 
						|
	struct uucred cred;
 | 
						|
	socklen_t ucred_length;
 | 
						|
 | 
						|
	/* Initialize Data Structures */
 | 
						|
	ucred_length = sizeof(struct uucred);
 | 
						|
	memset(&cred, '\0', ucred_length);
 | 
						|
 | 
						|
	/* Validate Input Parameters */
 | 
						|
	if (euid == NULL || egid == NULL) {
 | 
						|
		errno = EFAULT;
 | 
						|
		return -1;
 | 
						|
	} /* getsockopt will handle validating 'sd' */
 | 
						|
 | 
						|
	/* Get the credentials of the peer at the other end of 'sd' */
 | 
						|
	rc = getsockopt(sd, SOL_SOCKET, SO_PEERCRED, &cred, &ucred_length);
 | 
						|
	if (rc == 0) {
 | 
						|
		/* Success - return the results */
 | 
						|
		*euid = cred.cr_uid;
 | 
						|
		*egid = cred.cr_gid;
 | 
						|
		return 0;
 | 
						|
	} else {
 | 
						|
		/* Failure - getsockopt takes care of setting errno */
 | 
						|
		return -1;
 | 
						|
	}
 | 
						|
}
 |