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 <sys/types.h>
22
#include <sys/socket.h>
23
#include <sys/sysctl.h>
27
#include <net/if_mib.h>
36
#include "ksysguardd.h"
55
static NetDevInfo NetDevs[MAXNETDEVS];
56
static NetDevInfo NetDevsOld[MAXNETDEVS];
57
static int NetDevCnt = 0;
58
static struct SensorModul* NetDevSM;
60
static float elapsed = 0.0;
61
static struct timeval old_tv;
63
char **parseCommand(const char *cmd)
65
char *tmp_cmd = strdup(cmd);
67
char **retval = malloc(sizeof(char *)*2);
69
begin = rindex(tmp_cmd, '/');
72
retval[1] = strdup((const char *)begin); /* sensor */
74
begin = rindex(tmp_cmd, '/');
76
begin = rindex(tmp_cmd, '/');
78
retval[0] = strdup((const char *)begin); /* interface */
84
int numActivIfaces(void)
90
struct ifmibdata ifmd;
92
len = sizeof(num_iface);
93
sysctlbyname("net.link.generic.system.ifcount", &num_iface, &len, NULL, 0);
95
for (i = 1; i < num_iface + 1; i++) {
98
name[2] = NETLINK_GENERIC;
99
name[3] = IFMIB_IFDATA;
101
name[5] = IFDATA_GENERAL;
104
sysctl(name, 6, &ifmd, &len, NULL, 0);
105
if (ifmd.ifmd_flags & IFF_UP)
112
/* ------------------------------ public part --------------------------- */
114
void initNetDev(struct SensorModul* sm)
118
gettimeofday(&old_tv, (struct timezone *)0);
124
for (i = 0; i < NetDevCnt; i++) {
126
NetDevsOld[i] = NetDevs[i];
128
/* register monitors */
129
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/data", NetDevs[i].name);
130
registerMonitor(monitor, "integer", printNetDevRecBytes, printNetDevRecBytesInfo, NetDevSM);
131
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/packets", NetDevs[i].name);
132
registerMonitor(monitor, "integer", printNetDevRecBytes, printNetDevRecBytesInfo, NetDevSM);
133
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/errors", NetDevs[i].name);
134
registerMonitor(monitor, "integer", printNetDevRecBytes, printNetDevRecBytesInfo, NetDevSM);
135
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/drops", NetDevs[i].name);
136
registerMonitor(monitor, "integer", printNetDevRecBytes, printNetDevRecBytesInfo, NetDevSM);
137
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/multicast", NetDevs[i].name);
138
registerMonitor(monitor, "integer", printNetDevRecBytes, printNetDevRecBytesInfo, NetDevSM);
140
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/data", NetDevs[i].name);
141
registerMonitor(monitor, "integer", printNetDevSentBytes, printNetDevSentBytesInfo, NetDevSM);
142
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/packets", NetDevs[i].name);
143
registerMonitor(monitor, "integer", printNetDevSentBytes, printNetDevSentBytesInfo, NetDevSM);
144
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/errors", NetDevs[i].name);
145
registerMonitor(monitor, "integer", printNetDevSentBytes, printNetDevSentBytesInfo, NetDevSM);
146
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/multicast", NetDevs[i].name);
147
registerMonitor(monitor, "integer", printNetDevSentBytes, printNetDevSentBytesInfo, NetDevSM);
148
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/collisions", NetDevs[i].name);
149
registerMonitor(monitor, "integer", printNetDevSentBytes, printNetDevSentBytesInfo, NetDevSM);
153
void exitNetDev(void)
158
for (i = 0; i < NetDevCnt; i++) {
159
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/data", NetDevs[i].name);
160
removeMonitor(monitor);
161
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/packets", NetDevs[i].name);
162
removeMonitor(monitor);
163
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/errors", NetDevs[i].name);
164
removeMonitor(monitor);
165
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/drops", NetDevs[i].name);
166
removeMonitor(monitor);
167
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/multicast", NetDevs[i].name);
168
removeMonitor(monitor);
170
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/data", NetDevs[i].name);
171
removeMonitor(monitor);
172
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/packets", NetDevs[i].name);
173
removeMonitor(monitor);
174
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/errors", NetDevs[i].name);
175
removeMonitor(monitor);
176
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/multicast", NetDevs[i].name);
177
removeMonitor(monitor);
178
snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/collisions", NetDevs[i].name);
179
removeMonitor(monitor);
183
int updateNetDev(void)
188
struct ifmibdata ifmd;
189
struct timeval new_tv, tv;
191
len = sizeof(num_iface);
192
sysctlbyname("net.link.generic.system.ifcount", &num_iface, &len, NULL, 0);
195
for (i = 1; i < num_iface + 1; i++) {
198
name[2] = NETLINK_GENERIC;
199
name[3] = IFMIB_IFDATA;
201
name[5] = IFDATA_GENERAL;
204
sysctl(name, 6, &ifmd, &len, NULL, 0);
205
if (ifmd.ifmd_flags & IFF_UP) {
206
NetDevsOld[NetDevCnt] = NetDevs[NetDevCnt];
208
strlcpy(NetDevs[NetDevCnt].name, ifmd.ifmd_name, sizeof(NetDevs[NetDevCnt].name));
209
NetDevs[NetDevCnt].recBytes = ifmd.ifmd_data.ifi_ibytes;
210
NetDevs[NetDevCnt].recPacks = ifmd.ifmd_data.ifi_ipackets;
211
NetDevs[NetDevCnt].recErrs = ifmd.ifmd_data.ifi_ierrors;
212
NetDevs[NetDevCnt].recDrop = ifmd.ifmd_data.ifi_iqdrops;
213
NetDevs[NetDevCnt].recMulticast = ifmd.ifmd_data.ifi_imcasts;
214
NetDevs[NetDevCnt].sentBytes = ifmd.ifmd_data.ifi_obytes;
215
NetDevs[NetDevCnt].sentPacks = ifmd.ifmd_data.ifi_opackets;
216
NetDevs[NetDevCnt].sentErrs = ifmd.ifmd_data.ifi_oerrors;
217
NetDevs[NetDevCnt].sentMulticast = ifmd.ifmd_data.ifi_omcasts;
218
NetDevs[NetDevCnt].sentColls = ifmd.ifmd_data.ifi_collisions;
223
gettimeofday(&new_tv, (struct timezone *)0);
224
timersub(&new_tv, &old_tv, &tv);
225
elapsed = tv.tv_sec + (tv.tv_usec * 1e-6);
231
void checkNetDev(void)
233
if (numActivIfaces() != NetDevCnt) {
234
/* interface has been added or removed
237
initNetDev(NetDevSM);
241
void printNetDevRecBytes(const char *cmd)
246
retval = parseCommand(cmd);
251
for (i = 0; i < NetDevCnt; i++) {
252
if (!strcmp(NetDevs[i].name, retval[0])) {
253
if (!strncmp(retval[1], "data", 4))
254
fprintf(CurrentClient, "%lu", (u_long)((NetDevs[i].recBytes - NetDevsOld[i].recBytes) / (1024 * elapsed)));
255
if (!strncmp(retval[1], "packets", 7))
256
fprintf(CurrentClient, "%lu", (u_long)((NetDevs[i].recPacks - NetDevsOld[i].recPacks) / elapsed));
257
if (!strncmp(retval[1], "errors", 6))
258
fprintf(CurrentClient, "%lu", (u_long)((NetDevs[i].recErrs - NetDevsOld[i].recErrs) / elapsed));
259
if (!strncmp(retval[1], "drops", 5))
260
fprintf(CurrentClient, "%lu", (u_long)((NetDevs[i].recDrop - NetDevsOld[i].recDrop) / elapsed));
261
if (!strncmp(retval[1], "multicast", 9))
262
fprintf(CurrentClient, "%lu", (u_long)((NetDevs[i].recMulticast - NetDevsOld[i].recMulticast) / elapsed));
269
fprintf(CurrentClient, "\n");
272
void printNetDevRecBytesInfo(const char *cmd)
276
retval = parseCommand(cmd);
281
if (!strncmp(retval[1], "data", 4))
282
fprintf(CurrentClient, "Received Data\t0\t0\tKB/s\n");
283
if (!strncmp(retval[1], "packets", 7))
284
fprintf(CurrentClient, "Received Packets\t0\t0\t1/s\n");
285
if (!strncmp(retval[1], "errors", 6))
286
fprintf(CurrentClient, "Receiver Errors\t0\t0\t1/s\n");
287
if (!strncmp(retval[1], "drops", 5))
288
fprintf(CurrentClient, "Receiver Drops\t0\t0\t1/s\n");
289
if (!strncmp(retval[1], "multicast", 9))
290
fprintf(CurrentClient, "Received Multicast Packets\t0\t0\t1/s\n");
297
void printNetDevSentBytes(const char *cmd)
302
retval = parseCommand(cmd);
307
for (i = 0; i < NetDevCnt; i++) {
308
if (!strcmp(NetDevs[i].name, retval[0])) {
309
if (!strncmp(retval[1], "data", 4))
310
fprintf(CurrentClient, "%lu", (u_long)((NetDevs[i].sentBytes - NetDevsOld[i].sentBytes) / (1024 * elapsed)));
311
if (!strncmp(retval[1], "packets", 7))
312
fprintf(CurrentClient, "%lu", (u_long)((NetDevs[i].sentPacks - NetDevsOld[i].sentPacks) / elapsed));
313
if (!strncmp(retval[1], "errors", 6))
314
fprintf(CurrentClient, "%lu", (u_long)((NetDevs[i].sentErrs - NetDevsOld[i].sentErrs) / elapsed));
315
if (!strncmp(retval[1], "multicast", 9))
316
fprintf(CurrentClient, "%lu", (u_long)((NetDevs[i].sentMulticast - NetDevsOld[i].sentMulticast) / elapsed));
317
if (!strncmp(retval[1], "collisions", 10))
318
fprintf(CurrentClient, "%lu", (u_long)((NetDevs[i].sentColls - NetDevsOld[i].sentColls) / elapsed));
325
fprintf(CurrentClient, "\n");
328
void printNetDevSentBytesInfo(const char *cmd)
332
retval = parseCommand(cmd);
337
if (!strncmp(retval[1], "data", 4))
338
fprintf(CurrentClient, "Sent Data\t0\t0\tKB/s\n");
339
if (!strncmp(retval[1], "packets", 7))
340
fprintf(CurrentClient, "Sent Packets\t0\t0\t1/s\n");
341
if (!strncmp(retval[1], "errors", 6))
342
fprintf(CurrentClient, "Transmitter Errors\t0\t0\t1/s\n");
343
if (!strncmp(retval[1], "multicast", 9))
344
fprintf(CurrentClient, "Sent Multicast Packets\t0\t0\t1/s\n");
345
if (!strncmp(retval[1], "collisions", 10))
346
fprintf(CurrentClient, "Transmitter Collisions\t0\t0\t1/s\n");