--- 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 <pthread.h>
 
--- 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 <pthread.h>
 #include <reentrant.h>
 #include <sys/types.h>
--- a/src/svc_raw.c
+++ b/src/svc_raw.c
@@ -43,6 +43,7 @@
 #include <sys/types.h>
 #include <rpc/raw.h>
 #include <stdlib.h>
+#include <string.h>
 
 #ifndef UDPMSGSIZE
 #define	UDPMSGSIZE 8800
--- a/src/getpeereid.c
+++ b/src/getpeereid.c
@@ -29,12 +29,17 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 
+#if __APPLE__ || __FreeBSD__
+#include <sys/ucred.h>
+#endif
+
 #include <errno.h>
 #include <unistd.h>
 
 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
  }
