commit:     30e1bfc4e3a887c19cd0abe4e07fe271721ff8a2
Author:     Kevin Cernekee <cernekee <AT> chromium <DOT> org>
AuthorDate: Wed Jan 18 06:01:48 2017 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Wed Jan 18 06:13:03 2017 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=30e1bfc4

net-libs/libnetfilter_cthelper: add upstream fix for building under clang

Also switch to using subslots w/libmnl.

 .../libnetfilter_cthelper-1.0.0-clang-export.patch | 387 +++++++++++++++++++++
 .../libnetfilter_cthelper-1.0.0-r1.ebuild          |  30 ++
 2 files changed, 417 insertions(+)

diff --git 
a/net-libs/libnetfilter_cthelper/files/libnetfilter_cthelper-1.0.0-clang-export.patch
 
b/net-libs/libnetfilter_cthelper/files/libnetfilter_cthelper-1.0.0-clang-export.patch
new file mode 100644
index 00000000..4958bcd
--- /dev/null
+++ 
b/net-libs/libnetfilter_cthelper/files/libnetfilter_cthelper-1.0.0-clang-export.patch
@@ -0,0 +1,387 @@
+fix from upstream
+
+From f58c5b09fb59baf07c942d373fc4d522b27e73c6 Mon Sep 17 00:00:00 2001
+From: Kevin Cernekee <cerne...@chromium.org>
+Date: Wed, 4 Jan 2017 14:30:26 -0800
+Subject: [PATCH] Use __EXPORTED rather than EXPORT_SYMBOL
+
+clang is sensitive to the ordering of
+__attribute__((visibility("default"))) relative to the function
+body.  gcc is not.  So if we try to re-declare an existing function
+with default visibility, clang prints a warning and generates
+a broken .so file in which nfct_helper_* are not exported to library
+callers.
+
+Move the attribute up into the function definition to make clang happy.
+
+Signed-off-by: Kevin Cernekee <cerne...@chromium.org>
+Signed-off-by: Pablo Neira Ayuso <pa...@netfilter.org>
+---
+ doxygen.cfg.in              |  2 +-
+ src/internal.h              |  5 ++-
+ src/libnetfilter_cthelper.c | 83 ++++++++++++++++++---------------------------
+ 3 files changed, 36 insertions(+), 54 deletions(-)
+
+diff --git a/doxygen.cfg.in b/doxygen.cfg.in
+index cac9b0510b4d..190b7cd6e716 100644
+--- a/doxygen.cfg.in
++++ b/doxygen.cfg.in
+@@ -72,7 +72,7 @@ RECURSIVE              = YES
+ EXCLUDE                = 
+ EXCLUDE_SYMLINKS       = NO
+ EXCLUDE_PATTERNS       = */.git/* .*.d
+-EXCLUDE_SYMBOLS        = EXPORT_SYMBOL
++EXCLUDE_SYMBOLS        = 
+ EXAMPLE_PATH           = 
+ EXAMPLE_PATTERNS       = 
+ EXAMPLE_RECURSIVE      = NO
+diff --git a/src/internal.h b/src/internal.h
+index 3a88d1a1f7d8..5d781718ddad 100644
+--- a/src/internal.h
++++ b/src/internal.h
+@@ -3,10 +3,9 @@
+ 
+ #include "config.h"
+ #ifdef HAVE_VISIBILITY_HIDDEN
+-#     define __visible        __attribute__((visibility("default")))
+-#     define EXPORT_SYMBOL(x) typeof(x) (x) __visible
++#     define __EXPORTED       __attribute__((visibility("default")))
+ #else
+-#     define EXPORT_SYMBOL
++#     define __EXPORTED
+ #endif
+ 
+ #endif
+diff --git a/src/libnetfilter_cthelper.c b/src/libnetfilter_cthelper.c
+index f8f58e6c9c5e..af543a17fafa 100644
+--- a/src/libnetfilter_cthelper.c
++++ b/src/libnetfilter_cthelper.c
+@@ -99,17 +99,16 @@ struct nfct_helper {
+  * In case of success, this function returns a valid pointer, otherwise NULL
+  * s returned and errno is appropriately set.
+  */
+-struct nfct_helper *nfct_helper_alloc(void)
++struct nfct_helper __EXPORTED *nfct_helper_alloc(void)
+ {
+       return calloc(1, sizeof(struct nfct_helper));
+ }
+-EXPORT_SYMBOL(nfct_helper_alloc);
+ 
+ /**
+  * nfct_helper_free - release one helper object
+  * \param nfct_helper pointer to the helper object
+  */
+-void nfct_helper_free(struct nfct_helper *h)
++void __EXPORTED nfct_helper_free(struct nfct_helper *h)
+ {
+       int i;
+ 
+@@ -119,7 +118,6 @@ void nfct_helper_free(struct nfct_helper *h)
+       }
+       free(h);
+ }
+-EXPORT_SYMBOL(nfct_helper_free);
+ 
+ /**
+  * nfct_helper_policy_alloc - allocate a new helper policy object
+@@ -127,21 +125,19 @@ EXPORT_SYMBOL(nfct_helper_free);
+  * In case of success, this function returns a valid pointer, otherwise NULL
+  * s returned and errno is appropriately set.
+  */
+-struct nfct_helper_policy *nfct_helper_policy_alloc(void)
++struct nfct_helper_policy __EXPORTED *nfct_helper_policy_alloc(void)
+ {
+       return calloc(1, sizeof(struct nfct_helper_policy));
+ }
+-EXPORT_SYMBOL(nfct_helper_policy_alloc);
+ 
+ /**
+  * nfct_helper_free - release one helper policy object
+  * \param nfct_helper pointer to the helper object
+  */
+-void nfct_helper_policy_free(struct nfct_helper_policy *p)
++void __EXPORTED nfct_helper_policy_free(struct nfct_helper_policy *p)
+ {
+       free(p);
+ }
+-EXPORT_SYMBOL(nfct_helper_policy_free);
+ 
+ /**
+  * nfct_helper_policy_attr_set - set one attribute of the helper object
+@@ -149,7 +145,7 @@ EXPORT_SYMBOL(nfct_helper_policy_free);
+  * \param type attribute type you want to set
+  * \param data pointer to data that will be used to set this attribute
+  */
+-void
++void __EXPORTED
+ nfct_helper_policy_attr_set(struct nfct_helper_policy *p,
+                           enum nfct_helper_policy_attr_type type,
+                           const void *data)
+@@ -170,7 +166,6 @@ nfct_helper_policy_attr_set(struct nfct_helper_policy *p,
+               break;
+       }
+ }
+-EXPORT_SYMBOL(nfct_helper_policy_attr_set);
+ 
+ /**
+  * nfct_helper_attr_set_str - set one attribute the helper object
+@@ -178,23 +173,21 @@ EXPORT_SYMBOL(nfct_helper_policy_attr_set);
+  * \param type attribute type you want to set
+  * \param name string that will be used to set this attribute
+  */
+-void
++void __EXPORTED
+ nfct_helper_policy_attr_set_str(struct nfct_helper_policy *p,
+                               enum nfct_helper_policy_attr_type type,
+                               const char *name)
+ {
+       nfct_helper_policy_attr_set(p, type, name);
+ }
+-EXPORT_SYMBOL(nfct_helper_policy_attr_set_str);
+ 
+-void
++void __EXPORTED
+ nfct_helper_policy_attr_set_u32(struct nfct_helper_policy *p,
+                               enum nfct_helper_policy_attr_type type,
+                               uint32_t value)
+ {
+       nfct_helper_policy_attr_set(p, type, &value);
+ }
+-EXPORT_SYMBOL(nfct_helper_policy_attr_set_u32);
+ 
+ /**
+  * nfct_helper_attr_set - set one attribute of the helper object
+@@ -202,7 +195,7 @@ EXPORT_SYMBOL(nfct_helper_policy_attr_set_u32);
+  * \param type attribute type you want to set
+  * \param data pointer to data that will be used to set this attribute
+  */
+-void
++void __EXPORTED
+ nfct_helper_attr_set(struct nfct_helper *h,
+                    enum nfct_helper_attr_type type, const void *data)
+ {
+@@ -250,7 +243,6 @@ nfct_helper_attr_set(struct nfct_helper *h,
+               break;
+       }
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_set);
+ 
+ /**
+  * nfct_helper_attr_set_str - set one attribute the helper object
+@@ -258,44 +250,40 @@ EXPORT_SYMBOL(nfct_helper_attr_set);
+  * \param type attribute type you want to set
+  * \param name string that will be used to set this attribute
+  */
+-void
++void __EXPORTED
+ nfct_helper_attr_set_str(struct nfct_helper *nfct_helper, enum 
nfct_helper_attr_type type,
+                   const char *name)
+ {
+       nfct_helper_attr_set(nfct_helper, type, name);
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_set_str);
+ 
+-void
++void __EXPORTED
+ nfct_helper_attr_set_u8(struct nfct_helper *nfct_helper,
+                        enum nfct_helper_attr_type type, uint8_t value)
+ {
+       nfct_helper_attr_set(nfct_helper, type, &value);
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_set_u8);
+ 
+-void
++void __EXPORTED
+ nfct_helper_attr_set_u16(struct nfct_helper *nfct_helper,
+                        enum nfct_helper_attr_type type, uint16_t value)
+ {
+       nfct_helper_attr_set(nfct_helper, type, &value);
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_set_u16);
+ 
+-void
++void __EXPORTED
+ nfct_helper_attr_set_u32(struct nfct_helper *nfct_helper,
+                        enum nfct_helper_attr_type type, uint32_t value)
+ {
+       nfct_helper_attr_set(nfct_helper, type, &value);
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_set_u32);
+ 
+ /**
+  * nfct_helper_attr_unset - unset one attribute the helper object
+  * \param nfct_helper pointer to the helper object
+  * \param type attribute type you want to set
+  */
+-void
++void __EXPORTED
+ nfct_helper_attr_unset(struct nfct_helper *nfct_helper, enum 
nfct_helper_attr_type type)
+ {
+       switch(type) {
+@@ -307,7 +295,6 @@ nfct_helper_attr_unset(struct nfct_helper *nfct_helper, 
enum nfct_helper_attr_ty
+               break;
+       }
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_unset);
+ 
+ /**
+  * nfct_helper_attr_get - get one attribute the helper object
+@@ -317,8 +304,9 @@ EXPORT_SYMBOL(nfct_helper_attr_unset);
+  * This function returns a valid pointer to the attribute data. If a
+  * unsupported attribute is used, this returns NULL.
+  */
+-const void *nfct_helper_attr_get(struct nfct_helper *helper,
+-                               enum nfct_helper_attr_type type)
++const void __EXPORTED *
++nfct_helper_attr_get(struct nfct_helper *helper,
++                   enum nfct_helper_attr_type type)
+ {
+       const void *ret = NULL;
+ 
+@@ -358,7 +346,6 @@ const void *nfct_helper_attr_get(struct nfct_helper 
*helper,
+       }
+       return ret;
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_get);
+ 
+ /**
+  * nfct_helper_attr_get_str - get one attribute the helper object
+@@ -368,13 +355,12 @@ EXPORT_SYMBOL(nfct_helper_attr_get);
+  * This function returns a valid pointer to the beginning of the string.
+  * If the attribute is unsupported, this returns NULL.
+  */
+-const char *
++const char __EXPORTED *
+ nfct_helper_attr_get_str(struct nfct_helper *nfct_helper,
+                        enum nfct_helper_attr_type type)
+ {
+       return (const char *)nfct_helper_attr_get(nfct_helper, type);
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_get_str);
+ 
+ /**
+  * nfct_helper_attr_get_u8 - get one attribute the helper object
+@@ -384,12 +370,12 @@ EXPORT_SYMBOL(nfct_helper_attr_get_str);
+  * This function returns a unsigned 8-bits integer. If the attribute is
+  * unsupported, this returns NULL.
+  */
+-uint8_t nfct_helper_attr_get_u8(struct nfct_helper *nfct_helper,
+-                                enum nfct_helper_attr_type type)
++uint8_t __EXPORTED
++nfct_helper_attr_get_u8(struct nfct_helper *nfct_helper,
++                      enum nfct_helper_attr_type type)
+ {
+       return *((uint8_t *)nfct_helper_attr_get(nfct_helper, type));
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_get_u8);
+ 
+ /**
+  * nfct_helper_attr_get_u16 - get one attribute the helper object
+@@ -399,12 +385,12 @@ EXPORT_SYMBOL(nfct_helper_attr_get_u8);
+  * This function returns a unsigned 16-bits integer. If the attribute is
+  * unsupported, this returns NULL.
+  */
+-uint16_t nfct_helper_attr_get_u16(struct nfct_helper *nfct_helper,
+-                                enum nfct_helper_attr_type type)
++uint16_t __EXPORTED
++nfct_helper_attr_get_u16(struct nfct_helper *nfct_helper,
++                       enum nfct_helper_attr_type type)
+ {
+       return *((uint16_t *)nfct_helper_attr_get(nfct_helper, type));
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_get_u16);
+ 
+ /**
+  * nfct_helper_attr_get_u32 - get one attribute the helper object
+@@ -414,12 +400,12 @@ EXPORT_SYMBOL(nfct_helper_attr_get_u16);
+  * This function returns a unsigned 32-bits integer. If the attribute is
+  * unsupported, this returns NULL.
+  */
+-uint32_t nfct_helper_attr_get_u32(struct nfct_helper *nfct_helper,
+-                                enum nfct_helper_attr_type type)
++uint32_t __EXPORTED
++nfct_helper_attr_get_u32(struct nfct_helper *nfct_helper,
++                       enum nfct_helper_attr_type type)
+ {
+       return *((uint32_t *)nfct_helper_attr_get(nfct_helper, type));
+ }
+-EXPORT_SYMBOL(nfct_helper_attr_get_u32);
+ 
+ /**
+  * nfct_helper_snprintf - print helper object into one buffer
+@@ -431,9 +417,10 @@ EXPORT_SYMBOL(nfct_helper_attr_get_u32);
+  * This function returns -1 in case that some mandatory attributes are
+  * missing. On sucess, it returns 0.
+  */
+-int nfct_helper_snprintf(char *buf, size_t size,
+-                       struct nfct_helper *helper,
+-                       unsigned int type, unsigned int flags)
++int __EXPORTED
++nfct_helper_snprintf(char *buf, size_t size,
++                   struct nfct_helper *helper,
++                   unsigned int type, unsigned int flags)
+ {
+       int ret;
+ 
+@@ -454,7 +441,6 @@ int nfct_helper_snprintf(char *buf, size_t size,
+ 
+       return ret;
+ }
+-EXPORT_SYMBOL(nfct_helper_snprintf);
+ 
+ /**
+  * @}
+@@ -490,7 +476,7 @@ EXPORT_SYMBOL(nfct_helper_snprintf);
+  * - Command NFNL_MSG_ACCT_DEL, to delete one specific nfct_helper object (if
+  *   unused, otherwise you hit EBUSY).
+  */
+-struct nlmsghdr *
++struct nlmsghdr __EXPORTED *
+ nfct_helper_nlmsg_build_hdr(char *buf, uint8_t cmd,
+                           uint16_t flags, uint32_t seq)
+ {
+@@ -509,7 +495,6 @@ nfct_helper_nlmsg_build_hdr(char *buf, uint8_t cmd,
+ 
+       return nlh;
+ }
+-EXPORT_SYMBOL(nfct_helper_nlmsg_build_hdr);
+ 
+ static void
+ nfct_helper_nlmsg_build_policy(struct nlmsghdr *nlh,
+@@ -530,7 +515,7 @@ nfct_helper_nlmsg_build_policy(struct nlmsghdr *nlh,
+  * \param nlh: netlink message that you want to use to add the payload.
+  * \param nfct_helper: pointer to a helper object
+  */
+-void
++void __EXPORTED
+ nfct_helper_nlmsg_build_payload(struct nlmsghdr *nlh, struct nfct_helper *h)
+ {
+       struct nlattr *nest;
+@@ -593,7 +578,6 @@ nfct_helper_nlmsg_build_payload(struct nlmsghdr *nlh, 
struct nfct_helper *h)
+       if (h->bitset & (1 << NFCTH_ATTR_STATUS))
+               mnl_attr_put_u32(nlh, NFCTH_STATUS, ntohl(h->status));
+ }
+-EXPORT_SYMBOL(nfct_helper_nlmsg_build_payload);
+ 
+ static int
+ nfct_helper_nlmsg_parse_tuple_cb(const struct nlattr *attr, void *data)
+@@ -795,7 +779,7 @@ nfct_helper_nlmsg_parse_attr_cb(const struct nlattr *attr, 
void *data)
+  * This function returns -1 in case that some mandatory attributes are
+  * missing. On sucess, it returns 0.
+  */
+-int
++int __EXPORTED
+ nfct_helper_nlmsg_parse_payload(const struct nlmsghdr *nlh,
+                               struct nfct_helper *h)
+ {
+@@ -832,7 +816,6 @@ nfct_helper_nlmsg_parse_payload(const struct nlmsghdr *nlh,
+       }
+       return 0;
+ }
+-EXPORT_SYMBOL(nfct_helper_nlmsg_parse_payload);
+ 
+ /**
+  * @}
+-- 
+2.11.0
+

diff --git 
a/net-libs/libnetfilter_cthelper/libnetfilter_cthelper-1.0.0-r1.ebuild 
b/net-libs/libnetfilter_cthelper/libnetfilter_cthelper-1.0.0-r1.ebuild
new file mode 100644
index 00000000..7705783
--- /dev/null
+++ b/net-libs/libnetfilter_cthelper/libnetfilter_cthelper-1.0.0-r1.ebuild
@@ -0,0 +1,30 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+
+inherit linux-info autotools-utils
+
+DESCRIPTION="userspace library that provides the programming interface to the 
user-space helper infrastructure"
+HOMEPAGE="http://www.netfilter.org/projects/libnetfilter_cthelper";
+SRC_URI="http://www.netfilter.org/projects/${PN}/files/${P}.tar.bz2";
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~x86"
+IUSE="static-libs"
+
+RDEPEND="net-libs/libmnl:="
+DEPEND="${RDEPEND}
+       virtual/pkgconfig"
+
+PATCHES=(
+       "${FILESDIR}"/${P}-clang-export.patch
+)
+
+CONFIG_CHECK="~NF_CT_NETLINK_HELPER"
+
+pkg_setup() {
+       linux-info_pkg_setup
+       kernel_is lt 3 6 0 && ewarn "requires at least 3.6.0 kernel version"
+}

Reply via email to