mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-03 13:40:37 -05:00
ITS#3439 (NetBSD support for getpeereid())
This commit is contained in:
parent
542f3634aa
commit
fd0b7e75b1
2 changed files with 54 additions and 2 deletions
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue