Annotation of embedaddon/libnet/acinclude.m4, revision 1.1
1.1 ! misho 1: dnl $Id: acinclude.m4,v 1.3 2004/01/15 23:53:06 mike 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>