diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /src/pmdas/linux/proc_net_sockstat.c | |
download | pcp-debian.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'src/pmdas/linux/proc_net_sockstat.c')
-rw-r--r-- | src/pmdas/linux/proc_net_sockstat.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/pmdas/linux/proc_net_sockstat.c b/src/pmdas/linux/proc_net_sockstat.c new file mode 100644 index 0000000..94f5a79 --- /dev/null +++ b/src/pmdas/linux/proc_net_sockstat.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2014 Red Hat. + * Copyright (c) 2000,2004 Silicon Graphics, Inc. All Rights Reserved. + * + * 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. + */ + +#include "pmapi.h" +#include "pmda.h" +#include "indom.h" +#include "proc_net_sockstat.h" + +int +refresh_proc_net_sockstat(proc_net_sockstat_t *proc_net_sockstat) +{ + char buf[1024]; + char fmt[64]; + FILE *fp; + + if ((fp = linux_statsfile("/proc/net/sockstat", buf, sizeof(buf))) == NULL) + return -oserror(); + + while (fgets(buf, sizeof(buf), fp) != NULL) { + if (strncmp(buf, "TCP:", 4) == 0) { + sscanf(buf, "%s %s %d %s %d", fmt, fmt, + &proc_net_sockstat->tcp[_PM_SOCKSTAT_INUSE], fmt, + &proc_net_sockstat->tcp[_PM_SOCKSTAT_HIGHEST]); + proc_net_sockstat->tcp[_PM_SOCKSTAT_UTIL] = + proc_net_sockstat->tcp[_PM_SOCKSTAT_HIGHEST] != 0 ? + 100 * proc_net_sockstat->tcp[_PM_SOCKSTAT_INUSE] / + proc_net_sockstat->tcp[_PM_SOCKSTAT_HIGHEST] : 0; + } + else + if (strncmp(buf, "UDP:", 4) == 0) { + sscanf(buf, "%s %s %d %s %d", fmt, fmt, + &proc_net_sockstat->udp[_PM_SOCKSTAT_INUSE], fmt, + &proc_net_sockstat->udp[_PM_SOCKSTAT_HIGHEST]); + proc_net_sockstat->udp[_PM_SOCKSTAT_UTIL] = + proc_net_sockstat->udp[_PM_SOCKSTAT_HIGHEST] != 0 ? + 100 * proc_net_sockstat->udp[_PM_SOCKSTAT_INUSE] / + proc_net_sockstat->udp[_PM_SOCKSTAT_HIGHEST] : 0; + } + else + if (strncmp(buf, "RAW:", 4) == 0) { + sscanf(buf, "%s %s %d %s %d", fmt, fmt, + &proc_net_sockstat->raw[_PM_SOCKSTAT_INUSE], fmt, + &proc_net_sockstat->raw[_PM_SOCKSTAT_HIGHEST]); + proc_net_sockstat->raw[_PM_SOCKSTAT_UTIL] = + proc_net_sockstat->raw[_PM_SOCKSTAT_HIGHEST] != 0 ? + 100 * proc_net_sockstat->raw[_PM_SOCKSTAT_INUSE] / + proc_net_sockstat->raw[_PM_SOCKSTAT_HIGHEST] : 0; + } + } + + fclose(fp); + return 0; +} |