2
KSysGuard, the KDE System Guard
4
Copyright (c) 2001 Tobias Koenig <tokoe@kde.org>
6
This program is free software; you can redistribute it and/or
7
modify it under the terms of version 2 of the GNU General Public
8
License as published by the Free Software Foundation.
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
15
You should have received a copy of the GNU General Public License
16
along with this program; if not, write to the Free Software
17
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21
#include <config-workspace.h>
26
#include <sys/param.h>
28
#include <sys/ucred.h>
29
#include <sys/mount.h>
36
#include "ksysguardd.h"
47
static CONTAINER DiskStatList = 0;
48
static struct SensorModul* DiskStatSM;
50
char *getMntPnt(const char *cmd)
52
static char device[1025];
55
memset(device, 0, sizeof(device));
56
sscanf(cmd, "partitions%1024s", device);
58
ptr = (char *)rindex(device, '/');
61
return (char *)device;
66
struct statvfs *fs_info;
67
int i, n, counter = 0;
69
n = getmntinfo(&fs_info, MNT_WAIT);
70
for (i = 0; i < n; i++)
71
if (strcmp(fs_info[i].f_fstypename, "procfs") && strcmp(fs_info[i].f_fstypename, "swap") && strcmp(fs_info[i].f_fstypename, "devfs"))
77
/* ------------------------------ public part --------------------------- */
79
void initDiskStat(struct SensorModul* sm)
84
DiskStatList = new_ctnr();
89
registerMonitor("partitions/list", "listview", printDiskStat, printDiskStatInfo, DiskStatSM);
91
for (disk_info = first_ctnr(DiskStatList); disk_info; disk_info = next_ctnr(DiskStatList)) {
92
snprintf(monitor, sizeof(monitor), "partitions%s/usedspace", disk_info->mntpnt);
93
registerMonitor(monitor, "integer", printDiskStatUsed, printDiskStatUsedInfo, DiskStatSM);
94
snprintf(monitor, sizeof(monitor), "partitions%s/freespace", disk_info->mntpnt);
95
registerMonitor(monitor, "integer", printDiskStatFree, printDiskStatFreeInfo, DiskStatSM);
96
snprintf(monitor, sizeof(monitor), "partitions%s/filllevel", disk_info->mntpnt);
97
registerMonitor(monitor, "integer", printDiskStatPercent, printDiskStatPercentInfo, DiskStatSM);
101
void checkDiskStat(void)
103
if (numMntPnt() != level_ctnr(DiskStatList)) {
104
/* a file system was mounted or unmounted
107
initDiskStat(DiskStatSM);
111
void exitDiskStat(void)
116
removeMonitor("partitions/list");
118
for (disk_info = first_ctnr(DiskStatList); disk_info; disk_info = next_ctnr(DiskStatList)) {
119
snprintf(monitor, sizeof(monitor), "partitions%s/usedspace", disk_info->mntpnt);
120
removeMonitor(monitor);
121
snprintf(monitor, sizeof(monitor), "partitions%s/freespace", disk_info->mntpnt);
122
removeMonitor(monitor);
123
snprintf(monitor, sizeof(monitor), "partitions%s/filllevel", disk_info->mntpnt);
124
removeMonitor(monitor);
127
destr_ctnr(DiskStatList, free);
130
int updateDiskStat(void)
132
struct statvfs *fs_info;
138
/* let's hope there is no difference between the DiskStatList and
139
the number of mounted file systems */
140
empty_ctnr(DiskStatList);
142
mntcount = getmntinfo(&fs_info, MNT_WAIT);
144
for (i = 0; i < mntcount; i++) {
146
if (strcmp(fs.f_fstypename, "procfs") && strcmp(fs.f_fstypename, "devfs") && strcmp(fs.f_fstypename, "devfs")) {
147
percent = (((float)fs.f_blocks - (float)fs.f_bfree)/(float)fs.f_blocks);
148
percent = percent * 100;
149
if ((disk_info = (DiskInfo *)malloc(sizeof(DiskInfo))) == NULL) {
152
memset(disk_info, 0, sizeof(DiskInfo));
153
strlcpy(disk_info->device, fs.f_mntfromname, sizeof(disk_info->device));
154
if (!strcmp(fs.f_mntonname, "/")) {
155
strncpy(disk_info->mntpnt, "/root", 6);
157
strlcpy(disk_info->mntpnt, fs.f_mntonname, sizeof(disk_info->mntpnt));
159
disk_info->blocks = fs.f_blocks;
160
disk_info->bfree = fs.f_bfree;
161
disk_info->bused = (fs.f_blocks - fs.f_bfree);
162
disk_info->bused_percent = (int)percent;
164
push_ctnr(DiskStatList, disk_info);
171
void printDiskStat(const char* cmd)
175
for (disk_info = first_ctnr(DiskStatList); disk_info; disk_info = next_ctnr(DiskStatList)) {
176
fprintf(CurrentClient, "%s\t%ld\t%ld\t%ld\t%d\t%s\n",
181
disk_info->bused_percent,
185
fprintf(CurrentClient, "\n");
188
void printDiskStatInfo(const char* cmd)
190
fprintf(CurrentClient, "Device\tBlocks\tUsed\tAvailable\tUsed %%\tMountPoint\nM\tD\tD\tD\td\ts\n");
193
void printDiskStatUsed(const char* cmd)
196
char *mntpnt = (char *)getMntPnt(cmd);
198
for (disk_info = first_ctnr(DiskStatList); disk_info; disk_info = next_ctnr(DiskStatList)) {
199
if (!strcmp(mntpnt, disk_info->mntpnt)) {
200
fprintf(CurrentClient, "%ld\n", disk_info->bused);
204
fprintf(CurrentClient, "\n");
207
void printDiskStatUsedInfo(const char* cmd)
209
fprintf(CurrentClient, "Used Blocks\t0\t-\tBlocks\n");
212
void printDiskStatFree(const char* cmd)
215
char *mntpnt = (char *)getMntPnt(cmd);
217
for (disk_info = first_ctnr(DiskStatList); disk_info; disk_info = next_ctnr(DiskStatList)) {
218
if (!strcmp(mntpnt, disk_info->mntpnt)) {
219
fprintf(CurrentClient, "%ld\n", disk_info->bfree);
223
fprintf(CurrentClient, "\n");
226
void printDiskStatFreeInfo(const char* cmd)
228
fprintf(CurrentClient, "Free Blocks\t0\t-\tBlocks\n");
231
void printDiskStatPercent(const char* cmd)
234
char *mntpnt = (char *)getMntPnt(cmd);
236
for (disk_info = first_ctnr(DiskStatList); disk_info; disk_info = next_ctnr(DiskStatList)) {
237
if (!strcmp(mntpnt, disk_info->mntpnt)) {
238
fprintf(CurrentClient, "%d\n", disk_info->bused_percent);
242
fprintf(CurrentClient, "\n");
245
void printDiskStatPercentInfo(const char* cmd)
247
fprintf(CurrentClient, "Used Blocks\t0\t100\t%%\n");