X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Ftcpconns.c;h=9fdd16e9c1b30b7d336c18e0b3620c8a587340e4;hp=08838fbe672a3dda69aa62a08400cb60e9bbb2e3;hb=da11ce02eb202b3e01d3e2d1b40f248a84430973;hpb=3e0dd5070e385b864c771902bfa4c6331c5710b4 diff --git a/src/tcpconns.c b/src/tcpconns.c index 08838fbe..9fdd16e9 100644 --- a/src/tcpconns.c +++ b/src/tcpconns.c @@ -70,7 +70,8 @@ #undef HAVE_SYSCTLBYNAME /* force HAVE_LIBKVM_NLIST path */ #endif -#if !KERNEL_LINUX && !HAVE_SYSCTLBYNAME && !HAVE_KVM_GETFILES && !HAVE_LIBKVM_NLIST && !KERNEL_AIX +#if !KERNEL_LINUX && !HAVE_SYSCTLBYNAME && !HAVE_KVM_GETFILES && \ + !HAVE_LIBKVM_NLIST && !KERNEL_AIX #error "No applicable input method." #endif @@ -110,8 +111,8 @@ /* #endif HAVE_SYSCTLBYNAME */ #elif HAVE_KVM_GETFILES -#include #include +#include #define _KERNEL /* for DTYPE_SOCKET */ #include #undef _KERNEL @@ -127,9 +128,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -292,8 +293,8 @@ static void conn_submit_port_entry(port_entry_t *pe) { if (((port_collect_listening != 0) && (pe->flags & PORT_IS_LISTENING)) || (pe->flags & PORT_COLLECT_LOCAL)) { - ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance), - "%" PRIu16 "-local", pe->port); + snprintf(vl.plugin_instance, sizeof(vl.plugin_instance), + "%" PRIu16 "-local", pe->port); for (int i = 1; i <= TCP_STATE_MAX; i++) { vl.values[0].gauge = pe->count_local[i]; @@ -305,8 +306,8 @@ static void conn_submit_port_entry(port_entry_t *pe) { } if (pe->flags & PORT_COLLECT_REMOTE) { - ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance), - "%" PRIu16 "-remote", pe->port); + snprintf(vl.plugin_instance, sizeof(vl.plugin_instance), + "%" PRIu16 "-remote", pe->port); for (int i = 1; i <= TCP_STATE_MAX; i++) { vl.values[0].gauge = pe->count_remote[i]; @@ -356,14 +357,14 @@ static port_entry_t *conn_get_port_entry(uint16_t port, int create) { if ((ret == NULL) && (create != 0)) { ret = calloc(1, sizeof(*ret)); if (ret == NULL) - return (NULL); + return NULL; ret->port = port; ret->next = port_list_head; port_list_head = ret; } - return (ret); + return ret; } /* port_entry_t *conn_get_port_entry */ /* Removes ports that were added automatically due to the `ListeningPorts' @@ -417,7 +418,7 @@ static int conn_handle_ports(uint16_t port_local, uint16_t port_remote, NOTICE("tcpconns plugin: Ignoring connection with " "unknown state 0x%02" PRIx8 ".", state); - return (-1); + return -1; } count_total[state]++; @@ -440,7 +441,7 @@ static int conn_handle_ports(uint16_t port_local, uint16_t port_remote, if (pe != NULL) pe->count_remote[state]++; - return (0); + return 0; } /* int conn_handle_ports */ #if KERNEL_LINUX @@ -459,7 +460,7 @@ static int conn_read_netlink(void) { ERROR("tcpconns plugin: conn_read_netlink: socket(AF_NETLINK, SOCK_RAW, " "NETLINK_INET_DIAG) failed: %s", sstrerror(errno, buf, sizeof(buf))); - return (-1); + return -1; } struct sockaddr_nl nladdr = {.nl_family = AF_NETLINK}; @@ -491,7 +492,7 @@ static int conn_read_netlink(void) { ERROR("tcpconns plugin: conn_read_netlink: sendmsg(2) failed: %s", sstrerror(errno, buf, sizeof(buf))); close(fd); - return (-1); + return -1; } iov.iov_base = buf; @@ -515,12 +516,12 @@ static int conn_read_netlink(void) { ERROR("tcpconns plugin: conn_read_netlink: recvmsg(2) failed: %s", sstrerror(errno, buf, sizeof(buf))); close(fd); - return (-1); + return -1; } else if (status == 0) { close(fd); DEBUG("tcpconns plugin: conn_read_netlink: Unexpected zero-sized " "reply from netlink socket."); - return (0); + return 0; } h = (struct nlmsghdr *)buf; @@ -532,7 +533,7 @@ static int conn_read_netlink(void) { if (h->nlmsg_type == NLMSG_DONE) { close(fd); - return (0); + return 0; } else if (h->nlmsg_type == NLMSG_ERROR) { struct nlmsgerr *msg_error; @@ -541,7 +542,7 @@ static int conn_read_netlink(void) { msg_error->error); close(fd); - return (1); + return 1; } r = NLMSG_DATA(h); @@ -555,9 +556,9 @@ static int conn_read_netlink(void) { } /* while (1) */ /* Not reached because the while() loop above handles the exit condition. */ - return (0); + return 0; #else - return (1); + return 1; #endif /* HAVE_STRUCT_LINUX_INET_DIAG_REQ */ } /* int conn_read_netlink */ @@ -579,40 +580,40 @@ static int conn_handle_line(char *buffer) { while ((buffer_len > 0) && (buffer[buffer_len - 1] < 32)) buffer[--buffer_len] = '\0'; if (buffer_len <= 0) - return (-1); + return -1; fields_len = strsplit(buffer, fields, STATIC_ARRAY_SIZE(fields)); if (fields_len < 12) { DEBUG("tcpconns plugin: Got %i fields, expected at least 12.", fields_len); - return (-1); + return -1; } port_local_str = strchr(fields[1], ':'); port_remote_str = strchr(fields[2], ':'); if ((port_local_str == NULL) || (port_remote_str == NULL)) - return (-1); + return -1; port_local_str++; port_remote_str++; if ((*port_local_str == '\0') || (*port_remote_str == '\0')) - return (-1); + return -1; endptr = NULL; port_local = (uint16_t)strtol(port_local_str, &endptr, 16); if ((endptr == NULL) || (*endptr != '\0')) - return (-1); + return -1; endptr = NULL; port_remote = (uint16_t)strtol(port_remote_str, &endptr, 16); if ((endptr == NULL) || (*endptr != '\0')) - return (-1); + return -1; endptr = NULL; state = (uint8_t)strtol(fields[3], &endptr, 16); if ((endptr == NULL) || (*endptr != '\0')) - return (-1); + return -1; - return (conn_handle_ports(port_local, port_remote, state)); + return conn_handle_ports(port_local, port_remote, state); } /* int conn_handle_line */ static int conn_read_file(const char *file) { @@ -621,7 +622,7 @@ static int conn_read_file(const char *file) { fh = fopen(file, "r"); if (fh == NULL) - return (-1); + return -1; while (fgets(buffer, sizeof(buffer), fh) != NULL) { conn_handle_line(buffer); @@ -629,7 +630,7 @@ static int conn_read_file(const char *file) { fclose(fh); - return (0); + return 0; } /* int conn_read_file */ /* #endif KERNEL_LINUX */ @@ -652,13 +653,13 @@ static int conn_config(const char *key, const char *value) { if ((port < 1) || (port > 65535)) { ERROR("tcpconns plugin: Invalid port: %i", port); - return (1); + return 1; } pe = conn_get_port_entry((uint16_t)port, 1 /* create */); if (pe == NULL) { ERROR("tcpconns plugin: conn_get_port_entry failed."); - return (1); + return 1; } if (strcasecmp(key, "LocalPort") == 0) @@ -671,10 +672,10 @@ static int conn_config(const char *key, const char *value) { else port_collect_total = 0; } else { - return (-1); + return -1; } - return (0); + return 0; } /* int conn_config */ #if KERNEL_LINUX @@ -682,7 +683,7 @@ static int conn_init(void) { if (port_collect_total == 0 && port_list_head == NULL) port_collect_listening = 1; - return (0); + return 0; } /* int conn_init */ static int conn_read(void) { @@ -719,16 +720,16 @@ static int conn_read(void) { linux_source = SRC_PROC; /* return success here to avoid the "plugin failed" message. */ - return (0); + return 0; } } if (status == 0) conn_submit_all(); else - return (status); + return status; - return (0); + return 0; } /* int conn_read */ /* #endif KERNEL_LINUX */ @@ -748,35 +749,41 @@ static int conn_read(void) { status = sysctlbyname("net.inet.tcp.pcblist", NULL, &buffer_len, 0, 0); if (status < 0) { ERROR("tcpconns plugin: sysctlbyname failed."); - return (-1); + return -1; } buffer = malloc(buffer_len); if (buffer == NULL) { ERROR("tcpconns plugin: malloc failed."); - return (-1); + return -1; } status = sysctlbyname("net.inet.tcp.pcblist", buffer, &buffer_len, 0, 0); if (status < 0) { ERROR("tcpconns plugin: sysctlbyname failed."); sfree(buffer); - return (-1); + return -1; } if (buffer_len <= sizeof(struct xinpgen)) { ERROR("tcpconns plugin: (buffer_len <= sizeof (struct xinpgen))"); sfree(buffer); - return (-1); + return -1; } in_orig = (struct xinpgen *)buffer; for (in_ptr = (struct xinpgen *)(((char *)in_orig) + in_orig->xig_len); in_ptr->xig_len > sizeof(struct xinpgen); in_ptr = (struct xinpgen *)(((char *)in_ptr) + in_ptr->xig_len)) { +#if __FreeBSD_version >= 1200026 + struct xtcpcb *tp = (struct xtcpcb *)in_ptr; + struct xinpcb *inp = &tp->xt_inp; + struct xsocket *so = &inp->xi_socket; +#else struct tcpcb *tp = &((struct xtcpcb *)in_ptr)->xt_tp; struct inpcb *inp = &((struct xtcpcb *)in_ptr)->xt_inp; struct xsocket *so = &((struct xtcpcb *)in_ptr)->xt_socket; +#endif /* Ignore non-TCP sockets */ if (so->xso_protocol != IPPROTO_TCP) @@ -800,7 +807,7 @@ static int conn_read(void) { conn_submit_all(); - return (0); + return 0; } /* int conn_read */ /* #endif HAVE_SYSCTLBYNAME */ @@ -812,10 +819,10 @@ static int conn_init(void) { kvmd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, buf); if (kvmd == NULL) { ERROR("tcpconns plugin: kvm_openfiles failed: %s", buf); - return (-1); + return -1; } - return (0); + return 0; } /* int conn_init */ static int conn_read(void) { @@ -824,11 +831,10 @@ static int conn_read(void) { conn_reset_port_entry(); - kf = kvm_getfiles(kvmd, KERN_FILE_BYFILE, DTYPE_SOCKET, - sizeof(*kf), &fcnt); + kf = kvm_getfiles(kvmd, KERN_FILE_BYFILE, DTYPE_SOCKET, sizeof(*kf), &fcnt); if (kf == NULL) { ERROR("tcpconns plugin: kvm_getfiles failed."); - return (-1); + return -1; } for (i = 0; i < fcnt; i++) { @@ -842,7 +848,7 @@ static int conn_read(void) { conn_submit_all(); - return (0); + return 0; } /* int conn_read */ /* #endif HAVE_KVM_GETFILES */ @@ -855,9 +861,9 @@ static int kread(u_long addr, void *buf, int size) { if (status != size) { ERROR("tcpconns plugin: kvm_read failed (got %i, expected %i): %s\n", status, size, kvm_geterr(kvmd)); - return (-1); + return -1; } - return (0); + return 0; } /* int kread */ static int conn_init(void) { @@ -870,25 +876,25 @@ static int conn_init(void) { kvmd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, buf); if (kvmd == NULL) { ERROR("tcpconns plugin: kvm_openfiles failed: %s", buf); - return (-1); + return -1; } status = kvm_nlist(kvmd, nl); if (status < 0) { ERROR("tcpconns plugin: kvm_nlist failed with status %i.", status); - return (-1); + return -1; } if (nl[N_TCBTABLE].n_type == 0) { ERROR("tcpconns plugin: Error looking up kernel's namelist: " "N_TCBTABLE is invalid."); - return (-1); + return -1; } inpcbtable_off = (u_long)nl[N_TCBTABLE].n_value; inpcbtable_ptr = (struct inpcbtable *)nl[N_TCBTABLE].n_value; - return (0); + return 0; } /* int conn_init */ static int conn_read(void) { @@ -907,7 +913,7 @@ static int conn_read(void) { /* Read the pcbtable from the kernel */ status = kread(inpcbtable_off, &table, sizeof(table)); if (status != 0) - return (-1); + return -1; #if defined(__OpenBSD__) || \ (defined(__NetBSD_Version__) && __NetBSD_Version__ > 699002700) @@ -927,7 +933,7 @@ static int conn_read(void) { /* Read the pcb pointed to by `next' into `inpcb' */ status = kread((u_long)next, &inpcb, sizeof(inpcb)); if (status != 0) - return (-1); + return -1; /* Advance `next' */ #if defined(__OpenBSD__) || \ @@ -953,14 +959,14 @@ static int conn_read(void) { status = kread((u_long)inpcb.inp_ppcb, &tcpcb, sizeof(tcpcb)); if (status != 0) - return (-1); + return -1; conn_handle_ports(ntohs(inpcb.inp_lport), ntohs(inpcb.inp_fport), tcpcb.t_state); } /* while (next != head) */ conn_submit_all(); - return (0); + return 0; } /* #endif HAVE_LIBKVM_NLIST */ @@ -978,27 +984,27 @@ static int conn_read(void) { size = netinfo(NETINFO_TCP, 0, 0, 0); if (size < 0) { ERROR("tcpconns plugin: netinfo failed return: %i", size); - return (-1); + return -1; } if (size == 0) - return (0); + return 0; if ((size - sizeof(struct netinfo_header)) % sizeof(struct netinfo_conn)) { ERROR("tcpconns plugin: invalid buffer size"); - return (-1); + return -1; } data = malloc(size); if (data == NULL) { ERROR("tcpconns plugin: malloc failed"); - return (-1); + return -1; } if (netinfo(NETINFO_TCP, data, &size, 0) < 0) { ERROR("tcpconns plugin: netinfo failed"); free(data); - return (-1); + return -1; } header = (struct netinfo_header *)data; @@ -1013,7 +1019,7 @@ static int conn_read(void) { conn_submit_all(); - return (0); + return 0; } #endif /* KERNEL_AIX */