diff options
-rw-r--r-- | Make_global.am | 2 | ||||
-rw-r--r-- | configure.ac | 6 | ||||
-rw-r--r-- | doxygen.cfg.in | 180 | ||||
-rw-r--r-- | include/libnfnetlink/libnfnetlink.h | 110 | ||||
-rw-r--r-- | include/linux_list.h | 2 | ||||
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/iftable.c | 13 | ||||
-rw-r--r-- | src/libnfnetlink.c | 34 | ||||
-rw-r--r-- | src/nfnl.version | 55 |
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: + *; +}; |