diff options
Diffstat (limited to 'lib/replace/replace.c')
-rw-r--r-- | lib/replace/replace.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/replace/replace.c b/lib/replace/replace.c index f1454cbcd6..d7f9cc1758 100644 --- a/lib/replace/replace.c +++ b/lib/replace/replace.c @@ -860,3 +860,31 @@ void *rep_memalign( size_t align, size_t size ) #endif } #endif + +#ifndef HAVE_GETPEEREID +int rep_getpeereid(int s, uid_t *uid, gid_t *gid) +{ +#if defined(HAVE_PEERCRED) + struct ucred cred; + socklen_t cred_len = sizeof(struct ucred); + int ret; + + ret = getsockopt(s, SOL_SOCKET, SO_PEERCRED, (void *)&cred, &cred_len); + if (ret != 0) { + return -1; + } + + if (cred_len != sizeof(struct ucred)) { + errno = EINVAL; + return -1; + } + + *uid = cred.uid; + *gid = cred.gid; + return 0; +#else + errno = ENOSYS; + return -1; +#endif +} +#endif |