diff options
| author | jsorg71 <jay.sorg@gmail.com> | 2015-03-23 21:19:18 -0700 |
|---|---|---|
| committer | jsorg71 <jay.sorg@gmail.com> | 2015-03-23 21:19:18 -0700 |
| commit | 7f8ec757de53dbe2f4a19b5bf0a3edccbf31a0ef (patch) | |
| tree | e12e58be2b7d19d45f87df9134fb5c98d0f2fe2e | |
| parent | db3817bf859f4200ded4aa1d938734fdeb33a60f (diff) | |
| parent | 1f844b2d0e3090cd6894eca990b761ca3a98f634 (diff) | |
| download | xrdp-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.c | 28 |
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 |
