From f3e3e8fa703e88b76b22c5486277dfca3c85a24b Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Mon, 10 Apr 2017 14:56:18 -0700
Subject: [PATCH] Declare the define visivility attribute together

clang ignores the visibility attribute if its not
defined before the definition. As a result these
symbols become hidden and consumers of this library
fail to link due to these missing symbols

Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 doxygen.cfg.in          |  2 +-
 src/internal.h          |  5 ++---
 src/libnetfilter_acct.c | 41 ++++++++++++++---------------------------
 3 files changed, 17 insertions(+), 31 deletions(-)

diff --git a/doxygen.cfg.in b/doxygen.cfg.in
index 7f4bd04..fe64d48 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 nfacct
+EXCLUDE_SYMBOLS        = nfacct
 EXAMPLE_PATH           = 
 EXAMPLE_PATTERNS       = 
 EXAMPLE_RECURSIVE      = NO
diff --git a/src/internal.h b/src/internal.h
index f0cc2e1..e5c5ffd 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 __EXPORT	__attribute__((visibility("default")))
 #else
-#	define EXPORT_SYMBOL
+#	define __EXPORT
 #endif
 
 #include <endian.h>
diff --git a/src/libnetfilter_acct.c b/src/libnetfilter_acct.c
index b0bcf67..0220d14 100644
--- a/src/libnetfilter_acct.c
+++ b/src/libnetfilter_acct.c
@@ -76,21 +76,19 @@ struct nfacct {
  * In case of success, this function returns a valid pointer, otherwise NULL
  * s returned and errno is appropriately set.
  */
-struct nfacct *nfacct_alloc(void)
+struct nfacct __EXPORT *nfacct_alloc(void)
 {
 	return calloc(1, sizeof(struct nfacct));
 }
-EXPORT_SYMBOL(nfacct_alloc);
 
 /**
  * nfacct_free - release one accounting object
  * \param nfacct pointer to the accounting object
  */
-void nfacct_free(struct nfacct *nfacct)
+void __EXPORT nfacct_free(struct nfacct *nfacct)
 {
 	free(nfacct);
 }
-EXPORT_SYMBOL(nfacct_free);
 
 /**
  * nfacct_attr_set - set one attribute of the accounting object
@@ -98,7 +96,7 @@ EXPORT_SYMBOL(nfacct_free);
  * \param type attribute type you want to set
  * \param data pointer to data that will be used to set this attribute
  */
-void
+void __EXPORT
 nfacct_attr_set(struct nfacct *nfacct, enum nfacct_attr_type type,
 		const void *data)
 {
@@ -126,7 +124,6 @@ nfacct_attr_set(struct nfacct *nfacct, enum nfacct_attr_type type,
 		break;
 	}
 }
-EXPORT_SYMBOL(nfacct_attr_set);
 
 /**
  * nfacct_attr_set_str - set one attribute the accounting object
@@ -134,13 +131,12 @@ EXPORT_SYMBOL(nfacct_attr_set);
  * \param type attribute type you want to set
  * \param name string that will be used to set this attribute
  */
-void
+void __EXPORT
 nfacct_attr_set_str(struct nfacct *nfacct, enum nfacct_attr_type type,
 		    const char *name)
 {
 	nfacct_attr_set(nfacct, type, name);
 }
-EXPORT_SYMBOL(nfacct_attr_set_str);
 
 /**
  * nfacct_attr_set_u64 - set one attribute the accounting object
@@ -148,20 +144,19 @@ EXPORT_SYMBOL(nfacct_attr_set_str);
  * \param type attribute type you want to set
  * \param value unsigned 64-bits integer
  */
-void
+void __EXPORT
 nfacct_attr_set_u64(struct nfacct *nfacct, enum nfacct_attr_type type,
 		    uint64_t value)
 {
 	nfacct_attr_set(nfacct, type, &value);
 }
-EXPORT_SYMBOL(nfacct_attr_set_u64);
 
 /**
  * nfacct_attr_unset - unset one attribute the accounting object
  * \param nfacct pointer to the accounting object
  * \param type attribute type you want to set
  */
-void
+void __EXPORT
 nfacct_attr_unset(struct nfacct *nfacct, enum nfacct_attr_type type)
 {
 	switch(type) {
@@ -182,7 +177,6 @@ nfacct_attr_unset(struct nfacct *nfacct, enum nfacct_attr_type type)
 		break;
 	}
 }
-EXPORT_SYMBOL(nfacct_attr_unset);
 
 /**
  * nfacct_attr_get - get one attribute the accounting object
@@ -192,7 +186,7 @@ EXPORT_SYMBOL(nfacct_attr_unset);
  * This function returns a valid pointer to the attribute data. If a
  * unsupported attribute is used, this returns NULL.
  */
-const void *nfacct_attr_get(struct nfacct *nfacct, enum nfacct_attr_type type)
+const void __EXPORT *nfacct_attr_get(struct nfacct *nfacct, enum nfacct_attr_type type)
 {
 	const void *ret = NULL;
 
@@ -220,7 +214,6 @@ const void *nfacct_attr_get(struct nfacct *nfacct, enum nfacct_attr_type type)
 	}
 	return ret;
 }
