Source
/*
** Copyright (C) 2001-2025 Zabbix SIA
**
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
**
** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Affero General Public License for more details.
**
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
**/
static int get_kstat_named_field(const char *name, const char *field, zbx_uint64_t *field_value, char **error)
{
int ret = FAIL, min_instance = -1;
kstat_ctl_t *kc;
kstat_t *kp, *min_kp;
kstat_named_t *kn;
if (NULL == (kc = kstat_open()))
{
*error = zbx_dsprintf(NULL, "Cannot open kernel statistics facility: %s", zbx_strerror(errno));
return FAIL;
}
for (kp = kc->kc_chain; NULL != kp; kp = kp->ks_next) /* traverse all kstat chain */
{
if (0 != strcmp(name, kp->ks_name)) /* network interface name */
continue;
if (0 != strcmp("net", kp->ks_class))
continue;
/* find instance with the smallest number */
if (-1 == min_instance || kp->ks_instance < min_instance)
{
min_instance = kp->ks_instance;
min_kp = kp;
}
if (0 == min_instance)
break;
}
if (-1 != min_instance)
kp = min_kp;
if (NULL == kp)
{
*error = zbx_dsprintf(NULL, "Cannot look up interface \"%s\" in kernel statistics facility", name);
goto clean;
}