GNU/Linux and FreeBSD are also fine with these.
struct addrinfo hints, *ai;
memset(&hints, '\0', sizeof(hints));
- hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
+ hints.ai_flags = AI_PASSIVE;
+#ifdef AI_ADDRCONFIG
+ hints.ai_flags |= AI_ADDRCONFIG;
+#endif
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
#define ETHERTYPE_PPPOE 0x8864
#endif
+#ifndef ETHERTYPE_IPV6
+# include <net/if_ether.h> /* ETH_P_IPV6 for GNU/kfreebsd */
+# define ETHERTYPE_IPV6 ETH_P_IPV6
+#endif
+
#include <net/if.h> /* struct ifreq */
#include <netinet/in_systm.h> /* n_long */
#include <netinet/ip.h> /* struct ip */
*/
#include <pcap.h>
+#include <netinet/in_systm.h> /* n_time */
#include <netinet/in.h> /* in_addr_t */
#include <netinet/ip.h> /* struct ip */
memset(&hints, '\0', sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
+ hints.ai_flags = AI_PASSIVE;
+#ifdef AI_ADDRCONFIG
+ hints.ai_flags |= AI_ADDRCONFIG;
+#endif
snprintf(portstr, sizeof(portstr), "%u", bindport);
- if (ret = getaddrinfo(bindaddr, portstr, &hints, &aiptr))
+ if ((ret = getaddrinfo(bindaddr, portstr, &hints, &aiptr)))
err(1, "getaddrinfo(): %s", gai_strerror(ret));
for (ai = aiptr; ai; ai = ai->ai_next) {
/* bind socket */
memcpy(&addrin, ai->ai_addr, ai->ai_addrlen);
- if (bind(sockin, (struct sockaddr *)&addrin,
- sizeof(addrin)) == -1) {
+ if (bind(sockin, (struct sockaddr *)&addrin, ai->ai_addrlen) == -1) {
close(sockin);
continue;
}
}
/* IPv6 needs some obvious exceptions. */
- if( ifa->ifa_addr->sa_family == AF_INET6 ) {
+ if ( ifa->ifa_addr->sa_family == AF_INET6 ) {
struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) ifa->ifa_addr;
-#ifdef __FreeBSD__
- if( IN6_IS_ADDR_LINKLOCAL(&(sa6->sin6_addr))
- || IN6_IS_ADDR_SITELOCAL(&(sa6->sin6_addr)) )
-#else
- if( IN6_IS_ADDR_LINKLOCAL(&(sa6->sin6_addr.s6_addr))
- || IN6_IS_ADDR_SITELOCAL(&(sa6->sin6_addr.s6_addr)) )
-#endif
+ if ( IN6_IS_ADDR_LINKLOCAL(&(sa6->sin6_addr))
+ || IN6_IS_ADDR_SITELOCAL(&(sa6->sin6_addr)) )
continue;
else
/* Only standard IPv6 can reach this point. */