1: dnl $Id: acinclude.m4,v 1.1 2012/02/21 22:14:23 misho Exp $
2: dnl
3: dnl Libnet specific autoconf macros
4: dnl Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
5: dnl All rights reserved.
6: dnl
7:
8: dnl
9: dnl Check for the Linux /proc filesystem
10: dnl
11: dnl usage: AC_LIBNET_LINUX_PROCFS
12: dnl results: HAVE_LINUX_PROCFS
13: dnl
14: AC_DEFUN(AC_LIBNET_LINUX_PROCFS,
15: [AC_MSG_CHECKING(for Linux proc filesystem)
16: AC_CACHE_VAL(ac_cv_libnet_linux_procfs,
17: if test "x`cat /proc/sys/kernel/ostype 2>&-`" = "xLinux" ; then
18: ac_cv_libnet_linux_procfs=yes
19: else
20: ac_cv_libnet_linux_procfs=no
21: fi)
22: AC_MSG_RESULT($ac_cv_libnet_linux_procfs)
23: if test $ac_cv_libnet_linux_procfs = yes ; then
24: AC_DEFINE(HAVE_LINUX_PROCFS, 1,
25: [Define if you have the Linux /proc filesystem.])
26: fi])
27:
28: dnl
29: dnl Checks to see if this linux kernel has a working PF_PACKET
30: dnl
31: dnl usage:
32: dnl
33: dnl AC_LIBNET_CHECK_PF_PACKET
34: dnl
35: dnl results:
36: dnl
37: dnl HAVE_PACKET_SOCKET (DEFINED)
38: dnl
39:
40: AC_DEFUN(AC_LIBNET_CHECK_PF_PACKET,
41: [
42: AC_MSG_CHECKING(for packet socket (PF_SOCKET))
43: AC_CACHE_VAL(ac_libnet_have_packet_socket,
44:
45: [case "$target_os" in
46:
47: linux)
48: ac_libnet_have_packet_socket = no
49: ;;
50: *)
51:
52: cat > pf_packet-test.c << EOF
53: #include <stdio.h>
54: #include <errno.h>
55: #include <stdlib.h>
56: #include <netinet/in.h>
57: #include <sys/socket.h>
58: #include <features.h> /* for the glibc version number */
59: #if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
60: #include <netpacket/packet.h>
61: #include <net/ethernet.h> /* the L2 protocols */
62: #else
63: #include <asm/types.h>
64: #include <linux/if_packet.h>
65: #include <linux/if_ether.h> /* The L2 protocols */
66: #endif
67:
68: #ifndef SOL_PACKET
69: #define SOL_PACKET 263
70: #endif /* SOL_PACKET */
71:
72: int
73: main(int argc, char **argv)
74: {
75: int fd;
76:
77: fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
78: if (fd == -1)
79: {
80: if (errno == EPERM)
81: {
82: /* user's UID != 0 */
83: printf("probably");
84: exit (EXIT_FAILURE);
85: }
86: printf("no");
87: exit (EXIT_FAILURE);
88: }
89: printf("yes");
90: exit (EXIT_SUCCESS);
91: }
92: EOF
93: ${CC-cc} -o pf_packet-test $CFLAGS pf_packet-test.c >/dev/null 2>&1
94:
95: # Oopz 4.3 BSD doesn't have this. Sorry.
96: if test ! -x ./pf_packet-test ; then
97: ac_libnet_have_packet_socket=choked
98: else
99: ac_libnet_have_packet_socket=`./pf_packet-test`;
100: fi
101: if test $ac_libnet_have_packet_socket = choked; then
102: AC_MSG_RESULT(test program compile choked... assuming no)
103: elif test $ac_libnet_have_packet_socket = yes; then
104: AC_MSG_RESULT(yes)
105: elif test $ac_libnet_have_packet_socket = probably; then
106: AC_MSG_RESULT(test program got EPERM... assuming yes)
107: elif test $ac_libnet_have_packet_socket = no; then
108: AC_MSG_RESULT(no)
109: fi
110:
111: rm -f pf_packet-test* core core.pf_packet-test
112: ;;
113: esac])
114:
115: if test $ac_libnet_have_packet_socket = yes -o $ac_libnet_have_packet_socket = probably; then
116: AC_DEFINE(HAVE_PACKET_SOCKET)
117: fi
118: ])
119:
120: dnl
121: dnl Looks for a previous libnet version and attempts to determine which verion
122: dnl it is. Version 0.8 was the first version that actually knew internally
123: dnl what version it was.
124: dnl
125: dnl usage:
126: dnl
127: dnl AC_LIBNET_CHECK_LIBNET_VERSION
128: dnl
129: dnl results:
130: dnl
131: dnl
132: dnl
133:
134: AC_DEFUN(AC_LIBNET_CHECK_LIBNET_VER,
135: [
136: AC_CHECK_LIB(net, libnet_build_ip, AC_MSG_CHECKING(version) \
137:
138: changequote(<<, >>)dnl
139: if [[ ! -f $LIB_PREFIX/libnet.a ]] ; then
140: changequote([, ])dnl
141: AC_MSG_RESULT($LIB_PREFIX/libnet.a doesn't exist)
142: AC_MSG_RESULT(previous libnet install lives elsewhere, you should probably find it)
143: else
144: __LIBNET_VERSION=`strings $LIB_PREFIX/libnet.a | grep "libnet version"\
145: | cut -f3 -d" "`;\
146: if test -z "$__LIBNET_VERSION"; then
147: AC_MSG_RESULT(<0.8)
148: else
149: AC_MSG_RESULT($__LIBNET_VERSION)
150: fi
151: fi\
152: )
153: ])
154:
155:
156: dnl
157: dnl Checks to see if this linux kernel uses ip_sum or ip_csum
158: dnl (Pulled from queso)
159: dnl
160: dnl usage:
161: dnl
162: dnl AC_LIBNET_CHECK_IP_CSUM
163: dnl
164: dnl results:
165: dnl
166: dnl HAVE_STRUCT_IP_CSUM (DEFINED)
167: dnl
168:
169: AC_DEFUN(AC_LIBNET_CHECK_IP_CSUM,
170: [
171: AC_MSG_CHECKING([struct ip contains ip_csum])
172: AC_TRY_COMPILE([
173: #define __BSD_SOURCE
174: #define _BSD_SOURCE
175: #include <sys/types.h>
176: #include <netinet/in.h>
177: #include <netinet/in_systm.h>
178: #include <netinet/ip.h>],
179: [
180: struct ip ip;
181: ip.ip_csum = 0;
182: ],
183: [AC_MSG_RESULT(yes);
184: AC_DEFINE(HAVE_STRUCT_IP_CSUM)],
185: [AC_MSG_RESULT(no);
186: ])
187: ])
188:
189: dnl
190: dnl Checks to see if unaligned memory accesses fail
191: dnl (Pulled from libpcap)
192: dnl
193: dnl usage:
194: dnl
195: dnl AC_LBL_UNALIGNED_ACCESS
196: dnl
197: dnl results:
198: dnl
199: dnl LBL_ALIGN (DEFINED)
200: dnl
201:
202: AC_DEFUN(AC_LBL_UNALIGNED_ACCESS,
203: [AC_MSG_CHECKING(if unaligned accesses fail)
204: AC_CACHE_VAL(ac_cv_lbl_unaligned_fail,
205: [case "$target_cpu" in
206:
207: alpha|hp*|mips|sparc)
208: ac_cv_lbl_unaligned_fail=yes
209: ;;
210:
211: *)
212: cat >conftest.c <<EOF
213: # include <sys/types.h>
214: # include <sys/wait.h>
215: # include <stdio.h>
216: unsigned char a[[5]] = { 1, 2, 3, 4, 5 };
217: main()
218: {
219: unsigned int i;
220: pid_t pid;
221: int status;
222: /* avoid "core dumped" message */
223: pid = fork();
224: if (pid < 0)
225: {
226: exit(2);
227: }
228: if (pid > 0)
229: {
230: /* parent */
231: pid = waitpid(pid, &status, 0);
232: if (pid < 0)
233: {
234: exit(3);
235: }
236: exit(!WIFEXITED(status));
237: }
238: /* child */
239: i = *(unsigned int *)&a[[1]];
240: printf("%d\n", i);
241: exit(0);
242: }
243: EOF
244: ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS \
245: conftest.c $LIBS > /dev/null 2>&1
246: # Oopz 4.3 BSD doesn't have this. Sorry.
247: if test ! -x conftest ; then
248: dnl failed to compile for some reason
249: ac_cv_lbl_unaligned_fail=yes
250: else
251: ./conftest > conftest.out
252: if test ! -s conftest.out ; then
253: ac_cv_lbl_unaligned_fail=yes
254: else
255: ac_cv_lbl_unaligned_fail=no
256: fi
257: fi
258: rm -f conftest* core core.conftest
259: ;;
260: esac])
261: AC_MSG_RESULT($ac_cv_lbl_unaligned_fail)
262: if test $ac_cv_lbl_unaligned_fail = yes ; then
263: AC_DEFINE(LBL_ALIGN)
264: fi
265: ])
266:
267:
268: dnl
269: dnl Checks endianess
270: dnl
271: dnl usage:
272: dnl
273: dnl AC_LIBNET_ENDIAN_CHECK
274: dnl
275: dnl results:
276: dnl
277: dnl LIBNET_BIG_ENDIAN = 1 or
278: dnl LIBNET_LIL_ENDIAN = 1
279: dnl
280:
281: AC_DEFUN(AC_LIBNET_ENDIAN_CHECK,
282: [AC_MSG_CHECKING(machine endianess)
283:
284: cat > conftest.c << EOF
285: # include <stdio.h>
286: # include <stdlib.h>
287:
288: int main()
289: {
290: union
291: {
292: short s;
293: char c[[sizeof(short)]];
294: } un;
295:
296: un.s = 0x0102;
297: if (sizeof (short) == 2)
298: {
299: if (un.c [[0]] == 1 && un.c [[1]] == 2)
300: {
301: printf("B\n");
302: }
303: else
304: {
305: if (un.c [[0]] == 2 && un.c [[1]] == 1)
306: {
307: printf("L\n");
308: }
309: }
310: }
311: else
312: {
313: printf("?\n");
314: }
315: return (EXIT_SUCCESS);
316: }
317: EOF
318: ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.c $LIBS > /dev/null 2>&1
319: # Oopz 4.3 BSD doesn't have this. Sorry.
320: if test ! -x conftest ; then
321: dnl failed to compile for some reason
322: ac_cv_libnet_endianess=unknown
323: else
324: ./conftest > conftest.out
325: result=`cat conftest.out`
326: if test $result = "B"; then
327: ac_cv_libnet_endianess=big
328: elif test $result = "L"; then
329: ac_cv_libnet_endianess=lil
330: else
331: ac_cv_libnet_endianess=unknown
332: fi
333: fi
334: rm -f conftest* core core.conftest
335:
336: AC_MSG_RESULT($ac_cv_libnet_endianess)
337:
338: if test $ac_cv_libnet_endianess = big ; then
339: AC_DEFINE(LIBNET_BIG_ENDIAN)
340: ENDIANESS="LIBNET_BIG_ENDIAN"
341: LIBNET_CONFIG_DEFINES="$LIBNET_CONFIG_DEFINES -DLIBNET_BIG_ENDIAN"
342: elif test $ac_cv_libnet_endianess = lil ; then
343: AC_DEFINE(LIBNET_LIL_ENDIAN)
344: ENDIANESS="LIBNET_LIL_ENDIAN"
345: LIBNET_CONFIG_DEFINES="$LIBNET_CONFIG_DEFINES -DLIBNET_LIL_ENDIAN"
346: fi
347: ])
348:
349: dnl
350: dnl Improved version of AC_CHECK_LIB
351: dnl
352: dnl Thanks to John Hawkinson (jhawk@mit.edu)
353: dnl
354: dnl usage:
355: dnl
356: dnl AC_LBL_CHECK_LIB(LIBRARY, FUNCTION [, ACTION-IF-FOUND [,
357: dnl ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]])
358: dnl
359: dnl results:
360: dnl
361: dnl LIBS
362: dnl
363:
364: define(AC_LBL_CHECK_LIB,
365: [AC_MSG_CHECKING([for $2 in -l$1])
366: dnl Use a cache variable name containing both the library and function name,
367: dnl because the test really is for library $1 defining function $2, not
368: dnl just for library $1. Separate tests with the same $1 and different $2's
369: dnl may have different results.
370: ac_lib_var=`echo $1['_']$2['_']$5 | sed 'y%./+- %__p__%'`
371: AC_CACHE_VAL(ac_cv_lbl_lib_$ac_lib_var,
372: [ac_save_LIBS="$LIBS"
373: LIBS="-l$1 $5 $LIBS"
374: AC_TRY_LINK(dnl
375: ifelse([$2], [main], , dnl Avoid conflicting decl of main.
376: [/* Override any gcc2 internal prototype to avoid an error. */
377: ]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus
378: extern "C"
379: #endif
380: ])dnl
381: [/* We use char because int might match the return type of a gcc2
382: builtin and then its argument prototype would still apply. */
383: char $2();
384: ]),
385: [$2()],
386: eval "ac_cv_lbl_lib_$ac_lib_var=yes",
387: eval "ac_cv_lbl_lib_$ac_lib_var=no")
388: LIBS="$ac_save_LIBS"
389: ])dnl
390: if eval "test \"`echo '$ac_cv_lbl_lib_'$ac_lib_var`\" = yes"; then
391: AC_MSG_RESULT(yes)
392: ifelse([$3], ,
393: [changequote(, )dnl
394: ac_tr_lib=HAVE_LIB`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \
395: -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
396: changequote([, ])dnl
397: AC_DEFINE_UNQUOTED($ac_tr_lib)
398: LIBS="-l$1 $LIBS"
399: ], [$3])
400: else
401: AC_MSG_RESULT(no)
402: ifelse([$4], , , [$4
403: ])dnl
404: fi
405: ])
406:
407: dnl
408: dnl AC_LBL_LIBRARY_NET
409: dnl
410: dnl This test is for network applications that need socket() and
411: dnl gethostbyname() -ish functions. Under Solaris, those applications
412: dnl need to link with "-lsocket -lnsl". Under IRIX, they need to link
413: dnl with "-lnsl" but should *not* link with "-lsocket" because
414: dnl libsocket.a breaks a number of things (for instance:
415: dnl gethostbyname() under IRIX 5.2, and snoop sockets under most
416: dnl versions of IRIX).
417: dnl
418: dnl Unfortunately, many application developers are not aware of this,
419: dnl and mistakenly write tests that cause -lsocket to be used under
420: dnl IRIX. It is also easy to write tests that cause -lnsl to be used
421: dnl under operating systems where neither are necessary (or useful),
422: dnl such as SunOS 4.1.4, which uses -lnsl for TLI.
423: dnl
424: dnl This test exists so that every application developer does not test
425: dnl this in a different, and subtly broken fashion.
426:
427: dnl It has been argued that this test should be broken up into two
428: dnl seperate tests, one for the resolver libraries, and one for the
429: dnl libraries necessary for using Sockets API. Unfortunately, the two
430: dnl are carefully intertwined and allowing the autoconf user to use
431: dnl them independantly potentially results in unfortunate ordering
432: dnl dependancies -- as such, such component macros would have to
433: dnl carefully use indirection and be aware if the other components were
434: dnl executed. Since other autoconf macros do not go to this trouble,
435: dnl and almost no applications use sockets without the resolver, this
436: dnl complexity has not been implemented.
437: dnl
438: dnl The check for libresolv is in case you are attempting to link
439: dnl statically and happen to have a libresolv.a lying around (and no
440: dnl libnsl.a).
441: dnl
442: AC_DEFUN(AC_LBL_LIBRARY_NET, [
443: # Most operating systems have gethostbyname() in the default searched
444: # libraries (i.e. libc):
445: AC_CHECK_FUNC(gethostbyname, ,
446: # Some OSes (eg. Solaris) place it in libnsl:
447: AC_LBL_CHECK_LIB(nsl, gethostbyname, ,
448: # Some strange OSes (SINIX) have it in libsocket:
449: AC_LBL_CHECK_LIB(socket, gethostbyname, ,
450: # Unfortunately libsocket sometimes depends on libnsl.
451: # AC_CHECK_LIB's API is essentially broken so the
452: # following ugliness is necessary:
453: AC_LBL_CHECK_LIB(socket, gethostbyname,
454: LIBS="-lsocket -lnsl $LIBS",
455: AC_CHECK_LIB(resolv, gethostbyname),
456: -lnsl))))
457: AC_CHECK_FUNC(socket, , AC_CHECK_LIB(socket, socket, ,
458: AC_LBL_CHECK_LIB(socket, socket, LIBS="-lsocket -lnsl $LIBS", ,
459: -lnsl)))
460: # DLPI needs putmsg under HPUX so test for -lstr while we're at it
461: AC_CHECK_LIB(str, putmsg)
462: ])
463:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>