From effb26c3b1f00bf8bea4e2562f07f9a06eb67606 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 7 Nov 2011 23:14:55 +0000 Subject: Mon Nov 7 23:14:55 UTC 2011 --- ...-for-libnl-2.x-adapted-from-a-newer-versi.patch | 344 +++++++++++++++++++++ ...eturns-its-own-error-codes-not-errnos-han.patch | 159 ++++++++++ core/libpcap/PKGBUILD | 11 +- 3 files changed, 511 insertions(+), 3 deletions(-) create mode 100644 core/libpcap/Add-support-for-libnl-2.x-adapted-from-a-newer-versi.patch create mode 100644 core/libpcap/Libnl-2.x-returns-its-own-error-codes-not-errnos-han.patch (limited to 'core/libpcap') diff --git a/core/libpcap/Add-support-for-libnl-2.x-adapted-from-a-newer-versi.patch b/core/libpcap/Add-support-for-libnl-2.x-adapted-from-a-newer-versi.patch new file mode 100644 index 000000000..1fce472b7 --- /dev/null +++ b/core/libpcap/Add-support-for-libnl-2.x-adapted-from-a-newer-versi.patch @@ -0,0 +1,344 @@ +From bc937fc4ff6715e9bee939041fa02be0755d7d58 Mon Sep 17 00:00:00 2001 +From: Guy Harris +Date: Sat, 13 Nov 2010 17:42:47 -0800 +Subject: [PATCH] Add support for libnl 2.x, adapted from a newer version of the iw command. + +--- + config.h.in | 3 ++ + configure | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- + configure.in | 40 ++++++++++++++++++---- + pcap-linux.c | 58 ++++++++++++++++++++++++------- + 4 files changed, 184 insertions(+), 25 deletions(-) + +diff --git a/config.h.in b/config.h.in +index f988e8f..3b9ce3c 100644 +--- a/config.h.in ++++ b/config.h.in +@@ -52,6 +52,9 @@ + /* if libnl exists */ + #undef HAVE_LIBNL + ++/* if libnl exists and is version 2.x */ ++#undef HAVE_LIBNL_2_x ++ + /* Define to 1 if you have the header file. */ + #undef HAVE_LIMITS_H + +diff --git a/configure b/configure +index c99c1ab..7338dee 100755 +--- a/configure ++++ b/configure +@@ -7340,7 +7340,93 @@ fi + + + if test x$with_libnl != xno ; then +- { echo "$as_me:$LINENO: checking for nl_handle_alloc in -lnl" >&5 ++ # ++ # Try libnl 2.x first. ++ # ++ { echo "$as_me:$LINENO: checking for nl_socket_alloc in -lnl" >&5 ++echo $ECHO_N "checking for nl_socket_alloc in -lnl... $ECHO_C" >&6; } ++if test "${ac_cv_lib_nl_nl_socket_alloc+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lnl $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char nl_socket_alloc (); ++int ++main () ++{ ++return nl_socket_alloc (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 ++ (eval "$ac_link") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest$ac_exeext && ++ $as_test_x conftest$ac_exeext; then ++ ac_cv_lib_nl_nl_socket_alloc=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_cv_lib_nl_nl_socket_alloc=no ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ echo "$as_me:$LINENO: result: $ac_cv_lib_nl_nl_socket_alloc" >&5 ++echo "${ECHO_T}$ac_cv_lib_nl_nl_socket_alloc" >&6; } ++if test $ac_cv_lib_nl_nl_socket_alloc = yes; then ++ ++ # ++ # Yes, we have libnl 2.x. ++ # ++ LIBS="-lnl-genl -lnl $LIBS" ++ ++cat >>confdefs.h <<\_ACEOF ++#define HAVE_LIBNL 1 ++_ACEOF ++ ++ ++cat >>confdefs.h <<\_ACEOF ++#define HAVE_LIBNL_2_x 1 ++_ACEOF ++ ++ ++else ++ ++ # ++ # No, we don't; do we have libnl 1.x? ++ # ++ { echo "$as_me:$LINENO: checking for nl_handle_alloc in -lnl" >&5 + echo $ECHO_N "checking for nl_handle_alloc in -lnl... $ECHO_C" >&6; } + if test "${ac_cv_lib_nl_nl_handle_alloc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +@@ -7402,18 +7488,30 @@ fi + { echo "$as_me:$LINENO: result: $ac_cv_lib_nl_nl_handle_alloc" >&5 + echo "${ECHO_T}$ac_cv_lib_nl_nl_handle_alloc" >&6; } + if test $ac_cv_lib_nl_nl_handle_alloc = yes; then +- LIBS="-lnl $LIBS" ++ ++ # ++ # Yes. ++ # ++ LIBS="-lnl $LIBS" + + cat >>confdefs.h <<\_ACEOF + #define HAVE_LIBNL 1 + _ACEOF + ++ + else +- if test x$with_libnl = xyes ; then +- { { echo "$as_me:$LINENO: error: libnl support requested but libnl not found" >&5 ++ ++ # ++ # No, we don't have libnl at all. ++ # ++ if test x$with_libnl = xyes ; then ++ { { echo "$as_me:$LINENO: error: libnl support requested but libnl not found" >&5 + echo "$as_me: error: libnl support requested but libnl not found" >&2;} + { (exit 1); exit 1; }; } +- fi ++ fi ++ ++fi ++ + + fi + +diff --git a/configure.in b/configure.in +index 16eadf9..ef801ed 100644 +--- a/configure.in ++++ b/configure.in +@@ -445,13 +445,39 @@ linux) + with_libnl=$withval,,) + + if test x$with_libnl != xno ; then +- AC_CHECK_LIB(nl, nl_handle_alloc, +- LIBS="-lnl $LIBS" +- AC_DEFINE(HAVE_LIBNL,1,[if libnl exists]), +- if test x$with_libnl = xyes ; then +- AC_MSG_ERROR([libnl support requested but libnl not found]) +- fi +- ) ++ # ++ # Try libnl 2.x first. ++ # ++ AC_CHECK_LIB(nl, nl_socket_alloc, ++ [ ++ # ++ # Yes, we have libnl 2.x. ++ # ++ LIBS="-lnl-genl -lnl $LIBS" ++ AC_DEFINE(HAVE_LIBNL,1,[if libnl exists]) ++ AC_DEFINE(HAVE_LIBNL_2_x,1,[if libnl exists and is version 2.x]) ++ ], ++ [ ++ # ++ # No, we don't; do we have libnl 1.x? ++ # ++ AC_CHECK_LIB(nl, nl_handle_alloc, ++ [ ++ # ++ # Yes. ++ # ++ LIBS="-lnl $LIBS" ++ AC_DEFINE(HAVE_LIBNL,1,[if libnl exists]) ++ ], ++ [ ++ # ++ # No, we don't have libnl at all. ++ # ++ if test x$with_libnl = xyes ; then ++ AC_MSG_ERROR([libnl support requested but libnl not found]) ++ fi ++ ]) ++ ]) + fi + + AC_LBL_TPACKET_STATS +diff --git a/pcap-linux.c b/pcap-linux.c +index f8b3f10..deabbc4 100644 +--- a/pcap-linux.c ++++ b/pcap-linux.c +@@ -527,8 +527,37 @@ get_mac80211_phydev(pcap_t *handle, const char *device, char *phydev_path, + return 1; + } + ++#ifndef HAVE_LIBNL_2_x ++/* libnl 2.x compatibility code */ ++ ++#define nl_sock nl_handle ++ ++static inline struct nl_handle * ++nl_socket_alloc(void) ++{ ++ return nl_handle_alloc(); ++} ++ ++static inline void ++nl_socket_free(struct nl_handle *h) ++{ ++ nl_handle_destroy(h); ++} ++ ++static inline int ++__genl_ctrl_alloc_cache(struct nl_handle *h, struct nl_cache **cache) ++{ ++ struct nl_cache *tmp = genl_ctrl_alloc_cache(h); ++ if (!tmp) ++ return -ENOMEM; ++ *cache = tmp; ++ return 0; ++} ++#define genl_ctrl_alloc_cache __genl_ctrl_alloc_cache ++#endif /* !HAVE_LIBNL_2_x */ ++ + struct nl80211_state { +- struct nl_handle *nl_handle; ++ struct nl_sock *nl_sock; + struct nl_cache *nl_cache; + struct genl_family *nl80211; + }; +@@ -536,23 +565,26 @@ struct nl80211_state { + static int + nl80211_init(pcap_t *handle, struct nl80211_state *state, const char *device) + { +- state->nl_handle = nl_handle_alloc(); +- if (!state->nl_handle) { ++ int err; ++ ++ state->nl_sock = nl_socket_alloc(); ++ if (!state->nl_sock) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: failed to allocate netlink handle", device); + return PCAP_ERROR; + } + +- if (genl_connect(state->nl_handle)) { ++ if (genl_connect(state->nl_sock)) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: failed to connect to generic netlink", device); + goto out_handle_destroy; + } + +- state->nl_cache = genl_ctrl_alloc_cache(state->nl_handle); +- if (!state->nl_cache) { ++ err = genl_ctrl_alloc_cache(state->nl_sock, &state->nl_cache); ++ if (err < 0) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, +- "%s: failed to allocate generic netlink cache", device); ++ "%s: failed to allocate generic netlink cache: %s", ++ device, strerror(-err)); + goto out_handle_destroy; + } + +@@ -568,7 +600,7 @@ nl80211_init(pcap_t *handle, struct nl80211_state *state, const char *device) + out_cache_free: + nl_cache_free(state->nl_cache); + out_handle_destroy: +- nl_handle_destroy(state->nl_handle); ++ nl_socket_free(state->nl_sock); + return PCAP_ERROR; + } + +@@ -577,7 +609,7 @@ nl80211_cleanup(struct nl80211_state *state) + { + genl_family_put(state->nl80211); + nl_cache_free(state->nl_cache); +- nl_handle_destroy(state->nl_handle); ++ nl_socket_free(state->nl_sock); + } + + static int +@@ -605,7 +637,7 @@ add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, + NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, mondevice); + NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, NL80211_IFTYPE_MONITOR); + +- err = nl_send_auto_complete(state->nl_handle, msg); ++ err = nl_send_auto_complete(state->nl_sock, msg); + if (err < 0) { + if (err == -ENFILE) { + /* +@@ -626,7 +658,7 @@ add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, + return PCAP_ERROR; + } + } +- err = nl_wait_for_ack(state->nl_handle); ++ err = nl_wait_for_ack(state->nl_sock); + if (err < 0) { + if (err == -ENFILE) { + /* +@@ -685,7 +717,7 @@ del_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, + 0, NL80211_CMD_DEL_INTERFACE, 0); + NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex); + +- err = nl_send_auto_complete(state->nl_handle, msg); ++ err = nl_send_auto_complete(state->nl_sock, msg); + if (err < 0) { + if (err == -ENFILE) { + /* +@@ -706,7 +738,7 @@ del_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, + return PCAP_ERROR; + } + } +- err = nl_wait_for_ack(state->nl_handle); ++ err = nl_wait_for_ack(state->nl_sock); + if (err < 0) { + if (err == -ENFILE) { + /* +-- +1.7.3.5 + diff --git a/core/libpcap/Libnl-2.x-returns-its-own-error-codes-not-errnos-han.patch b/core/libpcap/Libnl-2.x-returns-its-own-error-codes-not-errnos-han.patch new file mode 100644 index 000000000..219494200 --- /dev/null +++ b/core/libpcap/Libnl-2.x-returns-its-own-error-codes-not-errnos-han.patch @@ -0,0 +1,159 @@ +From 9545ff8e2670db02652f9cf781aafdd6bac58ac4 Mon Sep 17 00:00:00 2001 +From: Guy Harris +Date: Sun, 14 Nov 2010 13:48:19 -0800 +Subject: [PATCH] Libnl 2.x returns its own error codes, not errnos; handle that. + +While we're at it, don't special-case ENFILE for "delete monitor device" +operations; that's not like "add monitor device", where we want to drive +on if a device with that name already exists. +--- + pcap-linux.c | 76 ++++++++++++++++++++++++++-------------------------------- + 1 files changed, 34 insertions(+), 42 deletions(-) + +diff --git a/pcap-linux.c b/pcap-linux.c +index deabbc4..5d291e9 100644 +--- a/pcap-linux.c ++++ b/pcap-linux.c +@@ -527,7 +527,9 @@ get_mac80211_phydev(pcap_t *handle, const char *device, char *phydev_path, + return 1; + } + +-#ifndef HAVE_LIBNL_2_x ++#ifdef HAVE_LIBNL_2_x ++#define get_nl_errmsg nl_geterror ++#else + /* libnl 2.x compatibility code */ + + #define nl_sock nl_handle +@@ -544,6 +546,8 @@ nl_socket_free(struct nl_handle *h) + nl_handle_destroy(h); + } + ++#define get_nl_errmsg strerror ++ + static inline int + __genl_ctrl_alloc_cache(struct nl_handle *h, struct nl_cache **cache) + { +@@ -584,7 +588,7 @@ nl80211_init(pcap_t *handle, struct nl80211_state *state, const char *device) + if (err < 0) { + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: failed to allocate generic netlink cache: %s", +- device, strerror(-err)); ++ device, get_nl_errmsg(-err)); + goto out_handle_destroy; + } + +@@ -639,10 +643,17 @@ add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, + + err = nl_send_auto_complete(state->nl_sock, msg); + if (err < 0) { ++#ifdef HAVE_LIBNL_2_x ++ if (err == -NLE_FAILURE) { ++#else + if (err == -ENFILE) { ++#endif + /* + * Device not available; our caller should just +- * keep trying. ++ * keep trying. (libnl 2.x maps ENFILE to ++ * NLE_FAILURE; it can also map other errors ++ * to that, but there's not much we can do ++ * about that.) + */ + nlmsg_free(msg); + return 0; +@@ -653,17 +664,24 @@ add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, + */ + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: nl_send_auto_complete failed adding %s interface: %s", +- device, mondevice, strerror(-err)); ++ device, mondevice, get_nl_errmsg(-err)); + nlmsg_free(msg); + return PCAP_ERROR; + } + } + err = nl_wait_for_ack(state->nl_sock); + if (err < 0) { ++#ifdef HAVE_LIBNL_2_x ++ if (err == -NLE_FAILURE) { ++#else + if (err == -ENFILE) { ++#endif + /* + * Device not available; our caller should just +- * keep trying. ++ * keep trying. (libnl 2.x maps ENFILE to ++ * NLE_FAILURE; it can also map other errors ++ * to that, but there's not much we can do ++ * about that.) + */ + nlmsg_free(msg); + return 0; +@@ -674,7 +692,7 @@ add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, + */ + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "%s: nl_wait_for_ack failed adding %s interface: %s", +- device, mondevice, strerror(-err)); ++ device, mondevice, get_nl_errmsg(-err)); + nlmsg_free(msg); + return PCAP_ERROR; + } +@@ -719,45 +737,19 @@ del_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state, + + err = nl_send_auto_complete(state->nl_sock, msg); + if (err < 0) { +- if (err == -ENFILE) { +- /* +- * Device not available; our caller should just +- * keep trying. +- */ +- nlmsg_free(msg); +- return 0; +- } else { +- /* +- * Real failure, not just "that device is not +- * available. +- */ +- snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, +- "%s: nl_send_auto_complete failed deleting %s interface: %s", +- device, mondevice, strerror(-err)); +- nlmsg_free(msg); +- return PCAP_ERROR; +- } ++ snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, ++ "%s: nl_send_auto_complete failed deleting %s interface: %s", ++ device, mondevice, get_nl_errmsg(-err)); ++ nlmsg_free(msg); ++ return PCAP_ERROR; + } + err = nl_wait_for_ack(state->nl_sock); + if (err < 0) { +- if (err == -ENFILE) { +- /* +- * Device not available; our caller should just +- * keep trying. +- */ +- nlmsg_free(msg); +- return 0; +- } else { +- /* +- * Real failure, not just "that device is not +- * available. +- */ +- snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, +- "%s: nl_wait_for_ack failed adding %s interface: %s", +- device, mondevice, strerror(-err)); +- nlmsg_free(msg); +- return PCAP_ERROR; +- } ++ snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, ++ "%s: nl_wait_for_ack failed adding %s interface: %s", ++ device, mondevice, get_nl_errmsg(-err)); ++ nlmsg_free(msg); ++ return PCAP_ERROR; + } + + /* +-- +1.7.3.5 + diff --git a/core/libpcap/PKGBUILD b/core/libpcap/PKGBUILD index 845ff13bf..023faea55 100644 --- a/core/libpcap/PKGBUILD +++ b/core/libpcap/PKGBUILD @@ -1,9 +1,9 @@ -# $Id: PKGBUILD 103439 2010-12-19 15:40:24Z andyrtr $ +# $Id: PKGBUILD 142215 2011-11-06 10:21:27Z thomas $ # Maintainer: Thomas Bächler pkgname=libpcap pkgver=1.1.1 -pkgrel=2 +pkgrel=4 pkgdesc="A system-independent interface for user-level packet capture" arch=('i686' 'x86_64') url="http://www.tcpdump.org/" @@ -11,10 +11,15 @@ license=('BSD') depends=('glibc' 'libnl' 'sh') makedepends=('flex') source=(http://www.tcpdump.org/release/libpcap-${pkgver}.tar.gz) + #Add-support-for-libnl-2.x-adapted-from-a-newer-versi.patch + #Libnl-2.x-returns-its-own-error-codes-not-errnos-han.patch) sha256sums=('508cca15547e55d1318498b838456a21770c450beb2dc7d7d4a96d90816e5a85') - + #'194aa268a3397be3ba406b7102dbdbc14fc16c6e4b535d0a0fab6b04d414563a' + #'f1f31c3e2b064f4c9d0e643e8ed1874a65ec17f770362f8ffa3b3f9ee9dc71bb') build() { cd ${srcdir}/${pkgname}-${pkgver} + #patch -p1 -i "${srcdir}"/Add-support-for-libnl-2.x-adapted-from-a-newer-versi.patch + #patch -p1 -i "${srcdir}"/Libnl-2.x-returns-its-own-error-codes-not-errnos-han.patch ./configure --prefix=/usr --enable-ipv6 make } -- cgit v1.2.3-54-g00ecf