Skip to content

Commit 605654a

Browse files
committed
autoconf: fix buggy ether_ntohost() test.
First, find out where, if anywhere, ether_ntohost() is declare, *then* test whether it's buggy - using code taken from addrtoname.c to figure out what to include and, if there's nothing that works, how to work around it. (This means that a bunch of platforms will start using ether_ntohost().)
1 parent 97d13d3 commit 605654a

File tree

1 file changed

+89
-34
lines changed

1 file changed

+89
-34
lines changed

configure.ac

Lines changed: 89 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -387,35 +387,6 @@ AC_LBL_LIBPCAP(V_PCAPDEP, V_INCLS)
387387
# Before you is a C compiler.
388388
#
389389
AC_CHECK_FUNCS(ether_ntohost, [
390-
AC_CACHE_CHECK(for buggy ether_ntohost, ac_cv_buggy_ether_ntohost, [
391-
AC_RUN_IFELSE([AC_LANG_SOURCE([[
392-
#include <netdb.h>
393-
#include <netinet/ether.h>
394-
#include <stdlib.h>
395-
#include <sys/types.h>
396-
#include <sys/param.h>
397-
#include <sys/socket.h>
398-
399-
int
400-
main(int argc, char **argv)
401-
{
402-
u_char ea[6] = { 0xff, 0xff, 0xff, 0xff, 0xff };
403-
char name[MAXHOSTNAMELEN];
404-
405-
ether_ntohost(name, (struct ether_addr *)ea);
406-
exit(0);
407-
}
408-
]])
409-
], [ac_cv_buggy_ether_ntohost=no],
410-
[ac_cv_buggy_ether_ntohost=yes],
411-
[ac_cv_buggy_ether_ntohost="not while cross-compiling"])])
412-
if test "$ac_cv_buggy_ether_ntohost" = "no"; then
413-
AC_DEFINE(USE_ETHER_NTOHOST, 1,
414-
[define if you have ether_ntohost() and it works])
415-
fi
416-
])
417-
if test "$ac_cv_func_ether_ntohost" = yes -a \
418-
"$ac_cv_buggy_ether_ntohost" = "no"; then
419390
#
420391
# OK, we have ether_ntohost(). Is it declared in <net/ethernet.h>?
421392
#
@@ -424,7 +395,7 @@ if test "$ac_cv_func_ether_ntohost" = yes -a \
424395
#
425396
AC_CHECK_DECL(ether_ntohost,
426397
[
427-
AC_DEFINE(NET_ETHERNET_H_DECLARES_ETHER_NTOHOST,,
398+
AC_DEFINE(NET_ETHERNET_H_DECLARES_ETHER_NTOHOST,1,
428399
[Define to 1 if net/ethernet.h declares `ether_ntohost'])
429400
],,
430401
[
@@ -472,7 +443,7 @@ if test "$ac_cv_func_ether_ntohost" = yes -a \
472443
unset ac_cv_have_decl_ether_ntohost
473444
AC_CHECK_DECL(ether_ntohost,
474445
[
475-
AC_DEFINE(SYS_ETHERNET_H_DECLARES_ETHER_NTOHOST,,
446+
AC_DEFINE(SYS_ETHERNET_H_DECLARES_ETHER_NTOHOST,1,
476447
[Define to 1 if sys/ethernet.h declares `ether_ntohost'])
477448
],,
478449
[
@@ -499,7 +470,7 @@ if test "$ac_cv_func_ether_ntohost" = yes -a \
499470
unset ac_cv_have_decl_ether_ntohost
500471
AC_CHECK_DECL(ether_ntohost,
501472
[
502-
AC_DEFINE(ARPA_INET_H_DECLARES_ETHER_NTOHOST,,
473+
AC_DEFINE(ARPA_INET_H_DECLARES_ETHER_NTOHOST,1,
503474
[Define to 1 if arpa/inet.h declares `ether_ntohost'])
504475
],,
505476
[
@@ -527,7 +498,7 @@ if test "$ac_cv_func_ether_ntohost" = yes -a \
527498
unset ac_cv_have_decl_ether_ntohost
528499
AC_CHECK_DECL(ether_ntohost,
529500
[
530-
AC_DEFINE(NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST,,
501+
AC_DEFINE(NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST,1,
531502
[Define to 1 if netinet/if_ether.h declares `ether_ntohost'])
532503
],,
533504
[
@@ -562,7 +533,91 @@ if test "$ac_cv_func_ether_ntohost" = yes -a \
562533
#include <netinet/if_ether.h>
563534
])
564535
fi
565-
fi
536+
AC_CACHE_CHECK(for buggy ether_ntohost, ac_cv_buggy_ether_ntohost, [
537+
AC_RUN_IFELSE([AC_LANG_SOURCE([[
538+
#include <netdb.h>
539+
#if defined(NET_ETHERNET_H_DECLARES_ETHER_NTOHOST)
540+
/*
541+
* OK, just include <net/ethernet.h>.
542+
*/
543+
#include <net/ethernet.h>
544+
#elif defined(NETINET_ETHER_H_DECLARES_ETHER_NTOHOST)
545+
/*
546+
* OK, just include <netinet/ether.h>
547+
*/
548+
#include <netinet/ether.h>
549+
#elif defined(SYS_ETHERNET_H_DECLARES_ETHER_NTOHOST)
550+
/*
551+
* OK, just include <sys/ethernet.h>
552+
*/
553+
#include <sys/ethernet.h>
554+
#elif defined(ARPA_INET_H_DECLARES_ETHER_NTOHOST)
555+
/*
556+
* OK, just include <arpa/inet.h>
557+
*/
558+
#include <arpa/inet.h>
559+
#elif defined(NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST)
560+
/*
561+
* OK, include <netinet/if_ether.h>, after all the other stuff we
562+
* need to include or define for its benefit.
563+
*/
564+
#define NEED_NETINET_IF_ETHER_H
565+
#else
566+
/*
567+
* We'll have to declare it ourselves.
568+
* If <netinet/if_ether.h> defines struct ether_addr, include
569+
* it. Otherwise, define it ourselves.
570+
*/
571+
#ifdef HAVE_STRUCT_ETHER_ADDR
572+
#define NEED_NETINET_IF_ETHER_H
573+
#else /* HAVE_STRUCT_ETHER_ADDR */
574+
struct ether_addr {
575+
/* Beware FreeBSD calls this "octet". */
576+
unsigned char ether_addr_octet[MAC_ADDR_LEN];
577+
};
578+
#endif /* HAVE_STRUCT_ETHER_ADDR */
579+
#endif /* what declares ether_ntohost() */
580+
581+
#ifdef NEED_NETINET_IF_ETHER_H
582+
/*
583+
* Include diag-control.h before <net/if.h>, which too defines a macro
584+
* named ND_UNREACHABLE.
585+
*/
586+
#include "diag-control.h"
587+
#include <net/if.h> /* Needed on some platforms */
588+
#include <netinet/in.h> /* Needed on some platforms */
589+
#include <netinet/if_ether.h>
590+
#endif /* NEED_NETINET_IF_ETHER_H */
591+
592+
#ifndef HAVE_DECL_ETHER_NTOHOST
593+
/*
594+
* No header declares it, so declare it ourselves.
595+
*/
596+
extern int ether_ntohost(char *, const struct ether_addr *);
597+
#endif /* !defined(HAVE_DECL_ETHER_NTOHOST) */
598+
#include <stdlib.h>
599+
#include <sys/types.h>
600+
#include <sys/param.h>
601+
#include <sys/socket.h>
602+
603+
int
604+
main(int argc, char **argv)
605+
{
606+
u_char ea[6] = { 0xff, 0xff, 0xff, 0xff, 0xff };
607+
char name[MAXHOSTNAMELEN];
608+
609+
ether_ntohost(name, (struct ether_addr *)ea);
610+
exit(0);
611+
}
612+
]])
613+
], [ac_cv_buggy_ether_ntohost=no],
614+
[ac_cv_buggy_ether_ntohost=yes],
615+
[ac_cv_buggy_ether_ntohost="not while cross-compiling"])])
616+
if test "$ac_cv_buggy_ether_ntohost" = "no"; then
617+
AC_DEFINE(USE_ETHER_NTOHOST, 1,
618+
[define if you have ether_ntohost() and it works])
619+
fi
620+
])
566621

567622
#
568623
# Do we have the new open API? Check for pcap_create, and assume that,

0 commit comments

Comments
 (0)