X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Finterface.c;h=bc2121bd48cccc401118c5789bd918a4ba038437;hb=005a70ad7863229b8c60e8ca83b67e89dfb05ad0;hp=df8ffb46c34522ee5696b22a3409a687c37161e4;hpb=3307054b6ab46b51fdda4f528e72d119e9de3071;p=collectd.git diff --git a/src/interface.c b/src/interface.c index df8ffb46..bc2121bd 100644 --- a/src/interface.c +++ b/src/interface.c @@ -31,9 +31,6 @@ #if HAVE_SYS_TYPES_H # include #endif -#if HAVE_SYS_SOCKET_H -# include -#endif /* One cannot include both. This sucks. */ #if HAVE_LINUX_IF_H @@ -98,6 +95,7 @@ static ignorelist_t *ignorelist = NULL; extern kstat_ctl_t *kc; static kstat_t *ksp[MAX_NUMIF]; static int numif = 0; +static _Bool unique_name = 0; #endif /* HAVE_LIBKSTAT */ static int interface_config (const char *key, const char *value) @@ -116,6 +114,15 @@ static int interface_config (const char *key, const char *value) invert = 0; ignorelist_set_invert (ignorelist, invert); } + else if (strcasecmp (key, "UniqueName") == 0) + { + #ifdef HAVE_LIBKSTAT + if (IS_TRUE (value)) + unique_name = 1; + #else + WARNING ("interface plugin: the \"UniqueName\" option is only valid on Solaris."); + #endif /* HAVE_LIBKSTAT */ + } else { return (-1); @@ -128,7 +135,6 @@ static int interface_config (const char *key, const char *value) static int interface_init (void) { kstat_t *ksp_chain; - derive_t val; numif = 0; @@ -145,7 +151,7 @@ static int interface_init (void) continue; if (kstat_read (kc, ksp_chain, NULL) == -1) continue; - if ((val = get_kstat_value (ksp_chain, "obytes")) == -1LL) + if (get_kstat_value (ksp_chain, "obytes") == -1LL) continue; ksp[numif++] = ksp_chain; } @@ -183,7 +189,7 @@ static int interface_read (void) struct ifaddrs *if_list; struct ifaddrs *if_ptr; -/* Darin/Mac OS X and possible other *BSDs */ +/* Darwin/Mac OS X and possible other *BSDs */ #if HAVE_STRUCT_IF_DATA # define IFA_DATA if_data # define IFA_RX_BYTES ifi_ibytes @@ -279,6 +285,10 @@ static int interface_read (void) incoming = atoll (fields[2]); outgoing = atoll (fields[10]); if_submit (device, "if_errors", incoming, outgoing); + + incoming = atoll (fields[3]); + outgoing = atoll (fields[11]); + if_submit (device, "if_dropped", incoming, outgoing); } fclose (fh); @@ -288,6 +298,7 @@ static int interface_read (void) int i; derive_t rx; derive_t tx; + char iname[DATA_MAX_NAME_LEN]; if (kc == NULL) return (-1); @@ -297,6 +308,11 @@ static int interface_read (void) if (kstat_read (kc, ksp[i], NULL) == -1) continue; + if (unique_name) + ssnprintf(iname, sizeof(iname), "%s_%d_%s", ksp[i]->ks_module, ksp[i]->ks_instance, ksp[i]->ks_name); + else + sstrncpy(iname, ksp[i]->ks_name, sizeof(iname)); + /* try to get 64bit counters */ rx = get_kstat_value (ksp[i], "rbytes64"); tx = get_kstat_value (ksp[i], "obytes64"); @@ -306,7 +322,7 @@ static int interface_read (void) if (tx == -1LL) tx = get_kstat_value (ksp[i], "obytes"); if ((rx != -1LL) || (tx != -1LL)) - if_submit (ksp[i]->ks_name, "if_octets", rx, tx); + if_submit (iname, "if_octets", rx, tx); /* try to get 64bit counters */ rx = get_kstat_value (ksp[i], "ipackets64"); @@ -317,13 +333,13 @@ static int interface_read (void) if (tx == -1LL) tx = get_kstat_value (ksp[i], "opackets"); if ((rx != -1LL) || (tx != -1LL)) - if_submit (ksp[i]->ks_name, "if_packets", rx, tx); + if_submit (iname, "if_packets", rx, tx); /* no 64bit error counters yet */ rx = get_kstat_value (ksp[i], "ierrors"); tx = get_kstat_value (ksp[i], "oerrors"); if ((rx != -1LL) || (tx != -1LL)) - if_submit (ksp[i]->ks_name, "if_errors", rx, tx); + if_submit (iname, "if_errors", rx, tx); } /* #endif HAVE_LIBKSTAT */ @@ -351,9 +367,8 @@ static int interface_read (void) if (pnif != nif || ifstat == NULL) { - if (ifstat != NULL) - free(ifstat); - ifstat = malloc(nif * sizeof(perfstat_netinterface_t)); + free(ifstat); + ifstat = malloc(nif * sizeof (*ifstat)); } pnif = nif;