*/
#include "collectd.h"
+#include "plugin.h"
+#include "common.h"
#if HAVE_NETINET_IN_SYSTM_H
# include <netinet/in_systm.h>
#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
#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
}
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;
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;
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);
}
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;
}
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;
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. */
} /* 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);
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 */
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;
}
} *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;
{
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);
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;
{
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");
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 */
return "Update";
break;
default:
- snprintf(buf, 30, "Opcode%d", o);
+ ssnprintf(buf, sizeof (buf), "Opcode%d", o);
return buf;
}
/* NOTREACHED */
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");
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 */