ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/examples/network_traffic.c
Revision: 1.6
Committed: Mon Jan 5 17:29:07 2004 UTC (20 years, 4 months ago) by ats
Content type: text/plain
Branch: MAIN
CVS Tags: LIBSTATGRAB_0_8
Changes since 1.5: +6 -0 lines
Log Message:
Make one of the examples use statgrab_drop_privileges.

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org
4 * Copyright (C) 2000-2003 i-scream
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21 /* A very basic example of how to get the network statistics from the system
22 * and diaply them. Also it adds up all the traffic to create and print out
23 * a total
24 * Takes several arguments :
25 * -d <number> Takes the number of seconds to wait to get traffic sent since last call
26 * Note, this is not network traffic per second. Its the traffic since last
27 * call. If you want it traffic per second averaged over time since last call
28 * You need to divide against the time since last time this was called. The time
29 * between 2 calls is stored in systime in the network_stat_t structure.
30 * -b Display in bytes
31 * -k Display in kilobytes
32 * -m Display in megabytes
33 */
34
35 #include <stdio.h>
36 #include <statgrab.h>
37 #include <stdlib.h>
38 #include <unistd.h>
39
40 int main(int argc, char **argv){
41
42 extern char *optarg;
43 extern int optind;
44 int c;
45
46 /* We default to 1 second updates and displaying in bytes*/
47 int delay = 1;
48 char units = 'b';
49
50 network_stat_t *network_stats;
51 int num_network_stats;
52
53 /* Parse command line options */
54 while ((c = getopt(argc, argv, "d:bkm")) != -1){
55 switch (c){
56 case 'd':
57 delay = atoi(optarg);
58 break;
59 case 'b':
60 units = 'b';
61 break;
62 case 'k':
63 units = 'k';
64 break;
65 case 'm':
66 units = 'm';
67 break;
68 }
69 }
70
71 /* Initialise statgrab */
72 statgrab_init();
73
74 /* Drop setuid/setgid privileges. */
75 if (statgrab_drop_privileges() != 0) {
76 perror("Error. Failed to drop privileges");
77 return 1;
78 }
79
80 /* We are not interested in the amount of traffic ever transmitted, just differences.
81 * Because of this, we do nothing for the very first call.
82 */
83
84 network_stats = get_network_stats_diff(&num_network_stats);
85 if (network_stats == NULL){
86 perror("Error. Failed to get network stats");
87 return 1;
88 }
89
90 /* Clear the screen ready for display the network stats */
91 printf("\033[2J");
92
93 /* Keep getting the network stats */
94 while ( (network_stats = get_network_stats_diff(&num_network_stats)) != NULL){
95 int x;
96 int line_number = 2;
97
98 long long total_tx=0;
99 long long total_rx=0;
100
101 for(x = 0; x < num_network_stats; x++){
102 /* Print at location 2, linenumber the interface name */
103 printf("\033[%d;2H%-25s : %-10s", line_number++, "Network Interface Name", network_stats->interface_name);
104 /* Print out at the correct location the traffic in the requsted units passed at command time */
105 switch(units){
106 case 'b':
107 printf("\033[%d;2H%-25s : %8lld b", line_number++, "Network Interface Rx", network_stats->rx);
108 printf("\033[%d;2H%-25s : %8lld b", line_number++, "Network Interface Tx", network_stats->tx);
109 break;
110 case 'k':
111 printf("\033[%d;2H%-25s : %5lld k", line_number++, "Network Interface Rx", (network_stats->rx / 1024));
112 printf("\033[%d;2H%-25s : %5lld", line_number++, "Network Interface Tx", (network_stats->tx / 1024));
113 break;
114 case 'm':
115 printf("\033[%d;2H%-25s : %5.2f m", line_number++, "Network Interface Rx", network_stats->rx / (1024.00*1024.00));
116 printf("\033[%d;2H%-25s : %5.2f m", line_number++, "Network Interface Tx", network_stats->tx / (1024.00*1024.00));
117 }
118 printf("\033[%d;2H%-25s : %ld ", line_number++, "Network Interface systime", (long) network_stats->systime);
119
120 /* Add a blank line between interfaces */
121 line_number++;
122
123 /* Add up this interface to the total so we can display a "total" network io" */
124 total_tx+=network_stats->tx;
125 total_rx+=network_stats->rx;
126
127 /* Move the pointer onto the next interface. Since this returns a static buffer, we dont need
128 * to keep track of the orginal pointer to free later */
129 network_stats++;
130 }
131
132 printf("\033[%d;2H%-25s : %-10s", line_number++, "Network Interface Name", "Total Network IO");
133 switch(units){
134 case 'b':
135 printf("\033[%d;2H%-25s : %8lld b", line_number++, "Network Total Rx", total_rx);
136 printf("\033[%d;2H%-25s : %8lld b", line_number++, "Network Total Tx", total_tx);
137 break;
138 case 'k':
139 printf("\033[%d;2H%-25s : %5lld k", line_number++, "Network Total Rx", (total_rx / 1024));
140 printf("\033[%d;2H%-25s : %5lld k", line_number++, "Network Total Tx", (total_tx / 1024));
141 break;
142 case 'm':
143 printf("\033[%d;2H%-25s : %5.2f m", line_number++, "Network Total Rx", (total_rx / (1024.00*1024.00)));
144 printf("\033[%d;2H%-25s : %5.2f m", line_number++, "Network Total Tx", (total_tx / (1024.00*1024.00)));
145 break;
146 }
147
148 fflush(stdout);
149
150 sleep(delay);
151
152 }
153
154 return 0;
155
156 }