Many build fixes that turned up with GCC 4.6.
[collectd.git] / src / utils_dns.c
index 0943727..9a2e479 100644 (file)
  *   Florian octo Forster <octo at verplant.org>
  */
 
+#define _BSD_SOURCE
+
 #include "collectd.h"
+#include "plugin.h"
+#include "common.h"
 
 #if HAVE_NETINET_IN_SYSTM_H
 # include <netinet/in_systm.h>
@@ -50,7 +54,8 @@
 
 #if HAVE_ARPA_NAMESER_H
 # include <arpa/nameser.h>
-#elif HAVE_ARPA_NAMESER_COMPAT_H
+#endif
+#if HAVE_ARPA_NAMESER_COMPAT_H
 # include <arpa/nameser_compat.h>
 #endif
 
@@ -63,6 +68,9 @@
 #if HAVE_NETINET_IF_ETHER_H
 # include <netinet/if_ether.h>
 #endif
+#if HAVE_NET_PPP_DEFS_H
+# include <net/ppp_defs.h>
+#endif
 #if HAVE_NET_IF_PPP_H
 # include <net/if_ppp.h>
 #endif
@@ -331,9 +339,7 @@ rfc1035NameUnpack(const char *buf, size_t sz, off_t * off, char *name, size_t ns
 }
 
 static int
