~ubuntu-branches/ubuntu/utopic/kde-workspace/utopic-proposed

« back to all changes in this revision

Viewing changes to ksysguard/ksysguardd/FreeBSD/netdev.c

  • Committer: Bazaar Package Importer
  • Author(s): Michał Zając
  • Date: 2011-07-09 08:31:15 UTC
  • Revision ID: james.westby@ubuntu.com-20110709083115-ohyxn6z93mily9fc
Tags: upstream-4.6.90
Import upstream version 4.6.90

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
    KSysGuard, the KDE System Guard
 
3
 
 
4
    Copyright (c) 2001 Tobias Koenig <tokoe@kde.org>
 
5
 
 
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.
 
9
 
 
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.
 
14
 
 
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.
 
18
 
 
19
*/
 
20
 
 
21
#include <sys/types.h>
 
22
#include <sys/socket.h>
 
23
#include <sys/sysctl.h>
 
24
#include <sys/time.h>
 
25
 
 
26
#include <net/if.h>
 
27
#include <net/if_mib.h>
 
28
 
 
29
#include <fcntl.h>
 
30
#include <stdio.h>
 
31
#include <string.h>
 
32
#include <stdlib.h>
 
33
#include <unistd.h>
 
34
 
 
35
#include "Command.h"
 
36
#include "ksysguardd.h"
 
37
#include "netdev.h"
 
38
 
 
39
 
 
40
typedef struct {
 
41
    char name[32];
 
42
    u_long recBytes;
 
43
    u_long recPacks;
 
44
    u_long recErrs;
 
45
    u_long recDrop;
 
46
    u_long recMulticast;
 
47
    u_long sentBytes;
 
48
    u_long sentPacks;
 
49
    u_long sentErrs;
 
50
    u_long sentMulticast;
 
51
    u_long sentColls;
 
52
} NetDevInfo;
 
53
 
 
54
#define MAXNETDEVS 64
 
55
static NetDevInfo NetDevs[MAXNETDEVS];
 
56
static NetDevInfo NetDevsOld[MAXNETDEVS];
 
57
static int NetDevCnt = 0;
 
58
static struct SensorModul* NetDevSM;
 
59
 
 
60
static float elapsed = 0.0;
 
61
static struct timeval old_tv;
 
62
 
 
63
char **parseCommand(const char *cmd)
 
64
{
 
65
    char *tmp_cmd = strdup(cmd);
 
66
    char *begin;
 
67
    char **retval = malloc(sizeof(char *)*2);
 
68
 
 
69
    begin = rindex(tmp_cmd, '/');
 
70
    *begin = '\0';
 
71
    begin++;
 
72
    retval[1] = strdup((const char *)begin); /* sensor */
 
73
 
 
74
    begin = rindex(tmp_cmd, '/');
 
75
    *begin = '\0';
 
76
    begin = rindex(tmp_cmd, '/');
 
77
    begin++;
 
78
    retval[0] = strdup((const char *)begin); /* interface  */
 
79
    free(tmp_cmd);
 
80
 
 
81
    return retval;
 
82
}
 
83
 
 
84
int numActivIfaces(void)
 
85
{
 
86
    int counter = 0;
 
87
    int name[6];
 
88
    int num_iface, i;
 
89
    size_t len;
 
90
    struct ifmibdata ifmd;
 
91
 
 
92
    len = sizeof(num_iface);
 
93
    sysctlbyname("net.link.generic.system.ifcount", &num_iface, &len, NULL, 0);
 
94
 
 
95
    for (i = 1; i < num_iface + 1; i++) {
 
96
        name[0] = CTL_NET;
 
97
        name[1] = PF_LINK;
 
98
        name[2] = NETLINK_GENERIC;
 
99
        name[3] = IFMIB_IFDATA;
 
100
        name[4] = i;
 
101
        name[5] = IFDATA_GENERAL;
 
102
 
 
103
        len = sizeof(ifmd);
 
104
        sysctl(name, 6, &ifmd, &len, NULL, 0);
 
105
        if (ifmd.ifmd_flags & IFF_UP)
 
106
            counter++;
 
107
    }
 
108
 
 
109
    return counter;
 
110
}
 
111
 
 
112
/* ------------------------------ public part --------------------------- */
 
113
 
 
114
void initNetDev(struct SensorModul* sm)
 
