diff options
author | James Dominic P. Guana <guana.histark@gmail.com> | 2021-04-10 18:19:15 +0800 |
---|---|---|
committer | Robert Roth <robert.roth.off@gmail.com> | 2021-04-23 09:48:11 +0000 |
commit | a067db056927db232a2eb8cf79d4af096962eced (patch) | |
tree | 6030559a5da1d14a3eb6c25fb47fe00176aa908c /sysdeps/linux | |
parent | 68b52696076f270e590b8627a2d2f77660f6c436 (diff) | |
download | libgtop-a067db056927db232a2eb8cf79d4af096962eced.tar.gz |
Revert "Revert "New API to retrieve disk stats in Linux""
This reverts commit 7e214414bf23d1ea34e7fdccb17a7f41040ffea9.
Diffstat (limited to 'sysdeps/linux')
-rw-r--r-- | sysdeps/linux/Makefile.am | 2 | ||||
-rw-r--r-- | sysdeps/linux/disk.c | 96 | ||||
-rw-r--r-- | sysdeps/linux/glibtop_private.c | 18 | ||||
-rw-r--r-- | sysdeps/linux/glibtop_private.h | 3 | ||||
-rw-r--r-- | sysdeps/linux/glibtop_server.h | 1 |
5 files changed, 119 insertions, 1 deletions
diff --git a/sysdeps/linux/Makefile.am b/sysdeps/linux/Makefile.am index fdd54696..c51bb155 100644 --- a/sysdeps/linux/Makefile.am +++ b/sysdeps/linux/Makefile.am @@ -4,7 +4,7 @@ noinst_LTLIBRARIES = libgtop_sysdeps-2.0.la libgtop_sysdeps_suid-2.0.la EXTRA_DIST = procmap_smaps.gperf procmap_smaps.c -libgtop_sysdeps_2_0_la_SOURCES = open.c close.c cpu.c mem.c swap.c \ +libgtop_sysdeps_2_0_la_SOURCES = open.c close.c cpu.c disk.c mem.c swap.c \ uptime.c loadavg.c shm_limits.c msg_limits.c \ sem_limits.c proclist.c procstate.c procuid.c \ proctime.c procmem.c procsignal.c prockernel.c \ diff --git a/sysdeps/linux/disk.c b/sysdeps/linux/disk.c new file mode 100644 index 00000000..159f8f12 --- /dev/null +++ b/sysdeps/linux/disk.c @@ -0,0 +1,96 @@ +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by James Dominic P. Guana <guana.histark@gmail.com>, May 2020. + + LibGTop 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. + + LibGTop 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 LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <config.h> +#include <glibtop/error.h> +#include <glibtop/disk.h> + +#include "glibtop_private.h" + +static const unsigned long _glibtop_sysdeps_disk = +(1L << GLIBTOP_XDISK_SECTORS_READ) + (1L << GLIBTOP_XDISK_TIME_READ) + +(1L << GLIBTOP_XDISK_SECTORS_WRITE) + (1L << GLIBTOP_XDISK_TIME_WRITE); + +/* Init function. */ + +void +_glibtop_init_disk_s (glibtop *server) +{ + server->sysdeps.disk = _glibtop_sysdeps_disk; +} + +/* Provides information about disk usage. */ + +#define FILENAME "/proc/diskstats" //kernel reports sectors by 512 bytes even for AF 4kn +#define STAT_BUFSIZ 81920 + +void +glibtop_get_disk_s (glibtop *server, glibtop_disk *buf) +{ + char buffer [STAT_BUFSIZ], *p; + int i; + + memset (buf, 0, sizeof (glibtop_disk)); + + file_to_buffer(server, buffer, sizeof buffer, FILENAME); + + /* + * GLOBAL + */ + + p = buffer; /* "disk" */ + + /* + * PER DISK + */ + + for (i = 0; i <= server->ndisk; i++) { + + p = skip_multiple_token(p,2); + + // skip if disk is the raw device + if(!check_alphanumeric_word(p)){ + + p = skip_line(p); /* move to ^ */ + p = skip_multiple_token(p,2); + + } + + if (!check_disk_line_warn(server, p, i)) + break; + + p = skip_token(p); /* prev xdisk_name */ + p = skip_token(p); /* prev xdisk_reads_completed */ + p = skip_token(p); /* prev xdisk_reads_merged */ + + buf->xdisk_sectors_read [i] = strtoull (p, &p, 0); + buf->xdisk_time_read [i] = strtoull (p, &p, 0); + + p = skip_token(p); /* prev xdisk_writes_completed */ + p = skip_token(p); /* prev xdisk_writes_merged */ + + buf->xdisk_sectors_write [i] = strtoull (p, &p, 0); + buf->xdisk_time_write [i] = strtoull (p, &p, 0); + + p = skip_line(p); /* move to ^ */ + + } +} diff --git a/sysdeps/linux/glibtop_private.c b/sysdeps/linux/glibtop_private.c index d3a49aa6..7b36561c 100644 --- a/sysdeps/linux/glibtop_private.c +++ b/sysdeps/linux/glibtop_private.c @@ -57,6 +57,24 @@ skip_token (const char *p) } +int +check_alphanumeric_word (const char *p) +{ + int test = 0; + p = next_token(p); + while (*p && !g_ascii_isspace(*p)) { + if(g_ascii_isalpha(*p)){ + test = 0; + }else if(g_ascii_isdigit(*p)){ + test = 1; + } + p++; + }; + p = next_token(p); + return test; +} + + /* * Read functions */ diff --git a/sysdeps/linux/glibtop_private.h b/sysdeps/linux/glibtop_private.h index 03761f4f..d42ee669 100644 --- a/sysdeps/linux/glibtop_private.h +++ b/sysdeps/linux/glibtop_private.h @@ -61,6 +61,9 @@ skip_line (const char *p) return (char *) (*p ? p+1 : p); } +int +check_alphanumeric_word (const char *p); + /* * Smart strtoul which handles binary suffixes * e.g: get_scaled("Size: 32 kB", "Size:") == 32768 diff --git a/sysdeps/linux/glibtop_server.h b/sysdeps/linux/glibtop_server.h index 6240d5de..43dd9d9f 100644 --- a/sysdeps/linux/glibtop_server.h +++ b/sysdeps/linux/glibtop_server.h @@ -23,6 +23,7 @@ #define __LINUX__GLIBTOP_SERVER_H__ #define GLIBTOP_SUID_CPU 0 +#define GLIBTOP_SUID_DISK 0 #define GLIBTOP_SUID_MEM 0 #define GLIBTOP_SUID_SWAP 0 #define GLIBTOP_SUID_UPTIME 0 |