-EXPORT_SYMBOL(nfacct_attr_get);
 
 /**
  * nfacct_attr_get_str - get one attribute the accounting object
@@ -230,12 +223,11 @@ EXPORT_SYMBOL(nfacct_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 __EXPORT *
 nfacct_attr_get_str(struct nfacct *nfacct, enum nfacct_attr_type type)
 {
 	return nfacct_attr_get(nfacct, type);
 }
-EXPORT_SYMBOL(nfacct_attr_get_str);
 
 /**
  * nfacct_attr_get_u64 - get one attribute the accounting object
@@ -245,12 +237,11 @@ EXPORT_SYMBOL(nfacct_attr_get_str);
  * This function returns a unsigned 64-bits integer. If the attribute is
  * unsupported, this returns NULL.
  */
-uint64_t nfacct_attr_get_u64(struct nfacct *nfacct, enum nfacct_attr_type type)
+uint64_t __EXPORT nfacct_attr_get_u64(struct nfacct *nfacct, enum nfacct_attr_type type)
 {
 	const void *ret = nfacct_attr_get(nfacct, type);
 	return ret ? *((uint64_t *)ret) : 0;
 }
-EXPORT_SYMBOL(nfacct_attr_get_u64);
 
 static int
 nfacct_snprintf_plain(char *buf, size_t rem, struct nfacct *nfacct,
@@ -424,8 +415,8 @@ err:
  * This function returns -1 in case that some mandatory attributes are
  * missing. On sucess, it returns 0.
  */
-int nfacct_snprintf(char *buf, size_t size, struct nfacct *nfacct,
-		    uint16_t type, uint16_t flags)
+int __EXPORT nfacct_snprintf(char *buf, size_t size, struct nfacct *nfacct,
+		             uint16_t type, uint16_t flags)
 {
 	int ret = 0;
 
@@ -445,7 +436,6 @@ int nfacct_snprintf(char *buf, size_t size, struct nfacct *nfacct,
 	}
 	return ret;
 }
-EXPORT_SYMBOL(nfacct_snprintf);
 
 /**
  * @}
@@ -484,7 +474,7 @@ EXPORT_SYMBOL(nfacct_snprintf);
  * - Command NFNL_MSG_ACCT_DEL, to delete one specific nfacct object (if
  *   unused, otherwise you hit EBUSY).
  */
-struct nlmsghdr *
+struct nlmsghdr __EXPORT *
 nfacct_nlmsg_build_hdr(char *buf, uint8_t cmd, uint16_t flags, uint32_t seq)
 {
 	struct nlmsghdr *nlh;
@@ -502,14 +492,13 @@ nfacct_nlmsg_build_hdr(char *buf, uint8_t cmd, uint16_t flags, uint32_t seq)
 
 	return nlh;
 }
-EXPORT_SYMBOL(nfacct_nlmsg_build_hdr);
 
 /**
  * nfacct_nlmsg_build_payload - build payload from accounting object
  * \param nlh: netlink message that you want to use to add the payload.
  * \param nfacct: pointer to a accounting object
  */
-void nfacct_nlmsg_build_payload(struct nlmsghdr *nlh, struct nfacct *nfacct)
+void __EXPORT nfacct_nlmsg_build_payload(struct nlmsghdr *nlh, struct nfacct *nfacct)
 {
 	if (nfacct->bitset & (1 << NFACCT_ATTR_NAME))
 		mnl_attr_put_strz(nlh, NFACCT_NAME, nfacct->name);
@@ -526,7 +515,6 @@ void nfacct_nlmsg_build_payload(struct nlmsghdr *nlh, struct nfacct *nfacct)
 	if (nfacct->bitset & (1 << NFACCT_ATTR_QUOTA))
 		mnl_attr_put_u64(nlh, NFACCT_QUOTA, htobe64(nfacct->quota));
 }
-EXPORT_SYMBOL(nfacct_nlmsg_build_payload);
 
 static int nfacct_nlmsg_parse_attr_cb(const struct nlattr *attr, void *data)
 {
@@ -563,7 +551,7 @@ static int nfacct_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 __EXPORT
 nfacct_nlmsg_parse_payload(const struct nlmsghdr *nlh, struct nfacct *nfacct)
 {
 	struct nlattr *tb[NFACCT_MAX+1] = {};
@@ -589,7 +577,6 @@ nfacct_nlmsg_parse_payload(const struct nlmsghdr *nlh, struct nfacct *nfacct)
 
 	return 0;
 }
-EXPORT_SYMBOL(nfacct_nlmsg_parse_payload);
 
 /**
  * @}
-- 
2.12.2

