Magellan Linux

Contents of /trunk/libpcap/patches/libpcap-1.1.1-Add-support-for-libnl-2.x-adapted-from-a-newer-version.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1458 - (show annotations) (download)
Mon Aug 1 08:47:25 2011 UTC (12 years, 9 months ago) by niro
File size: 9036 byte(s)
-added buildfixes against newer libnl
1 From bc937fc4ff6715e9bee939041fa02be0755d7d58 Mon Sep 17 00:00:00 2001
2 From: Guy Harris <guy@alum.mit.edu>
3 Date: Sat, 13 Nov 2010 17:42:47 -0800
4 Subject: [PATCH] Add support for libnl 2.x, adapted from a newer version of the iw command.
5
6 ---
7 config.h.in | 3 ++
8 configure | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
9 configure.in | 40 ++++++++++++++++++----
10 pcap-linux.c | 58 ++++++++++++++++++++++++-------
11 4 files changed, 184 insertions(+), 25 deletions(-)
12
13 diff --git a/config.h.in b/config.h.in
14 index f988e8f..3b9ce3c 100644
15 --- a/config.h.in
16 +++ b/config.h.in
17 @@ -52,6 +52,9 @@
18 /* if libnl exists */
19 #undef HAVE_LIBNL
20
21 +/* if libnl exists and is version 2.x */
22 +#undef HAVE_LIBNL_2_x
23 +
24 /* Define to 1 if you have the <limits.h> header file. */
25 #undef HAVE_LIMITS_H
26
27 diff --git a/configure b/configure
28 index c99c1ab..7338dee 100755
29 --- a/configure
30 +++ b/configure
31 @@ -7340,7 +7340,93 @@ fi
32
33
34 if test x$with_libnl != xno ; then
35 - { echo "$as_me:$LINENO: checking for nl_handle_alloc in -lnl" >&5
36 + #
37 + # Try libnl 2.x first.
38 + #
39 + { echo "$as_me:$LINENO: checking for nl_socket_alloc in -lnl" >&5
40 +echo $ECHO_N "checking for nl_socket_alloc in -lnl... $ECHO_C" >&6; }
41 +if test "${ac_cv_lib_nl_nl_socket_alloc+set}" = set; then
42 + echo $ECHO_N "(cached) $ECHO_C" >&6
43 +else
44 + ac_check_lib_save_LIBS=$LIBS
45 +LIBS="-lnl $LIBS"
46 +cat >conftest.$ac_ext <<_ACEOF
47 +/* confdefs.h. */
48 +_ACEOF
49 +cat confdefs.h >>conftest.$ac_ext
50 +cat >>conftest.$ac_ext <<_ACEOF
51 +/* end confdefs.h. */
52 +
53 +/* Override any GCC internal prototype to avoid an error.
54 + Use char because int might match the return type of a GCC
55 + builtin and then its argument prototype would still apply. */
56 +#ifdef __cplusplus
57 +extern "C"
58 +#endif
59 +char nl_socket_alloc ();
60 +int
61 +main ()
62 +{
63 +return nl_socket_alloc ();
64 + ;
65 + return 0;
66 +}
67 +_ACEOF
68 +rm -f conftest.$ac_objext conftest$ac_exeext
69 +if { (ac_try="$ac_link"
70 +case "(($ac_try" in
71 + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
72 + *) ac_try_echo=$ac_try;;
73 +esac
74 +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
75 + (eval "$ac_link") 2>conftest.er1
76 + ac_status=$?
77 + grep -v '^ *+' conftest.er1 >conftest.err
78 + rm -f conftest.er1
79 + cat conftest.err >&5
80 + echo "$as_me:$LINENO: \$? = $ac_status" >&5
81 + (exit $ac_status); } && {
82 + test -z "$ac_c_werror_flag" ||
83 + test ! -s conftest.err
84 + } && test -s conftest$ac_exeext &&
85 + $as_test_x conftest$ac_exeext; then
86 + ac_cv_lib_nl_nl_socket_alloc=yes
87 +else
88 + echo "$as_me: failed program was:" >&5
89 +sed 's/^/| /' conftest.$ac_ext >&5
90 +
91 + ac_cv_lib_nl_nl_socket_alloc=no
92 +fi
93 +
94 +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
95 + conftest$ac_exeext conftest.$ac_ext
96 +LIBS=$ac_check_lib_save_LIBS
97 +fi
98 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_nl_nl_socket_alloc" >&5
99 +echo "${ECHO_T}$ac_cv_lib_nl_nl_socket_alloc" >&6; }
100 +if test $ac_cv_lib_nl_nl_socket_alloc = yes; then
101 +
102 + #
103 + # Yes, we have libnl 2.x.
104 + #
105 + LIBS="-lnl-genl -lnl $LIBS"
106 +
107 +cat >>confdefs.h <<\_ACEOF
108 +#define HAVE_LIBNL 1
109 +_ACEOF
110 +
111 +
112 +cat >>confdefs.h <<\_ACEOF
113 +#define HAVE_LIBNL_2_x 1
114 +_ACEOF
115 +
116 +
117 +else
118 +
119 + #
120 + # No, we don't; do we have libnl 1.x?
121 + #
122 + { echo "$as_me:$LINENO: checking for nl_handle_alloc in -lnl" >&5
123 echo $ECHO_N "checking for nl_handle_alloc in -lnl... $ECHO_C" >&6; }
124 if test "${ac_cv_lib_nl_nl_handle_alloc+set}" = set; then
125 echo $ECHO_N "(cached) $ECHO_C" >&6
126 @@ -7402,18 +7488,30 @@ fi
127 { echo "$as_me:$LINENO: result: $ac_cv_lib_nl_nl_handle_alloc" >&5
128 echo "${ECHO_T}$ac_cv_lib_nl_nl_handle_alloc" >&6; }
129 if test $ac_cv_lib_nl_nl_handle_alloc = yes; then
130 - LIBS="-lnl $LIBS"
131 +
132 + #
133 + # Yes.
134 + #
135 + LIBS="-lnl $LIBS"
136
137 cat >>confdefs.h <<\_ACEOF
138 #define HAVE_LIBNL 1
139 _ACEOF
140
141 +
142 else
143 - if test x$with_libnl = xyes ; then
144 - { { echo "$as_me:$LINENO: error: libnl support requested but libnl not found" >&5
145 +
146 + #
147 + # No, we don't have libnl at all.
148 + #
149 + if test x$with_libnl = xyes ; then
150 + { { echo "$as_me:$LINENO: error: libnl support requested but libnl not found" >&5
151 echo "$as_me: error: libnl support requested but libnl not found" >&2;}
152 { (exit 1); exit 1; }; }
153 - fi
154 + fi
155 +
156 +fi
157 +
158
159 fi
160
161 diff --git a/configure.in b/configure.in
162 index 16eadf9..ef801ed 100644
163 --- a/configure.in
164 +++ b/configure.in
165 @@ -445,13 +445,39 @@ linux)
166 with_libnl=$withval,,)
167
168 if test x$with_libnl != xno ; then
169 - AC_CHECK_LIB(nl, nl_handle_alloc,
170 - LIBS="-lnl $LIBS"
171 - AC_DEFINE(HAVE_LIBNL,1,[if libnl exists]),
172 - if test x$with_libnl = xyes ; then
173 - AC_MSG_ERROR([libnl support requested but libnl not found])
174 - fi
175 - )
176 + #
177 + # Try libnl 2.x first.
178 + #
179 + AC_CHECK_LIB(nl, nl_socket_alloc,
180 + [
181 + #
182 + # Yes, we have libnl 2.x.
183 + #
184 + LIBS="-lnl-genl -lnl $LIBS"
185 + AC_DEFINE(HAVE_LIBNL,1,[if libnl exists])
186 + AC_DEFINE(HAVE_LIBNL_2_x,1,[if libnl exists and is version 2.x])
187 + ],
188 + [
189 + #
190 + # No, we don't; do we have libnl 1.x?
191 + #
192 + AC_CHECK_LIB(nl, nl_handle_alloc,
193 + [
194 + #
195 + # Yes.
196 + #
197 + LIBS="-lnl $LIBS"
198 + AC_DEFINE(HAVE_LIBNL,1,[if libnl exists])
199 + ],
200 + [
201 + #
202 + # No, we don't have libnl at all.
203 + #
204 + if test x$with_libnl = xyes ; then
205 + AC_MSG_ERROR([libnl support requested but libnl not found])
206 + fi
207 + ])
208 + ])
209 fi
210
211 AC_LBL_TPACKET_STATS
212 diff --git a/pcap-linux.c b/pcap-linux.c
213 index f8b3f10..deabbc4 100644
214 --- a/pcap-linux.c
215 +++ b/pcap-linux.c
216 @@ -527,8 +527,37 @@ get_mac80211_phydev(pcap_t *handle, const char *device, char *phydev_path,
217 return 1;
218 }
219
220 +#ifndef HAVE_LIBNL_2_x
221 +/* libnl 2.x compatibility code */
222 +
223 +#define nl_sock nl_handle
224 +
225 +static inline struct nl_handle *
226 +nl_socket_alloc(void)
227 +{
228 + return nl_handle_alloc();
229 +}
230 +
231 +static inline void
232 +nl_socket_free(struct nl_handle *h)
233 +{
234 + nl_handle_destroy(h);
235 +}
236 +
237 +static inline int
238 +__genl_ctrl_alloc_cache(struct nl_handle *h, struct nl_cache **cache)
239 +{
240 + struct nl_cache *tmp = genl_ctrl_alloc_cache(h);
241 + if (!tmp)
242 + return -ENOMEM;
243 + *cache = tmp;
244 + return 0;
245 +}
246 +#define genl_ctrl_alloc_cache __genl_ctrl_alloc_cache
247 +#endif /* !HAVE_LIBNL_2_x */
248 +
249 struct nl80211_state {
250 - struct nl_handle *nl_handle;
251 + struct nl_sock *nl_sock;
252 struct nl_cache *nl_cache;
253 struct genl_family *nl80211;
254 };
255 @@ -536,23 +565,26 @@ struct nl80211_state {
256 static int
257 nl80211_init(pcap_t *handle, struct nl80211_state *state, const char *device)
258 {
259 - state->nl_handle = nl_handle_alloc();
260 - if (!state->nl_handle) {
261 + int err;
262 +
263 + state->nl_sock = nl_socket_alloc();
264 + if (!state->nl_sock) {
265 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
266 "%s: failed to allocate netlink handle", device);
267 return PCAP_ERROR;
268 }
269
270 - if (genl_connect(state->nl_handle)) {
271 + if (genl_connect(state->nl_sock)) {
272 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
273 "%s: failed to connect to generic netlink", device);
274 goto out_handle_destroy;
275 }
276
277 - state->nl_cache = genl_ctrl_alloc_cache(state->nl_handle);
278 - if (!state->nl_cache) {
279 + err = genl_ctrl_alloc_cache(state->nl_sock, &state->nl_cache);
280 + if (err < 0) {
281 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
282 - "%s: failed to allocate generic netlink cache", device);
283 + "%s: failed to allocate generic netlink cache: %s",
284 + device, strerror(-err));
285 goto out_handle_destroy;
286 }
287
288 @@ -568,7 +600,7 @@ nl80211_init(pcap_t *handle, struct nl80211_state *state, const char *device)
289 out_cache_free:
290 nl_cache_free(state->nl_cache);
291 out_handle_destroy:
292 - nl_handle_destroy(state->nl_handle);
293 + nl_socket_free(state->nl_sock);
294 return PCAP_ERROR;
295 }
296
297 @@ -577,7 +609,7 @@ nl80211_cleanup(struct nl80211_state *state)
298 {
299 genl_family_put(state->nl80211);
300 nl_cache_free(state->nl_cache);
301 - nl_handle_destroy(state->nl_handle);
302 + nl_socket_free(state->nl_sock);
303 }
304
305 static int
306 @@ -605,7 +637,7 @@ add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state,
307 NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, mondevice);
308 NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, NL80211_IFTYPE_MONITOR);
309
310 - err = nl_send_auto_complete(state->nl_handle, msg);
311 + err = nl_send_auto_complete(state->nl_sock, msg);
312 if (err < 0) {
313 if (err == -ENFILE) {
314 /*
315 @@ -626,7 +658,7 @@ add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state,
316 return PCAP_ERROR;
317 }
318 }
319 - err = nl_wait_for_ack(state->nl_handle);
320 + err = nl_wait_for_ack(state->nl_sock);
321 if (err < 0) {
322 if (err == -ENFILE) {
323 /*
324 @@ -685,7 +717,7 @@ del_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state,
325 0, NL80211_CMD_DEL_INTERFACE, 0);
326 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
327
328 - err = nl_send_auto_complete(state->nl_handle, msg);
329 + err = nl_send_auto_complete(state->nl_sock, msg);
330 if (err < 0) {
331 if (err == -ENFILE) {
332 /*
333 @@ -706,7 +738,7 @@ del_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state,
334 return PCAP_ERROR;
335 }
336 }
337 - err = nl_wait_for_ack(state->nl_handle);
338 + err = nl_wait_for_ack(state->nl_sock);
339 if (err < 0) {
340 if (err == -ENFILE) {
341 /*
342 --
343 1.7.3.5
344