#if KERNEL_LINUX
# include <asm/types.h>
-/* sys/socket.h is necessary to compile when using netlink on older systems. */
-# include <sys/socket.h>
# include <linux/netlink.h>
#if HAVE_LINUX_INET_DIAG_H
# include <linux/inet_diag.h>
#endif
-# include <sys/socket.h>
# include <arpa/inet.h>
/* #endif KERNEL_LINUX */
#if HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
-#if HAVE_SYS_SOCKET_H
-# include <sys/socket.h>
-#endif
#if HAVE_NET_IF_H
# include <net/if.h>
#endif
/* This is for OpenBSD and NetBSD. */
#elif HAVE_LIBKVM_NLIST
# include <sys/queue.h>
-# include <sys/socket.h>
# include <net/route.h>
# include <netinet/in.h>
# include <netinet/in_systm.h>
static uint32_t sequence_number = 0;
#endif
-enum
+static enum
{
SRC_DUNNO,
SRC_NETLINK,
if ((ret == NULL) && (create != 0))
{
- ret = (port_entry_t *) malloc (sizeof (port_entry_t));
+ ret = calloc (1, sizeof (*ret));
if (ret == NULL)
return (NULL);
- memset (ret, '\0', sizeof (port_entry_t));
ret->port = port;
ret->next = port_list_head;
/* If this entry was created while reading the files (ant not when handling
* the configuration) remove it now. */
if ((pe->flags & (PORT_COLLECT_LOCAL
- | PORT_COLLECT_REMOTE
- | PORT_IS_LISTENING)) == 0)
+ | PORT_COLLECT_REMOTE
+ | PORT_IS_LISTENING)) == 0)
{
port_entry_t *next = pe->next;
DEBUG ("tcpconns plugin: Removing temporary entry "
- "for listening port %"PRIu16, pe->port);
+ "for listening port %"PRIu16, pe->port);
if (prev == NULL)
- port_list_head = next;
+ port_list_head = next;
else
- prev->next = next;
+ prev->next = next;
sfree (pe);
pe = next;
memset (pe->count_remote, '\0', sizeof (pe->count_remote));
pe->flags &= ~PORT_IS_LISTENING;
+ prev = pe;
pe = pe->next;
}
} /* void conn_reset_port_entry */
{
#if HAVE_STRUCT_LINUX_INET_DIAG_REQ
int fd;
- struct sockaddr_nl nladdr;
- struct nlreq req;
- struct msghdr msg;
- struct iovec iov;
struct inet_diag_msg *r;
char buf[8192];
return (-1);
}
- memset(&nladdr, 0, sizeof(nladdr));
- nladdr.nl_family = AF_NETLINK;
-
- memset(&req, 0, sizeof(req));
- req.nlh.nlmsg_len = sizeof(req);
- req.nlh.nlmsg_type = TCPDIAG_GETSOCK;
- /* NLM_F_ROOT: return the complete table instead of a single entry.
- * NLM_F_MATCH: return all entries matching criteria (not implemented)
- * NLM_F_REQUEST: must be set on all request messages */
- req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
- req.nlh.nlmsg_pid = 0;
- /* The sequence_number is used to track our messages. Since netlink is not
- * reliable, we don't want to end up with a corrupt or incomplete old
- * message in case the system is/was out of memory. */
- req.nlh.nlmsg_seq = ++sequence_number;
- req.r.idiag_family = AF_INET;
- req.r.idiag_states = 0xfff;
- req.r.idiag_ext = 0;
-
- memset(&iov, 0, sizeof(iov));
- iov.iov_base = &req;
- iov.iov_len = sizeof(req);
-
- memset(&msg, 0, sizeof(msg));
- msg.msg_name = (void*)&nladdr;
- msg.msg_namelen = sizeof(nladdr);
- msg.msg_iov = &iov;
- msg.msg_iovlen = 1;
+ struct sockaddr_nl nladdr = {
+ .nl_family = AF_NETLINK
+ };
+
+ struct nlreq req = {
+ .nlh.nlmsg_len = sizeof(req),
+ .nlh.nlmsg_type = TCPDIAG_GETSOCK,
+ /* NLM_F_ROOT: return the complete table instead of a single entry.
+ * NLM_F_MATCH: return all entries matching criteria (not implemented)
+ * NLM_F_REQUEST: must be set on all request messages */
+ .nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST,
+ .nlh.nlmsg_pid = 0,
+ /* The sequence_number is used to track our messages. Since netlink is not
+ * reliable, we don't want to end up with a corrupt or incomplete old
+ * message in case the system is/was out of memory. */
+ .nlh.nlmsg_seq = ++sequence_number,
+ .r.idiag_family = AF_INET,
+ .r.idiag_states = 0xfff,
+ .r.idiag_ext = 0
+ };
+
+ struct iovec iov = {
+ .iov_base = &req,
+ .iov_len = sizeof(req)
+ };
+
+ struct msghdr msg = {
+ .msg_name = (void*)&nladdr,
+ .msg_namelen = sizeof(nladdr),
+ .msg_iov = &iov,
+ .msg_iovlen = 1
+ };
if (sendmsg (fd, &msg, 0) < 0)
{
return (-1);
}
- buffer = (char *) malloc (buffer_len);
+ buffer = malloc (buffer_len);
if (buffer == NULL)
{
ERROR ("tcpconns plugin: malloc failed.");
#endif
{
/* Read the pcb pointed to by `next' into `inpcb' */
- kread ((u_long) next, &inpcb, sizeof (inpcb));
+ status = kread ((u_long) next, &inpcb, sizeof (inpcb));
+ if (status != 0)
+ return (-1);
/* Advance `next' */
#if defined(__OpenBSD__) || (defined(__NetBSD_Version__) && __NetBSD_Version__ > 699002700)
continue;
#endif
- kread ((u_long) inpcb.inp_ppcb, &tcpcb, sizeof (tcpcb));
+ status = kread ((u_long) inpcb.inp_ppcb, &tcpcb, sizeof (tcpcb));
+ if (status != 0)
+ return (-1);
conn_handle_ports (ntohs(inpcb.inp_lport), ntohs(inpcb.inp_fport), tcpcb.t_state);
} /* while (next != head) */