summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Make_global.am2
-rw-r--r--include/libnfnetlink/libnfnetlink.h110
-rw-r--r--src/Makefile.am4
-rw-r--r--src/nfnl.version55
4 files changed, 116 insertions, 55 deletions
diff --git a/Make_global.am b/Make_global.am
index f091860..3d2dd5e 100644
--- a/Make_global.am
+++ b/Make_global.am
@@ -5,4 +5,4 @@
LIBVERSION=2:0:2
AM_CPPFLAGS = -I$(top_srcdir)/include
-AM_CFLAGS = -Wall
+AM_CFLAGS = -Wall -fvisibility=hidden -D'NFNL_EXPORT=__attribute__((visibility("default")))'
diff --git a/include/libnfnetlink/libnfnetlink.h b/include/libnfnetlink/libnfnetlink.h
index cd0be3d..49ce878 100644
--- a/include/libnfnetlink/libnfnetlink.h
+++ b/include/libnfnetlink/libnfnetlink.h
@@ -44,6 +44,10 @@
#define NFNL_BUFFSIZE 8192
+#ifndef NFNL_EXPORT
+#define NFNL_EXPORT
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -62,63 +66,63 @@ struct nfnl_callback {
struct nfnl_handle;
struct nfnl_subsys_handle;
-extern int nfnl_fd(struct nfnl_handle *h);
-extern unsigned int nfnl_portid(const struct nfnl_handle *h);
+extern NFNL_EXPORT int nfnl_fd(struct nfnl_handle *h);
+extern NFNL_EXPORT unsigned int nfnl_portid(const struct nfnl_handle *h);
/* get a new library handle */
-extern struct nfnl_handle *nfnl_open(void);
-extern int nfnl_close(struct nfnl_handle *);
+extern NFNL_EXPORT struct nfnl_handle *nfnl_open(void);
+extern NFNL_EXPORT int nfnl_close(struct nfnl_handle *);
-extern struct nfnl_subsys_handle *nfnl_subsys_open(struct nfnl_handle *,
+extern NFNL_EXPORT struct nfnl_subsys_handle *nfnl_subsys_open(struct nfnl_handle *,
uint8_t, uint8_t,
unsigned int);
-extern void nfnl_subsys_close(struct nfnl_subsys_handle *);
+extern NFNL_EXPORT void nfnl_subsys_close(struct nfnl_subsys_handle *);
/* set and unset sequence tracking */
-void nfnl_set_sequence_tracking(struct nfnl_handle *h);
-void nfnl_unset_sequence_tracking(struct nfnl_handle *h);
+extern NFNL_EXPORT void nfnl_set_sequence_tracking(struct nfnl_handle *h);
+extern NFNL_EXPORT void nfnl_unset_sequence_tracking(struct nfnl_handle *h);
/* set receive buffer size (for nfnl_catch) */
-extern void nfnl_set_rcv_buffer_size(struct nfnl_handle *h, unsigned int size);
+extern NFNL_EXPORT void nfnl_set_rcv_buffer_size(struct nfnl_handle *h, unsigned int size);
/* sending of data */
-extern int nfnl_send(struct nfnl_handle *, struct nlmsghdr *);
-extern int nfnl_sendmsg(const struct nfnl_handle *, const struct msghdr *msg,
+extern NFNL_EXPORT int nfnl_send(struct nfnl_handle *, struct nlmsghdr *);
+extern NFNL_EXPORT int nfnl_sendmsg(const struct nfnl_handle *, const struct msghdr *msg,
unsigned int flags);
-extern int nfnl_sendiov(const struct nfnl_handle *nfnlh,
+extern NFNL_EXPORT int nfnl_sendiov(const struct nfnl_handle *nfnlh,
const struct iovec *iov, unsigned int num,
unsigned int flags);
-extern void nfnl_fill_hdr(struct nfnl_subsys_handle *, struct nlmsghdr *,
+extern NFNL_EXPORT void nfnl_fill_hdr(struct nfnl_subsys_handle *, struct nlmsghdr *,
unsigned int, uint8_t, uint16_t, uint16_t,
uint16_t);
-extern __attribute__((deprecated)) int
+extern NFNL_EXPORT __attribute__((deprecated)) int
nfnl_talk(struct nfnl_handle *, struct nlmsghdr *, pid_t,
unsigned, struct nlmsghdr *,
int (*)(struct sockaddr_nl *, struct nlmsghdr *, void *), void *);
/* simple challenge/response */
-extern __attribute__((deprecated)) int
+extern NFNL_EXPORT __attribute__((deprecated)) int
nfnl_listen(struct nfnl_handle *,
int (*)(struct sockaddr_nl *, struct nlmsghdr *, void *), void *);
/* receiving */
-extern ssize_t nfnl_recv(const struct nfnl_handle *h, unsigned char *buf, size_t len);
-extern int nfnl_callback_register(struct nfnl_subsys_handle *,
+extern NFNL_EXPORT ssize_t nfnl_recv(const struct nfnl_handle *h, unsigned char *buf, size_t len);
+extern NFNL_EXPORT int nfnl_callback_register(struct nfnl_subsys_handle *,
uint8_t type, struct nfnl_callback *cb);
-extern int nfnl_callback_unregister(struct nfnl_subsys_handle *, uint8_t type);
-extern int nfnl_handle_packet(struct nfnl_handle *, char *buf, int len);
+extern NFNL_EXPORT int nfnl_callback_unregister(struct nfnl_subsys_handle *, uint8_t type);
+extern NFNL_EXPORT int nfnl_handle_packet(struct nfnl_handle *, char *buf, int len);
/* parsing */
-extern struct nfattr *nfnl_parse_hdr(const struct nfnl_handle *nfnlh,
+extern NFNL_EXPORT struct nfattr *nfnl_parse_hdr(const struct nfnl_handle *nfnlh,
const struct nlmsghdr *nlh,
struct nfgenmsg **genmsg);
-extern int nfnl_check_attributes(const struct nfnl_handle *nfnlh,
+extern NFNL_EXPORT int nfnl_check_attributes(const struct nfnl_handle *nfnlh,
const struct nlmsghdr *nlh,
struct nfattr *tb[]);
-extern struct nlmsghdr *nfnl_get_msg_first(struct nfnl_handle *h,
+extern NFNL_EXPORT struct nlmsghdr *nfnl_get_msg_first(struct nfnl_handle *h,
const unsigned char *buf,
size_t len);
-extern struct nlmsghdr *nfnl_get_msg_next(struct nfnl_handle *h,
+extern NFNL_EXPORT struct nlmsghdr *nfnl_get_msg_next(struct nfnl_handle *h,
const unsigned char *buf,
size_t len);
@@ -130,33 +134,33 @@ enum {
};
/* join a certain netlink multicast group */
-extern int nfnl_join(const struct nfnl_handle *nfnlh, unsigned int group);
+extern NFNL_EXPORT int nfnl_join(const struct nfnl_handle *nfnlh, unsigned int group);
/* process a netlink message */
-extern int nfnl_process(struct nfnl_handle *h,
+extern NFNL_EXPORT int nfnl_process(struct nfnl_handle *h,
const unsigned char *buf,
size_t len);
/* iterator API */
-extern struct nfnl_iterator *
+extern NFNL_EXPORT struct nfnl_iterator *
nfnl_iterator_create(const struct nfnl_handle *h,
const char *buf,
size_t len);
-extern void nfnl_iterator_destroy(struct nfnl_iterator *it);
+extern NFNL_EXPORT void nfnl_iterator_destroy(struct nfnl_iterator *it);
-extern int nfnl_iterator_process(struct nfnl_handle *h,
+extern NFNL_EXPORT int nfnl_iterator_process(struct nfnl_handle *h,
struct nfnl_iterator *it);
-extern int nfnl_iterator_next(const struct nfnl_handle *h,
+extern NFNL_EXPORT int nfnl_iterator_next(const struct nfnl_handle *h,
struct nfnl_iterator *it);
/* replacement for nfnl_listen */
-extern int nfnl_catch(struct nfnl_handle *h);
+extern NFNL_EXPORT int nfnl_catch(struct nfnl_handle *h);
/* replacement for nfnl_talk */
-extern int nfnl_query(struct nfnl_handle *h, struct nlmsghdr *nlh);
+extern NFNL_EXPORT int nfnl_query(struct nfnl_handle *h, struct nlmsghdr *nlh);
#define nfnl_attr_present(tb, attr) \
(tb[attr-1])
@@ -180,14 +184,14 @@ extern int nfnl_query(struct nfnl_handle *h, struct nlmsghdr *nlh);
#endif
/* nfnl attribute handling functions */
-extern int nfnl_addattr_l(struct nlmsghdr *, int, int, const void *, int);
-extern int nfnl_addattr8(struct nlmsghdr *, int, int, uint8_t);
-extern int nfnl_addattr16(struct nlmsghdr *, int, int, uint16_t);
-extern int nfnl_addattr32(struct nlmsghdr *, int, int, uint32_t);
-extern int nfnl_nfa_addattr_l(struct nfattr *, int, int, const void *, int);
-extern int nfnl_nfa_addattr16(struct nfattr *, int, int, uint16_t);
-extern int nfnl_nfa_addattr32(struct nfattr *, int, int, uint32_t);
-extern int nfnl_parse_attr(struct nfattr **, int, struct nfattr *, int);
+extern NFNL_EXPORT int nfnl_addattr_l(struct nlmsghdr *, int, int, const void *, int);
+extern NFNL_EXPORT int nfnl_addattr8(struct nlmsghdr *, int, int, uint8_t);
+extern NFNL_EXPORT int nfnl_addattr16(struct nlmsghdr *, int, int, uint16_t);
+extern NFNL_EXPORT int nfnl_addattr32(struct nlmsghdr *, int, int, uint32_t);
+extern NFNL_EXPORT int nfnl_nfa_addattr_l(struct nfattr *, int, int, const void *, int);
+extern NFNL_EXPORT int nfnl_nfa_addattr16(struct nfattr *, int, int, uint16_t);
+extern NFNL_EXPORT int nfnl_nfa_addattr32(struct nfattr *, int, int, uint32_t);
+extern NFNL_EXPORT int nfnl_parse_attr(struct nfattr **, int, struct nfattr *, int);
#define nfnl_parse_nested(tb, max, nfa) \
nfnl_parse_attr((tb), (max), NFA_DATA((nfa)), NFA_PAYLOAD((nfa)))
#define nfnl_nest(nlh, bufsize, type) \
@@ -197,14 +201,14 @@ extern int nfnl_parse_attr(struct nfattr **, int, struct nfattr *, int);
#define nfnl_nest_end(nlh, tail) \
({ (tail)->nfa_len = (void *) NLMSG_TAIL(nlh) - (void *) tail; })
-extern void nfnl_build_nfa_iovec(struct iovec *iov, struct nfattr *nfa,
+extern NFNL_EXPORT void nfnl_build_nfa_iovec(struct iovec *iov, struct nfattr *nfa,
uint16_t type, uint32_t len,
unsigned char *val);
-extern unsigned int nfnl_rcvbufsiz(const struct nfnl_handle *h,
+extern NFNL_EXPORT unsigned int nfnl_rcvbufsiz(const struct nfnl_handle *h,
unsigned int size);
-extern void nfnl_dump_packet(struct nlmsghdr *, int, char *);
+extern NFNL_EXPORT void nfnl_dump_packet(struct nlmsghdr *, int, char *);
/*
* index to interface name API
@@ -216,17 +220,17 @@ extern void nfnl_dump_packet(struct nlmsghdr *, int, char *);
struct nlif_handle;
-struct nlif_handle *nlif_open(void);
-void nlif_close(struct nlif_handle *orig);
-int nlif_fd(struct nlif_handle *nlif_handle);
-int nlif_query(struct nlif_handle *nlif_handle);
-int nlif_catch(struct nlif_handle *nlif_handle);
-int nlif_index2name(struct nlif_handle *nlif_handle,
- unsigned int if_index,
- char *name);
-int nlif_get_ifflags(const struct nlif_handle *h,
- unsigned int index,
- unsigned int *flags);
+extern NFNL_EXPORT struct nlif_handle *nlif_open(void);
+extern NFNL_EXPORT void nlif_close(struct nlif_handle *orig);
+extern NFNL_EXPORT int nlif_fd(struct nlif_handle *nlif_handle);
+extern NFNL_EXPORT int nlif_query(struct nlif_handle *nlif_handle);
+extern NFNL_EXPORT int nlif_catch(struct nlif_handle *nlif_handle);
+extern NFNL_EXPORT int nlif_index2name(struct nlif_handle *nlif_handle,
+ unsigned int if_index,
+ char *name);
+extern NFNL_EXPORT int nlif_get_ifflags(const struct nlif_handle *h,
+ unsigned int index,
+ unsigned int *flags);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/Makefile.am b/src/Makefile.am
index d0098cc..5524b0f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,7 +3,9 @@ include $(top_srcdir)/Make_global.am
lib_LTLIBRARIES = libnfnetlink.la
libnfnetlink_la_LDFLAGS = -Wc,-nostartfiles \
- -version-info $(LIBVERSION)
+ -version-info $(LIBVERSION) \
+ -Wl,--version-script=$(srcdir)/nfnl.version
libnfnetlink_la_SOURCES = libnfnetlink.c iftable.c rtnl.c
+EXTRA_libnfnetlink_la_DEPENDENCIES = $(srcdir)/nfnl.version
noinst_HEADERS = iftable.h rtnl.h
diff --git a/src/nfnl.version b/src/nfnl.version
new file mode 100644
index 0000000..c3817dd
--- /dev/null
+++ b/src/nfnl.version
@@ -0,0 +1,55 @@
+NFNETLINK_1.0.1 {
+ global:
+ nfnl_fd;
+ nfnl_portid;
+ nfnl_open;
+ nfnl_close;
+ nfnl_subsys_open;
+ nfnl_subsys_close;
+ nfnl_set_sequence_tracking;
+ nfnl_unset_sequence_tracking;
+ nfnl_set_rcv_buffer_size;
+ nfnl_send;
+ nfnl_sendmsg;
+ nfnl_sendiov;
+ nfnl_fill_hdr;
+ nfnl_talk;
+ nfnl_listen;
+ nfnl_recv;
+ nfnl_callback_register;
+ nfnl_callback_unregister;
+ nfnl_handle_packet;
+ nfnl_parse_hdr;
+ nfnl_check_attributes;
+ nfnl_get_msg_first;
+ nfnl_get_msg_next;
+ nfnl_join;
+ nfnl_process;
+ nfnl_iterator_create;
+ nfnl_iterator_destroy;
+ nfnl_iterator_process;
+ nfnl_iterator_next;
+ nfnl_catch;
+ nfnl_query;
+ nfnl_addattr_l;
+ nfnl_addattr8;
+ nfnl_addattr16;
+ nfnl_addattr32;
+ nfnl_nfa_addattr_l;
+ nfnl_nfa_addattr16;
+ nfnl_nfa_addattr32;
+ nfnl_parse_attr;
+ nfnl_build_nfa_iovec;
+ nfnl_rcvbufsiz;
+ nfnl_dump_packet;
+ nlif_open;
+ nlif_close;
+ nlif_fd;
+ nlif_query;
+ nlif_catch;
+ nlif_index2name;
+ nlif_get_ifflags;
+
+ local:
+ *;
+};