X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Futils_dns.c;h=e9aec38f6b8a010b6510652eb72cb6971c533bf7;hb=98da2aa3ade7446863800c2f219d8a53fb2fbf6f;hp=19afe55e904fe08d75b64e333f790cbdcbb796e1;hpb=a25ac81f5bd545fc52301596eb22cd45782958c9;p=collectd.git diff --git a/src/utils_dns.c b/src/utils_dns.c index 19afe55e..e9aec38f 100644 --- a/src/utils_dns.c +++ b/src/utils_dns.c @@ -33,39 +33,62 @@ * Florian octo Forster */ -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef __APPLE__ -#include -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include +#include "collectd.h" + +#if HAVE_NETINET_IN_H +# include +#endif +#if HAVE_PCAP_H +# include +#endif +#if HAVE_ARPA_INET_H +# include +#endif + +#if HAVE_ARPA_NAMESER_H +# include +#elif HAVE_ARPA_NAMESER_COMPAT_H +# include +#endif + +#if HAVE_NET_IF_ARP_H +# include +#endif +#if HAVE_NET_IF_H +# include +#endif +#if HAVE_NETINET_IF_ETHER_H +# include +#endif +#if HAVE_NET_IF_PPP_H +# include +#endif + +#if HAVE_SYS_SOCKET_H +# include +#endif +#if HAVE_NETDB_H +# include +#endif + +#if HAVE_NETINET_IN_SYSTM_H +# include +#endif +#if HAVE_NETINET_IN_H +# include +#endif +#if HAVE_NETINET_IP_H +# include +#endif +#ifdef HAVE_NETINET_IP_VAR_H +# include +#endif +#if HAVE_NETINET_IP6_H +# include +#endif +#if HAVE_NETINET_UDP_H +# include +#endif #define PCAP_SNAPLEN 1460 #ifndef ETHER_HDR_LEN @@ -80,7 +103,6 @@ # define ETHERTYPE_IPV6 0x86DD #endif -#include #ifndef PPP_ADDRESS_VAL # define PPP_ADDRESS_VAL 0xff /* The address byte value */ #endif @@ -126,33 +148,39 @@ int qtype_counts[T_MAX]; int opcode_counts[OP_MAX]; int qclass_counts[C_MAX]; +#if HAVE_PCAP_H static pcap_t *pcap_obj = NULL; +#endif static ip_list_t *IgnoreList = NULL; +#if HAVE_PCAP_H static void (*Callback) (const rfc1035_header_t *) = NULL; static int query_count_intvl = 0; static int query_count_total = 0; -#ifdef __OpenBSD__ +# ifdef __OpenBSD__ static struct bpf_timeval last_ts; -#else +# else static struct timeval last_ts; -#endif +# endif /* __OpenBSD__ */ +#endif /* HAVE_PCAP_H */ static int cmp_in6_addr (const struct in6_addr *a, const struct in6_addr *b) { int i; - for (i = 0; i < 4; i++) - if (a->s6_addr32[i] != b->s6_addr32[i]) + assert (sizeof (struct in6_addr) == 16); + + for (i = 0; i < 16; i++) + if (a->s6_addr[i] != b->s6_addr[i]) break; - if (i >= 4) + if (i >= 16) return (0); - return (a->s6_addr32[i] > b->s6_addr32[i] ? 1 : -1); + return (a->s6_addr[i] > b->s6_addr[i] ? 1 : -1); } /* int cmp_addrinfo */ static inline int ignore_list_match (const struct in6_addr *addr) @@ -200,10 +228,10 @@ void ignore_list_add_name (const char *name) { if (ai_ptr->ai_family == AF_INET) { - addr.s6_addr32[0] = 0; - addr.s6_addr32[1] = 0; - addr.s6_addr32[2] = htonl (0x0000FFFF); - addr.s6_addr32[3] = ((struct sockaddr_in *) ai_ptr->ai_addr)->sin_addr.s_addr; + memset (&addr, '\0', sizeof (addr)); + addr.s6_addr[10] = 0xFF; + addr.s6_addr[11] = 0xFF; + memcpy (addr.s6_addr + 12, &((struct sockaddr_in *) ai_ptr->ai_addr)->sin_addr, 4); ignore_list_add (&addr); } @@ -216,6 +244,7 @@ void ignore_list_add_name (const char *name) freeaddrinfo (ai_list); } +#if HAVE_PCAP_H static void in6_addr_from_buffer (struct in6_addr *ia, const void *buf, size_t buf_len, int family) @@ -223,8 +252,9 @@ static void in6_addr_from_buffer (struct in6_addr *ia, memset (ia, 0, sizeof (struct in6_addr)); if ((AF_INET == family) && (sizeof (uint32_t) == buf_len)) { - ia->s6_addr32[2] = htonl (0x0000FFFF); - ia->s6_addr32[3] = *((uint32_t *) buf); + ia->s6_addr[10] = 0xFF; + ia->s6_addr[11] = 0xFF; + memcpy (ia->s6_addr + 12, buf, buf_len); } else if ((AF_INET6 == family) && (sizeof (struct in6_addr) == buf_len)) { @@ -480,6 +510,7 @@ handle_ip(const struct ip *ip, int len) return 1; } +#if HAVE_NET_IF_PPP_H static int handle_ppp(const u_char * pkt, int len) { @@ -509,6 +540,7 @@ handle_ppp(const u_char * pkt, int len) memcpy(buf, pkt, len); return handle_ip((struct ip *) buf, len); } +#endif /* HAVE_NET_IF_PPP_H */ static int handle_null(const u_char * pkt, int len) @@ -567,6 +599,40 @@ handle_ether(const u_char * pkt, int len) return handle_ip((struct ip *) buf, len); } +#ifdef DLT_LINUX_SLL +static int +handle_linux_sll (const u_char *pkt, int len) +{ + struct sll_header + { + uint16_t pkt_type; + uint16_t dev_type; + uint16_t addr_len; + uint8_t addr[8]; + uint16_t proto_type; + } *hdr; + uint16_t etype; + + if (len < sizeof (struct sll_header)) + return (0); + + hdr = (struct sll_header *) pkt; + pkt = (u_char *) (hdr + 1); + len -= sizeof (struct sll_header); + + etype = ntohs (hdr->proto_type); + + if ((ETHERTYPE_IP != etype) + && (ETHERTYPE_IPV6 != etype)) + return 0; + + if (ETHERTYPE_IPV6 == etype) + return (handle_ipv6 ((struct ip6_hdr *) pkt, len)); + else + return handle_ip((struct ip *) pkt, len); +} +#endif /* DLT_LINUX_SLL */ + /* public function */ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt) { @@ -584,9 +650,11 @@ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt case DLT_EN10MB: status = handle_ether (pkt, hdr->caplen); break; +#if HAVE_NET_IF_PPP_H case DLT_PPP: status = handle_ppp (pkt, hdr->caplen); break; +#endif #ifdef DLT_LOOP case DLT_LOOP: status = handle_loop (pkt, hdr->caplen); @@ -596,6 +664,11 @@ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt case DLT_RAW: status = handle_raw (pkt, hdr->caplen); break; +#endif +#ifdef DLT_LINUX_SLL + case DLT_LINUX_SLL: + status = handle_linux_sll (pkt, hdr->caplen); + break; #endif case DLT_NULL: status = handle_null (pkt, hdr->caplen); @@ -615,6 +688,7 @@ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt query_count_total++; last_ts = hdr->ts; } +#endif /* HAVE_PCAP_H */ const char *qtype_str(int t) { @@ -831,7 +905,7 @@ main(int argc, char *argv[]) case DLT_EN10MB: handle_datalink = handle_ether; break; -#if USE_PPP +#if HAVE_NET_IF_PPP_H case DLT_PPP: handle_datalink = handle_ppp; break; @@ -898,3 +972,6 @@ main(int argc, char *argv[]) return 0; } /* static int main(int argc, char *argv[]) */ #endif +/* + * vim:shiftwidth=4:tabstop=8:softtabstop=4 + */