File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libnet / acinclude.m4
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:14:23 2012 UTC (12 years, 8 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

    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>