#include <netinet/icmp6.h>
#include <netinet/udp.h>
-#include <net/if.h>
-#include <ifaddrs.h>
-#include <sys/ioctl.h>
+#ifdef HAVE_GETIFADDRS
+# include <net/if.h>
+# include <ifaddrs.h>
+# include <sys/ioctl.h>
+#endif
#include <mLib/alloc.h>
#include <mLib/bits.h>
}
}
-/* Compare two addresses. Maybe compare the port numbers too. */
-#define AEF_PORT 1u
-static int addreq(const union addr *a, const union addr *b, unsigned f)
-{
- switch (a->sa.sa_family) {
- case AF_INET:
- return (a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr &&
- (!(f&AEF_PORT) || a->sin.sin_port == b->sin.sin_port));
- case AF_INET6:
- return (!memcmp(a->sin6.sin6_addr.s6_addr,
- b->sin6.sin6_addr.s6_addr, 16) &&
- (!(f&AEF_PORT) || a->sin6.sin6_port == b->sin6.sin6_port));
- default:
- abort();
- }
-}
-
/*----- Main algorithm skeleton -------------------------------------------*/
struct param {
/*----- Doing it the hard way ---------------------------------------------*/
+#ifdef HAVE_GETIFADDRS
+
#if defined(linux) || defined(__OpenBSD__)
-#define IPHDR_SANE
+# define IPHDR_SANE
#endif
#ifdef IPHDR_SANE
#define IPCK_INIT 0xffff
+/* Compare two addresses. Maybe compare the port numbers too. */
+#define AEF_PORT 1u
+static int addreq(const union addr *a, const union addr *b, unsigned f)
+{
+ switch (a->sa.sa_family) {
+ case AF_INET:
+ return (a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr &&
+ (!(f&AEF_PORT) || a->sin.sin_port == b->sin.sin_port));
+ case AF_INET6:
+ return (!memcmp(a->sin6.sin6_addr.s6_addr,
+ b->sin6.sin6_addr.s6_addr, 16) &&
+ (!(f&AEF_PORT) || a->sin6.sin6_port == b->sin6.sin6_port));
+ default:
+ abort();
+ }
+}
+
/* Compute an IP checksum over some data. This is a restartable interface:
* initialize A to `IPCK_INIT' for the first call.
*/
#undef OPS_CHAIN
#define OPS_CHAIN &raw_ops
+#endif
+
/*----- Doing the job on Linux --------------------------------------------*/
#if defined(linux)
#define f_bogus 1u
+#ifdef HAVE_GETIFADDRS
if ((rawicmp = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0 ||
(rawudp = socket(PF_INET, SOCK_RAW, IPPROTO_UDP)) < 0)
rawerr = errno;
if ((rawicmp6 = socket(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0 ||
(rawudp6 = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW)) < 0)
rawerr6 = errno;
+#endif
if (setuid(getuid()))
abort();