summaryrefslogtreecommitdiff
path: root/lib/replace/replace.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/replace/replace.c')
-rw-r--r--lib/replace/replace.c28
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