summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Make_global.am2
-rw-r--r--configure.ac6
-rw-r--r--doxygen.cfg.in180
-rw-r--r--include/libnfnetlink/libnfnetlink.h110
-rw-r--r--include/linux_list.h2
-rw-r--r--src/Makefile.am6
-rw-r--r--src/iftable.c13
-rw-r--r--src/libnfnetlink.c34
-rw-r--r--src/nfnl.version55
9 files changed, 345 insertions, 63 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/configure.ac b/configure.ac
index b979772..4593824 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,12 +1,12 @@
dnl Process this file with autoconf to create configure.
-AC_INIT(libnfnetlink, 1.0.1)
+AC_INIT(libnfnetlink, 1.0.2)
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4])
AC_CANONICAL_HOST
AM_INIT_AUTOMAKE([-Wall foreign subdir-objects
- tar-pax no-dist-gzip dist-bzip2 1.6])
+ tar-pax no-dist-gzip dist-xz 1.6])
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
dnl kernel style compile messages
@@ -28,6 +28,6 @@ dnl--------------------------------
dnl Output the makefile
-AC_CONFIG_FILES([Makefile src/Makefile include/Makefile
+AC_CONFIG_FILES([Makefile src/Makefile include/Makefile doxygen.cfg
include/libnfnetlink/Makefile utils/Makefile libnfnetlink.pc])
AC_OUTPUT
diff --git a/doxygen.cfg.in b/doxygen.cfg.in
new file mode 100644
index 0000000..eba08e0
--- /dev/null
+++ b/doxygen.cfg.in
@@ -0,0 +1,180 @@
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = @PACKAGE@
+PROJECT_NUMBER = @VERSION@
+OUTPUT_DIRECTORY = doxygen
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = YES
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+TYPEDEF_HIDES_STRUCT = NO
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+FILE_VERSION_FILTER =
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+INPUT = .
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = *.c libnfnetlink.h
+RECURSIVE = YES
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS = */.git/* .*.d
+EXCLUDE_SYMBOLS = EXPORT_SYMBOL
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_STYLESHEET =
+GENERATE_HTMLHELP = NO
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+HTML_DYNAMIC_SECTIONS = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+BINARY_TOC = NO
+TOC_EXPAND = NO
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = NO
+TREEVIEW_WIDTH = 250
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+GENERATE_MAN = YES
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_PROGRAMLISTING = YES
+GENERATE_AUTOGEN_DEF = NO
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+CLASS_DIAGRAMS = YES
+MSCGEN_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = YES
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH =
+DOTFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = YES
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+SEARCHENGINE = NO
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/include/linux_list.h b/include/linux_list.h
index de182a4..cf71837 100644
--- a/include/linux_list.h
+++ b/include/linux_list.h
@@ -29,7 +29,7 @@
1; \
})
-#define prefetch(x) 1
+#define prefetch(x) ((void)0)
/* empty define to make this work in userspace -HW */
#ifndef smp_wmb
diff --git a/src/Makefile.am b/src/Makefile.am
index d0098cc..877ff31 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)
-libnfnetlink_la_SOURCES = libnfnetlink.c iftable.c rtnl.c
+ -version-info $(LIBVERSION) \
+ -Wl,--version-script=$(srcdir)/nfnl.version
+libnfnetlink_la_SOURCES = libnfnetlink.c iftable.c rtnl.c nfnl.version
+EXTRA_libnfnetlink_la_DEPENDENCIES = $(srcdir)/nfnl.version
noinst_HEADERS = iftable.h rtnl.h
diff --git a/src/iftable.c b/src/iftable.c
index 157f97b..aab59b3 100644
--- a/src/iftable.c
+++ b/src/iftable.c
@@ -24,6 +24,15 @@
#include "rtnl.h"
#include "linux_list.h"
+/**
+ * \defgroup iftable Functions in iftable.c [DEPRECATED]
+ * This documentation is provided for the benefit of maintainers of legacy code.
+ *
+ * New applications should use
+ * [libmnl](https://netfilter.org/projects/libmnl/doxygen/html/).
+ * @{
+ */
+
struct ifindex_node {
struct list_head head;
@@ -333,3 +342,7 @@ int nlif_fd(struct nlif_handle *h)
return -1;
}
+
+/**
+ * @}
+ */
diff --git a/src/libnfnetlink.c b/src/libnfnetlink.c
index df57533..667e5ef 100644
--- a/src/libnfnetlink.c
+++ b/src/libnfnetlink.c
@@ -52,6 +52,29 @@
#include <libnfnetlink/libnfnetlink.h>
+/**
+ * \mainpage
+ *
+ * Deprecated
+ * ---
+ * New applications should use
+ * [libmnl](https://netfilter.org/projects/libmnl/doxygen/html/).
+ *
+ * [libnetfilter_queue]
+ * (https://netfilter.org/projects/libnetfilter_queue/doxygen/html/)
+ * now provides a set of helpers for libmnl, in addition to those it provides
+ * for libnfnetlink (which are now deprecated).
+ */
+
+/**
+ * \defgroup libnfnetlink Functions in libnfnetlink.c [DEPRECATED]
+ * This documentation is provided for the benefit of maintainers of legacy code.
+ *
+ * New applications should use
+ * [libmnl](https://netfilter.org/projects/libmnl/doxygen/html/).
+ * @{
+ */
+
#ifndef NETLINK_ADD_MEMBERSHIP
#define NETLINK_ADD_MEMBERSHIP 1
#endif
@@ -60,7 +83,6 @@
#define SOL_NETLINK 270
#endif
-
#define nfnl_error(format, args...) \
fprintf(stderr, "%s: " format "\n", __FUNCTION__, ## args)
@@ -188,7 +210,8 @@ struct nfnl_handle *nfnl_open(void)
nfnlh->peer.nl_family = AF_NETLINK;
addr_len = sizeof(nfnlh->local);
- getsockname(nfnlh->fd, (struct sockaddr *)&nfnlh->local, &addr_len);
+ if (getsockname(nfnlh->fd, (struct sockaddr *)&nfnlh->local, &addr_len))
+ goto err_close;
if (addr_len != sizeof(nfnlh->local)) {
errno = EINVAL;
goto err_close;
@@ -209,7 +232,8 @@ struct nfnl_handle *nfnl_open(void)
/* use getsockname to get the netlink pid that the kernel assigned us */
addr_len = sizeof(nfnlh->local);
- getsockname(nfnlh->fd, (struct sockaddr *)&nfnlh->local, &addr_len);
+ if (getsockname(nfnlh->fd, (struct sockaddr *)&nfnlh->local, &addr_len))
+ goto err_close;
if (addr_len != sizeof(nfnlh->local)) {
errno = EINVAL;
goto err_close;
@@ -1572,3 +1596,7 @@ int nfnl_query(struct nfnl_handle *h, struct nlmsghdr *nlh)
return nfnl_catch(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:
+ *;
+};