libs/libtirpc: fix host compile with clang 12.0.0 13943/head
authorLiangbin Lian <jjm2473@gmail.com>
Wed, 18 Nov 2020 15:20:38 +0000 (23:20 +0800)
committerLiangbin Lian <jjm2473@gmail.com>
Wed, 18 Nov 2020 16:28:29 +0000 (00:28 +0800)
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 <jjm2473@gmail.com>
(cherry picked from commit 1a9323064ccf140f7ec7ac6fc2540ec83cf4fd1c)

libs/libtirpc/Makefile
libs/libtirpc/patches/001-clang.patch [new file with mode: 0644]

index 33b565a86e7f032697e45ffa6d41ef2aaf9ae6c4..cc773bac9bfb9e23c5f1deb07316547f4b3ea6f7 100644 (file)
@@ -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 (file)
index 0000000..53da7f8
--- /dev/null
@@ -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 <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
+  }