X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Ftcpconns.c;h=f164b53b4858406a27e8cd49040a88cc02f61e20;hb=b8f83ce0a28e0d8033c0f3bdc95aeb44a2d17381;hp=d53cb5aa51c452c1a92089b042718283f0075cd6;hpb=5db1547c947a42577709f74fe3324bf2d00ea87c;p=collectd.git diff --git a/src/tcpconns.c b/src/tcpconns.c index d53cb5aa..f164b53b 100644 --- a/src/tcpconns.c +++ b/src/tcpconns.c @@ -1,6 +1,7 @@ /** * collectd - src/tcpconns.c - * Copyright (C) 2007 Florian octo Forster + * Copyright (C) 2007,2008 Florian octo Forster + * Copyright (C) 2008 Michael Stapelberg * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -17,10 +18,12 @@ * * Author: * Florian octo Forster + * Michael Stapelberg **/ /** - * Code within `__OpenBSD__' blocks is provided under the following license: + * Code within `HAVE_LIBKVM_NLIST' blocks is provided under the following + * license: * * $collectd: parts of tcpconns.c, 2008/08/08 03:48:30 Michael Stapelberg $ * $OpenBSD: inet.c,v 1.100 2007/06/19 05:28:30 ray Exp $ @@ -58,7 +61,11 @@ #include "common.h" #include "plugin.h" -#if !KERNEL_LINUX && !HAVE_SYSCTLBYNAME && !__OpenBSD__ +#if defined(__OpenBSD__) || defined(__NetBSD__) +#undef HAVE_SYSCTLBYNAME /* force HAVE_LIBKVM_NLIST path */ +#endif + +#if !KERNEL_LINUX && !HAVE_SYSCTLBYNAME && !HAVE_LIBKVM_NLIST # error "No applicable input method." #endif @@ -94,13 +101,15 @@ # include /* #endif HAVE_SYSCTLBYNAME */ -#elif __OpenBSD__ +/* This is for OpenBSD and NetBSD. */ +#elif HAVE_LIBKVM_NLIST # include # include # include # include # include # include +# include # include # include # include @@ -109,7 +118,7 @@ # include # include # include -#endif /* __OpenBSD__ */ +#endif /* HAVE_LIBKVM_NLIST */ #if KERNEL_LINUX static const char *tcp_state[] = @@ -154,7 +163,7 @@ static const char *tcp_state[] = # define TCP_STATE_MAX 10 /* #endif HAVE_SYSCTLBYNAME */ -#elif __OpenBSD__ +#elif HAVE_LIBKVM_NLIST static const char *tcp_state[] = { "CLOSED", @@ -177,7 +186,7 @@ struct inpcbtable *inpcbtable_ptr = NULL; # define TCP_STATE_LISTEN 1 # define TCP_STATE_MIN 1 # define TCP_STATE_MAX 10 -#endif /* __OpenBSD__ */ +#endif /* HAVE_LIBKVM_NLIST */ #define PORT_COLLECT_LOCAL 0x01 #define PORT_COLLECT_REMOTE 0x02 @@ -211,7 +220,6 @@ static void conn_submit_port_entry (port_entry_t *pe) vl.values = values; vl.values_len = 1; - vl.time = time (NULL); sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "tcpconns", sizeof (vl.plugin)); sstrncpy (vl.type, "tcp_connections", sizeof (vl.type)); @@ -439,8 +447,8 @@ static int conn_read_file (const char *file) #elif HAVE_SYSCTLBYNAME /* #endif HAVE_SYSCTLBYNAME */ -#elif __OpenBSD__ -#endif /* __OpenBSD__ */ +#elif HAVE_LIBKVM_NLIST +#endif /* HAVE_LIBKVM_NLIST */ static int conn_config (const char *key, const char *value) { @@ -583,7 +591,8 @@ static int conn_read (void) && ((inp->inp_vflag & INP_IPV6) == 0)) continue; - conn_handle_ports (inp->inp_lport, inp->inp_fport, tp->t_state); + conn_handle_ports (ntohs (inp->inp_lport), ntohs (inp->inp_fport), + tp->t_state); } /* for (in_ptr) */ in_orig = NULL; @@ -596,7 +605,7 @@ static int conn_read (void) } /* int conn_read */ /* #endif HAVE_SYSCTLBYNAME */ -#elif __OpenBSD__ +#elif HAVE_LIBKVM_NLIST static int kread (u_long addr, void *buf, int size) { int status; @@ -668,7 +677,7 @@ static int conn_read (void) /* Get the `head' pcb */ head = (struct inpcb *) &(inpcbtable_ptr->inpt_queue); /* Get the first pcb */ - next = CIRCLEQ_FIRST (&table.inpt_queue); + next = (struct inpcb *)CIRCLEQ_FIRST (&table.inpt_queue); while (next != head) { @@ -676,15 +685,20 @@ static int conn_read (void) kread ((u_long) next, &inpcb, sizeof (inpcb)); /* Advance `next' */ - next = CIRCLEQ_NEXT (&inpcb, inp_queue); + next = (struct inpcb *)CIRCLEQ_NEXT (&inpcb, inp_queue); /* Ignore sockets, that are not connected. */ +#ifdef __NetBSD__ + if (inpcb.inp_af == AF_INET6) + continue; /* XXX see netbsd/src/usr.bin/netstat/inet6.c */ +#else if (!(inpcb.inp_flags & INP_IPV6) && (inet_lnaof(inpcb.inp_laddr) == INADDR_ANY)) continue; if ((inpcb.inp_flags & INP_IPV6) && IN6_IS_ADDR_UNSPECIFIED (&inpcb.inp_laddr6)) continue; +#endif kread ((u_long) inpcb.inp_ppcb, &tcpcb, sizeof (tcpcb)); conn_handle_ports (ntohs(inpcb.inp_lport), ntohs(inpcb.inp_fport), tcpcb.t_state); @@ -694,7 +708,7 @@ static int conn_read (void) return (0); } -#endif /* __OpenBSD__ */ +#endif /* HAVE_LIBKVM_NLIST */ void module_register (void) { @@ -704,7 +718,7 @@ void module_register (void) plugin_register_init ("tcpconns", conn_init); #elif HAVE_SYSCTLBYNAME /* no initialization */ -#elif __OpenBSD__ +#elif HAVE_LIBKVM_NLIST plugin_register_init ("tcpconns", conn_init); #endif plugin_register_read ("tcpconns", conn_read);