115
{
 
116
    int i;
 
117
    char monitor[1024];
 
118
    gettimeofday(&old_tv, (struct timezone *)0);
 
119
 
 
120
    NetDevSM = sm;
 
121
 
 
122
    updateNetDev();
 
123
    
 
124
    for (i = 0; i < NetDevCnt; i++) {
 
125
        /* init data */
 
126
        NetDevsOld[i] = NetDevs[i];
 
127
 
 
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);
 
139
 
 
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);
 
150
    }
 
151
}
 
152
 
 
153
void exitNetDev(void)
 
154
{
 
155
    int i;
 
156
    char monitor[1024];
 
157
 
 
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);
 
169
 
 
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);
 
180
    }
 
181
}
 
182
 
 
183
int updateNetDev(void)
 
184
{
 
185
    int name[6];
 
186
    int num_iface, i;
 
187
    size_t len;
 
188
    struct ifmibdata ifmd;
 
189
    struct timeval new_tv, tv;
 
190
 
 
191
    len = sizeof(num_iface);
 
192
    sysctlbyname("net.link.generic.system.ifcount", &num_iface, &len, NULL, 0);
 
193
 
 
194
    NetDevCnt = 0;
 
195
    for (i = 1; i < num_iface + 1; i++) {
 
196
        name[0] = CTL_NET;
 
197
        name[1] = PF_LINK;
 
198
        name[2] = NETLINK_GENERIC;
 
199
        name[3] = IFMIB_IFDATA;
 
200
        name[4] = i;
 
201
        name[5] = IFDATA_GENERAL;
 
202
 
 
203
        len = sizeof(ifmd);
 
204
        sysctl(name, 6, &ifmd, &len, NULL, 0);
 
205
        if (ifmd.ifmd_flags & IFF_UP) {
 
206
            NetDevsOld[NetDevCnt] = NetDevs[NetDevCnt];
 
207
 
 
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;
 
219
            NetDevCnt++;
 
220
        }
 
221
    }
 
222
 
 
223
    gettimeofday(&new_tv, (struct timezone *)0);
 
224
    timersub(&new_tv, &old_tv, &tv);
 
225
    elapsed = tv.tv_sec + (tv.tv_usec * 1e-6);
 
226
    old_tv = new_tv;
 
227
 
 
228
    return 0;
 
229
}
 
230
 
 
231
void checkNetDev(void)
 
232
{
 
233
    if (numActivIfaces() != NetDevCnt) {
 
234
        /* interface has been added or removed
 
235
           so we do a reset */
 
236
        exitNetDev();
 
237
        initNetDev(NetDevSM);
 
238
    }
 
239
}
 
240
 
 
241
void printNetDevRecBytes(const char *cmd)
 
242
{
 
243
    int i;
 
244
    char **retval;
 
245
    
 
246
    retval = parseCommand(cmd);
 
247
    
 
248
    if (retval == NULL)
 
249
        return;
 
250
 
 
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));
 
263
        }
 
264
    }
 
265
    free(retval[0]);
 
266
    free(retval[1]);
 
267
    free(retval);
 
268
 
 
269
    fprintf(CurrentClient, "\n");
 
270
}
 
271
 
 
272
void printNetDevRecBytesInfo(const char *cmd)
 
273
{
 
274
    char **retval;
 
275
    
 
276
    retval = parseCommand(cmd);
 
277
    
 
278
    if (retval == NULL)
 
279
        return;
 
280
 
 
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");
 
291
    
 
292
    free(retval[0]);
 
293
    free(retval[1]);
 
294
    free(retval);
 
295
}
 
296
 
 
297
void printNetDevSentBytes(const char *cmd)
 
298
{
 
299
    int i;
 
300
    char **retval;
 
301
    
 
302
    retval = parseCommand(cmd);
 
303
    
 
304
    if (retval == NULL)
 
305
        return;
 
306
 
 
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));
 
319
        }
 
320
    }
 
321
    free(retval[0]);
 
322
    free(retval[1]);
 
323
    free(retval);
 
324
 
 
325
    fprintf(CurrentClient, "\n");
 
326
}
 
327
 
 
328
void printNetDevSentBytesInfo(const char *cmd)
 
329
{
 
330
    char **retval;
 
331
    
 
332
    retval = parseCommand(cmd);
 
333
    
 
334
    if (retval == NULL)
 
335
        return;
 
336
 
 
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");
 
347
 
 
348
    free(retval[0]);
 
349
    free(retval[1]);
 
350
    free(retval);
 
351
}