summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjsorg71 <jay.sorg@gmail.com>2015-03-23 21:19:18 -0700
committerjsorg71 <jay.sorg@gmail.com>2015-03-23 21:19:18 -0700
commit7f8ec757de53dbe2f4a19b5bf0a3edccbf31a0ef (patch)
treee12e58be2b7d19d45f87df9134fb5c98d0f2fe2e
parentdb3817bf859f4200ded4aa1d938734fdeb33a60f (diff)
parent1f844b2d0e3090cd6894eca990b761ca3a98f634 (diff)
downloadxrdp-proprietary-7f8ec757de53dbe2f4a19b5bf0a3edccbf31a0ef.tar.gz
xrdp-proprietary-7f8ec757de53dbe2f4a19b5bf0a3edccbf31a0ef.zip
Merge pull request #231 from metalefty/g_sck_get_peer_cred
common: workaround for #146
-rw-r--r--common/os_calls.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/common/os_calls.c b/common/os_calls.c
index 611cf420..50d7e549 100644
--- a/common/os_calls.c
+++ b/common/os_calls.c
@@ -86,6 +86,12 @@ extern char **environ;
#include <linux/unistd.h>
#endif
+/* sys/ucred.h needs to be included to use struct xucred
+ * in FreeBSD and OS X. No need for other BSDs */
+#if defined(__FreeBSD__) || defined(__APPLE__)
+#include <sys/ucred.h>
+#endif
+
/* for solaris */
#if !defined(PF_LOCAL)
#define PF_LOCAL AF_UNIX
@@ -656,6 +662,28 @@ g_sck_get_peer_cred(int sck, int *pid, int *uid, int *gid)
*gid = credentials.gid;
}
return 0;
+#elif defined(LOCAL_PEERCRED)
+ /* FreeBSD, OS X reach here*/
+ struct xucred xucred;
+ unsigned int xucred_length;
+ xucred_length = sizeof(xucred);
+
+ if (getsockopt(sck, SOL_SOCKET, LOCAL_PEERCRED, &xucred, &xucred_length))
+ {
+ return 1;
+ }
+ if (pid !=0)
+ {
+ *pid = 0; /* can't get pid in FreeBSD, OS X */
+ }
+ if (uid != 0)
+ {
+ *uid = xucred.cr_uid;
+ }
+ if (gid != 0) {
+ *gid = xucred.cr_gid;
+ }
+ return 0;
#else
return 1;
#endif