--- a/tirpc/reentrant.h +++ b/tirpc/reentrant.h @@ -36,7 +36,7 @@ * These definitions are only guaranteed to be valid on Linux. */ -#if defined(__linux__) +#if defined(__linux__) || defined(__MACH__) #include --- a/tirpc/rpc/rpcent.h +++ b/tirpc/rpc/rpcent.h @@ -50,7 +50,7 @@ extern "C" { /* These are defined in /usr/include/rpc/netdb.h, unless we are using the C library without RPC support. */ -#if defined(__UCLIBC__) && !defined(__UCLIBC_HAS_RPC__) || !defined(__GLIBC__) +#if (defined(__UCLIBC__) && !defined(__UCLIBC_HAS_RPC__) || !defined(__GLIBC__)) && !defined(__MACH__) struct rpcent { char *r_name; /* name of server for this rpc program */ char **r_aliases; /* alias list */ --- a/src/rpc_com.h +++ b/src/rpc_com.h @@ -63,6 +63,14 @@ void __xprt_set_raddr(SVCXPRT *, const s extern int __svc_maxrec; +#ifndef SOL_IP +#define SOL_IP IPPROTO_IP +#endif + +#ifndef SOL_IPV6 +#define SOL_IPV6 IPPROTO_IPV6 +#endif + #ifdef __cplusplus } #endif --- a/src/svc_dg.c +++ b/src/svc_dg.c @@ -37,6 +37,11 @@ * * Does some caching in the hopes of achieving execute-at-most-once semantics. */ + +#ifdef __APPLE__ +#define __APPLE_USE_RFC_3542 +#endif + #include #include #include --- a/src/svc_raw.c +++ b/src/svc_raw.c @@ -43,6 +43,7 @@ #include #include #include +#include #ifndef UDPMSGSIZE #define UDPMSGSIZE 8800 --- a/src/getpeereid.c +++ b/src/getpeereid.c @@ -29,12 +29,17 @@ #include #include +#if __APPLE__ || __FreeBSD__ +#include +#endif + #include #include int getpeereid(int s, uid_t *euid, gid_t *egid) { +#if defined(SO_PEERCRED) struct ucred uc; socklen_t uclen; int error; @@ -48,4 +53,19 @@ getpeereid(int s, uid_t *euid, gid_t *eg *euid = uc.uid; *egid = uc.gid; return (0); +#elif defined(LOCAL_PEERCRED) + struct xucred uc; + socklen_t uclen; + int error; + + uclen = sizeof(uc); + error = getsockopt(s, SOL_LOCAL, LOCAL_PEERCRED, &uc, &uclen); /* SCM_CREDENTIALS */ + if (error != 0) + return (error); + *euid = uc.cr_uid; + *egid = uc.cr_gid; + return (0); +#else + return (ENOTSUP); +#endif }