Annotation of embedaddon/libnet/acinclude.m4, revision 1.1.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>