-handle_dns(const char *buf, int len,
-       const struct in6_addr *s_addr,
-       const struct in6_addr *d_addr)
+handle_dns(const char *buf, int len)
 {
     rfc1035_header_t qh;
     uint16_t us;
@@ -350,7 +356,6 @@ handle_dns(const char *buf, int len,
 
     memcpy(&us, buf + 2, 2);
     us = ntohs(us);
-    fprintf (stderr, "Bytes 0, 1: 0x%04hx\n", us);
     qh.qr = (us >> 15) & 0x01;
     qh.opcode = (us >> 11) & 0x0F;
     qh.aa = (us >> 10) & 0x01;
@@ -380,13 +385,13 @@ handle_dns(const char *buf, int len,
     if (0 != x)
        return 0;
     if ('\0' == qh.qname[0])
-       strcpy(qh.qname, ".");
+       sstrncpy (qh.qname, ".", sizeof (qh.qname));
     while ((t = strchr(qh.qname, '\n')))
        *t = ' ';
     while ((t = strchr(qh.qname, '\r')))
        *t = ' ';
     for (t = qh.qname; *t; t++)
-       *t = tolower(*t);
+       *t = tolower((int) *t);
 
     memcpy(&us, buf + offset, 2);
     qh.qtype = ntohs(us);
@@ -407,16 +412,14 @@ handle_dns(const char *buf, int len,
 }
 
 static int
-handle_udp(const struct udphdr *udp, int len,
-       const struct in6_addr *s_addr,
-       const struct in6_addr *d_addr)
+handle_udp(const struct udphdr *udp, int len)
 {
     char buf[PCAP_SNAPLEN];
     if ((ntohs (udp->UDP_DEST) != 53)
                    && (ntohs (udp->UDP_SRC) != 53))
        return 0;
     memcpy(buf, udp + 1, len - sizeof(*udp));
-    if (0 == handle_dns(buf, len - sizeof(*udp), s_addr, d_addr))
+    if (0 == handle_dns(buf, len - sizeof(*udp)))
        return 0;
     return 1;
 }
@@ -425,17 +428,18 @@ static int
 handle_ipv6 (struct ip6_hdr *ipv6, int len)
 {
     char buf[PCAP_SNAPLEN];
-    int offset;
+    unsigned int offset;
     int nexthdr;
 
     struct in6_addr s_addr;
-    struct in6_addr d_addr;
     uint16_t payload_len;
 
+    if (0 > len)
+       return (0);
+
     offset = sizeof (struct ip6_hdr);
     nexthdr = ipv6->ip6_nxt;
     s_addr = ipv6->ip6_src;
-    d_addr = ipv6->ip6_dst;
     payload_len = ntohs (ipv6->ip6_plen);
 
     if (ignore_list_match (&s_addr))
@@ -455,7 +459,7 @@ handle_ipv6 (struct ip6_hdr *ipv6, int len)
        uint16_t ext_hdr_len;
 
        /* Catch broken packets */
-       if ((offset + sizeof (struct ip6_ext)) > len)
+       if ((offset + sizeof (struct ip6_ext)) > (unsigned int)len)
            return (0);
 
        /* Cannot handle fragments. */
@@ -475,7 +479,7 @@ handle_ipv6 (struct ip6_hdr *ipv6, int len)
     } /* while */
 
     /* Catch broken and empty packets */
-    if (((offset + payload_len) > len)
+    if (((offset + payload_len) > (unsigned int)len)
            || (payload_len == 0)
            || (payload_len > PCAP_SNAPLEN))
        return (0);
@@ -484,7 +488,7 @@ handle_ipv6 (struct ip6_hdr *ipv6, int len)
        return (0);
 
     memcpy (buf, (char *) ipv6 + offset, payload_len);
-    if (handle_udp ((struct udphdr *) buf, payload_len, &s_addr, &d_addr) == 0)
+    if (handle_udp ((struct udphdr *) buf, payload_len) == 0)
        return (0);
 
     return (1); /* Success */
@@ -508,7 +512,7 @@ handle_ip(const struct ip *ip, int len)
     if (IPPROTO_UDP != ip->ip_p)
        return 0;
     memcpy(buf, (void *) ip + offset, len - offset);
-    if (0 == handle_udp((struct udphdr *) buf, len - offset, &s_addr, &d_addr))
+    if (0 == handle_udp((struct udphdr *) buf, len - offset))
        return 0;
     return 1;
 }
@@ -616,7 +620,7 @@ handle_linux_sll (const u_char *pkt, int len)
     } *hdr;
     uint16_t etype;
 
-    if (len < sizeof (struct sll_header))
+    if ((0 > len) || ((unsigned int)len < sizeof (struct sll_header)))
        return (0);
 
     hdr  = (struct sll_header *) pkt;
@@ -641,7 +645,7 @@ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt
 {
     int status;
 
-    fprintf (stderr, "handle_pcap (udata = %p, hdr = %p, pkt = %p): hdr->caplen = %i\n",
+    DEBUG ("handle_pcap (udata = %p, hdr = %p, pkt = %p): hdr->caplen = %i\n",
                    (void *) udata, (void *) hdr, (void *) pkt,
                    hdr->caplen);
 
@@ -678,7 +682,7 @@ void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt
            break;
 
        default:
-           fprintf (stderr, "unsupported data link type %d\n",
+           ERROR ("handle_pcap: unsupported data link type %d\n",
                    pcap_datalink(pcap_obj));
            status = 0;
            break;
@@ -697,6 +701,7 @@ const char *qtype_str(int t)
 {
     static char buf[32];
     switch (t) {
+#if (defined (__NAMESER)) && (__NAMESER >= 19991001)
            case ns_t_a:        return ("A");
            case ns_t_ns:       return ("NS");
            case ns_t_md:       return ("MD");
@@ -738,16 +743,76 @@ const char *qtype_str(int t)
            case ns_t_dname:    return ("DNAME");
            case ns_t_sink:     return ("SINK");
            case ns_t_opt:      return ("OPT");
+# if __NAMESER >= 19991006
            case ns_t_tsig:     return ("TSIG");
+# endif
            case ns_t_ixfr:     return ("IXFR");
            case ns_t_axfr:     return ("AXFR");
            case ns_t_mailb:    return ("MAILB");
            case ns_t_maila:    return ("MAILA");
            case ns_t_any:      return ("ANY");
            case ns_t_zxfr:     return ("ZXFR");
+/* #endif __NAMESER >= 19991006 */
+#elif (defined (__BIND)) && (__BIND >= 19950621)
+           case T_A:           return ("A"); /* 1 ... */
+           case T_NS:          return ("NS");
+           case T_MD:          return ("MD");
+           case T_MF:          return ("MF");
+           case T_CNAME:       return ("CNAME");
+           case T_SOA:         return ("SOA");
+           case T_MB:          return ("MB");
+           case T_MG:          return ("MG");
+           case T_MR:          return ("MR");
+           case T_NULL:        return ("NULL");
+           case T_WKS:         return ("WKS");
+           case T_PTR:         return ("PTR");
+           case T_HINFO:       return ("HINFO");
+           case T_MINFO:       return ("MINFO");
+           case T_MX:          return ("MX");
+           case T_TXT:         return ("TXT");
+           case T_RP:          return ("RP");
+           case T_AFSDB:       return ("AFSDB");
+           case T_X25:         return ("X25");
+           case T_ISDN:        return ("ISDN");
+           case T_RT:          return ("RT");
+           case T_NSAP:        return ("NSAP");
+           case T_NSAP_PTR:    return ("NSAP_PTR");
+           case T_SIG:         return ("SIG");
+           case T_KEY:         return ("KEY");
+           case T_PX:          return ("PX");
+           case T_GPOS:        return ("GPOS");
+           case T_AAAA:        return ("AAAA");
+           case T_LOC:         return ("LOC");
+           case T_NXT:         return ("NXT");
+           case T_EID:         return ("EID");
+           case T_NIMLOC:      return ("NIMLOC");
+           case T_SRV:         return ("SRV");
+           case T_ATMA:        return ("ATMA");
+           case T_NAPTR:       return ("NAPTR"); /* ... 35 */
+#if (__BIND >= 19960801)
+           case T_KX:          return ("KX"); /* 36 ... */
+           case T_CERT:        return ("CERT");
+           case T_A6:          return ("A6");
+           case T_DNAME:       return ("DNAME");
+           case T_SINK:        return ("SINK");
+           case T_OPT:         return ("OPT");
+           case T_APL:         return ("APL");
+           case T_DS:          return ("DS");
+           case T_SSHFP:       return ("SSHFP");
+           case T_RRSIG:       return ("RRSIG");
+           case T_NSEC:        return ("NSEC");
+           case T_DNSKEY:      return ("DNSKEY"); /* ... 48 */
+           case T_TKEY:        return ("TKEY"); /* 249 */
+#endif /* __BIND >= 19960801 */
+           case T_TSIG:        return ("TSIG"); /* 250 ... */
+           case T_IXFR:        return ("IXFR");
+           case T_AXFR:        return ("AXFR");
+           case T_MAILB:       return ("MAILB");
+           case T_MAILA:       return ("MAILA");
+           case T_ANY:         return ("ANY"); /* ... 255 */
+#endif /* __BIND >= 19950621 */
            default:
-                   snprintf (buf, 32, "#%i", t);
-                   buf[31] = '\0';
+                   ssnprintf (buf, sizeof (buf), "#%i", t);
                    return (buf);
     }; /* switch (t) */
     /* NOTREACHED */
@@ -774,7 +839,7 @@ const char *opcode_str (int o)
        return "Update";
        break;
     default:
-       snprintf(buf, 30, "Opcode%d", o);
+       ssnprintf(buf, sizeof (buf), "Opcode%d", o);
        return buf;
     }
     /* NOTREACHED */
@@ -785,6 +850,7 @@ const char *rcode_str (int rcode)
        static char buf[32];
        switch (rcode)
        {
+#if (defined (__NAMESER)) && (__NAMESER >= 19991006)
                case ns_r_noerror:  return ("NOERROR");
                case ns_r_formerr:  return ("FORMERR");
                case ns_r_servfail: return ("SERVFAIL");
@@ -800,9 +866,24 @@ const char *rcode_str (int rcode)
                case ns_r_badsig:   return ("BADSIG");
                case ns_r_badkey:   return ("BADKEY");
                case ns_r_badtime:  return ("BADTIME");
+/* #endif __NAMESER >= 19991006 */
+#elif (defined (__BIND)) && (__BIND >= 19950621)
+               case NOERROR:       return ("NOERROR");
+               case FORMERR:       return ("FORMERR");
+               case SERVFAIL:      return ("SERVFAIL");
+               case NXDOMAIN:      return ("NXDOMAIN");
+               case NOTIMP:        return ("NOTIMP");
+               case REFUSED:       return ("REFUSED");
+#if defined (YXDOMAIN) && defined (NXRRSET)
+               case YXDOMAIN:      return ("YXDOMAIN");
+               case YXRRSET:       return ("YXRRSET");
+               case NXRRSET:       return ("NXRRSET");
+               case NOTAUTH:       return ("NOTAUTH");
+               case NOTZONE:       return ("NOTZONE");
+#endif  /* RFC2136 rcodes */
+#endif /* __BIND >= 19950621 */
                default:
-                       snprintf (buf, 32, "RCode%i", rcode);
-                       buf[31] = '\0';
+                       ssnprintf (buf, sizeof (buf), "RCode%i", rcode);
                        return (buf);
        }
        /* Never reached */