ITS#3439 (NetBSD support for getpeereid())

This commit is contained in:
Luke Howard 2005-02-03 09:36:25 +00:00
parent 542f3634aa
commit fd0b7e75b1
2 changed files with 54 additions and 2 deletions

View file

@ -40,6 +40,9 @@
#include <sys/stat.h>
#endif
#include <stdlib.h>
int getpeereid( int s, uid_t *euid, gid_t *egid )
{
#ifdef LDAP_PF_LOCAL
@ -95,6 +98,49 @@ int getpeereid( int s, uid_t *euid, gid_t *egid )
return 0;
}
}
#elif defined(SOCKCREDSIZE)
struct msghdr msg;
socklen_t crmsgsize;
void *crmsg;
struct cmsghdr *cmp;
struct sockcred *sc;
memset(&msg, 0, sizeof msg);
crmsgsize = CMSG_SPACE(SOCKCREDSIZE(NGROUPS));
if (crmsgsize == 0)
goto sc_err;
crmsg = malloc(crmsgsize);
if (crmsg == NULL)
goto sc_err;
memset(crmsg, 0, crmsgsize);
msg.msg_control = crmsg;
msg.msg_controllen = crmsgsize;
if (recvmsg(s, &msg, 0) < 0) {
free(crmsg);
goto sc_err;
}
if (msg.msg_controllen == 0 || (msg.msg_flags & MSG_CTRUNC) != 0) {
free(crmsg);
goto sc_err;
}
cmp = CMSG_FIRSTHDR(&msg);
if (cmp->cmsg_level != SOL_SOCKET || cmp->cmsg_type != SCM_CREDS) {
printf("nocreds\n");
goto sc_err;
}
sc = (struct sockcred *)(void *)CMSG_DATA(cmp);
*euid = sc->sc_euid;
*egid = sc->sc_egid;
free(crmsg);
return 0;
sc_err:
#endif
#endif /* LDAP_PF_LOCAL */

View file

@ -978,8 +978,14 @@ static int slap_open_listener(
#endif
#ifdef LDAP_PF_LOCAL
case AF_LOCAL:
addrlen = sizeof(struct sockaddr_un);
break;
#ifdef LOCAL_CREDS
{
int one = 1;
setsockopt(l.sl_sd, 0, LOCAL_CREDS, &one, sizeof one);
}
#endif
addrlen = sizeof(struct sockaddr_un);
break;
#endif
}