Source
/*
** Zabbix
** 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 General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** 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 General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
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)
{