4 * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
10 #ifndef HAVE_GETPEEREID
12 #include <sys/types.h>
13 #include <ac/unistd.h>
15 #include <ac/socket.h>
18 #include <sys/ucred.h>
21 #if !defined(SO_PEERCRED) && !defined(LOCAL_PEERCRED) && defined(HAVE_SENDMSG)
26 int getpeereid( int s, uid_t *euid, gid_t *egid )
29 #if defined( SO_PEERCRED )
30 struct ucred peercred;
31 size_t peercredlen = sizeof peercred;
33 if(( getsockopt( s, SOL_SOCKET, SO_PEERCRED,
34 (void *)&peercred, &peercredlen ) == 0 )
35 && ( peercredlen == sizeof peercred ))
42 #elif defined( LOCAL_PEERCRED )
43 struct xucred peercred;
44 socklen_t peercredlen = sizeof peercred;
46 if(( getsockopt( s, LOCAL_PEERCRED, 1,
47 (void *)&peercred, &peercredlen ) == 0 )
48 && ( peercred.cr_version == XUCRED_VERSION ))
50 *euid = peercred.cr_uid;
51 *egid = peercred.cr_gid;
54 #elif defined( DO_SENDMSG )
56 struct iovec iov = {(char *)&dummy, sizeof(dummy)};
57 struct msghdr msg = {0};
61 msg.msg_accrights = (char *)fd;
62 msg.msg_accrightslen = sizeof(fd);
63 if( recvmsg( s, &msg, 0) >= 0 && msg.msg_accrightslen == sizeof(int) )
65 /* We must receive a valid descriptor, it must be a pipe,
66 * and it must only be accessible by its owner.
68 dummy = fstat( fd[0], &st );
70 if( dummy == 0 && S_ISFIFO(st.st_mode) &&
71 ((st.st_mode & (S_IRWXG|S_IRWXO)) == 0))