From c68be0b84673b78278d86eb8ca6d71b5ca2cfb65 Mon Sep 17 00:00:00 2001 From: Liangbin Lian Date: Wed, 18 Nov 2020 23:20:38 +0800 Subject: [PATCH] libs/libtirpc: fix host compile with clang 12.0.0 1.clang ld not supports symvers 2.macos has not mutex_lock, use pthread_mutex_lock instead 3.macos not define SO_PEERCRED, use LOCAL_PEERCRED instead Signed-off-by: Liangbin Lian (cherry picked from commit 1a9323064ccf140f7ec7ac6fc2540ec83cf4fd1c) --- libs/libtirpc/Makefile | 6 +- libs/libtirpc/patches/001-clang.patch | 103 ++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 libs/libtirpc/patches/001-clang.patch diff --git a/libs/libtirpc/Makefile b/libs/libtirpc/Makefile index 33b565a86e..cc773bac9b 100644 --- a/libs/libtirpc/Makefile +++ b/libs/libtirpc/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libtirpc PKG_VERSION:=1.2.6 -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_SOURCE_URL:=@SF/libtirpc PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 @@ -30,6 +30,10 @@ endef CONFIGURE_ARGS += --disable-gssapi HOST_CONFIGURE_ARGS += --disable-gssapi +ifeq ($(HOST_OS),Darwin) +HOST_CONFIGURE_ARGS += --disable-symvers +endif + TARGET_CFLAGS += -DGQ HOST_CFLAGS += -DGQ diff --git a/libs/libtirpc/patches/001-clang.patch b/libs/libtirpc/patches/001-clang.patch new file mode 100644 index 0000000000..53da7f8e64 --- /dev/null +++ b/libs/libtirpc/patches/001-clang.patch @@ -0,0 +1,103 @@ +--- 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 + } -- 2.30.2