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>