aboutsummaryrefslogtreecommitdiffstats
path: root/misc/rtacct.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/rtacct.c')
-rw-r--r--misc/rtacct.c106
1 files changed, 52 insertions, 54 deletions
diff --git a/misc/rtacct.c b/misc/rtacct.c
index bb8c90f9..b1cb3788 100644
--- a/misc/rtacct.c
+++ b/misc/rtacct.c
@@ -33,20 +33,21 @@
#include <SNAPSHOT.h>
-int reset_history = 0;
-int ignore_history = 0;
-int no_output = 0;
-int no_update = 0;
-int scan_interval = 0;
-int time_constant = 0;
-int dump_zeros = 0;
-unsigned long magic_number = 0;
+int reset_history;
+int ignore_history;
+int no_output;
+int no_update;
+int scan_interval;
+int time_constant;
+int dump_zeros;
+unsigned long magic_number;
double W;
static int generic_proc_open(const char *env, const char *name)
{
char store[1024];
char *p = getenv(env);
+
if (!p) {
p = getenv("PROC_ROOT") ? : "/proc";
snprintf(store, sizeof(store)-1, "%s/%s", p, name);
@@ -62,8 +63,7 @@ static int net_rtacct_open(void)
static __u32 rmap[256/4];
-struct rtacct_data
-{
+struct rtacct_data {
__u32 ival[256*4];
unsigned long long val[256*4];
@@ -82,6 +82,7 @@ static void nread(int fd, char *buf, int tot)
while (count < tot) {
int n = read(fd, buf+count, tot-count);
+
if (n < 0) {
if (errno == EINTR)
continue;
@@ -121,7 +122,7 @@ static __u32 *read_kern_table(__u32 *tbl)
fd = net_rtacct_open();
if (fd >= 0) {
- nread(fd, (char*)tbl, 256*16);
+ nread(fd, (char *)tbl, 256*16);
close(fd);
} else {
memset(tbl, 0, 256*16);
@@ -134,13 +135,13 @@ static void format_rate(FILE *fp, double rate)
char temp[64];
if (rate > 1024*1024) {
- sprintf(temp, "%uM", (unsigned)rint(rate/(1024*1024)));
+ sprintf(temp, "%uM", (unsigned int)rint(rate/(1024*1024)));
fprintf(fp, " %-10s", temp);
} else if (rate > 1024) {
- sprintf(temp, "%uK", (unsigned)rint(rate/1024));
+ sprintf(temp, "%uK", (unsigned int)rint(rate/1024));
fprintf(fp, " %-10s", temp);
} else
- fprintf(fp, " %-10u", (unsigned)rate);
+ fprintf(fp, " %-10u", (unsigned int)rate);
}
static void format_count(FILE *fp, unsigned long long val)
@@ -161,25 +162,19 @@ static void dump_abs_db(FILE *fp)
if (!no_output) {
fprintf(fp, "#%s\n", kern_db->signature);
fprintf(fp,
-"%-10s "
-"%-10s "
-"%-10s "
-"%-10s "
-"%-10s "
-"\n"
+"%-10s %-10s "
+"%-10s %-10s "
+"%-10s \n"
, "Realm", "BytesTo", "PktsTo", "BytesFrom", "PktsFrom");
fprintf(fp,
-"%-10s "
-"%-10s "
-"%-10s "
-"%-10s "
-"%-10s "
-"\n"
+"%-10s %-10s "
+"%-10s %-10s "
+"%-10s \n"
, "", "BPSTo", "PPSTo", "BPSFrom", "PPSFrom");
}
- for (realm=0; realm<256; realm++) {
+ for (realm = 0; realm < 256; realm++) {
int i;
unsigned long long *val;
double *rate;
@@ -223,24 +218,18 @@ static void dump_incr_db(FILE *fp)
if (!no_output) {
fprintf(fp, "#%s\n", kern_db->signature);
fprintf(fp,
-"%-10s "
-"%-10s "
-"%-10s "
-"%-10s "
-"%-10s "
-"\n"
+"%-10s %-10s "
+"%-10s %-10s "
+"%-10s \n"
, "Realm", "BytesTo", "PktsTo", "BytesFrom", "PktsFrom");
fprintf(fp,
-"%-10s "
-"%-10s "
-"%-10s "
-"%-10s "
-"%-10s "
-"\n"
+"%-10s %-10s "
+"%-10s %-10s "
+"%-10s \n"
, "", "BPSTo", "PPSTo", "BPSFrom", "PPSFrom");
}
- for (realm=0; realm<256; realm++) {
+ for (realm = 0; realm < 256; realm++) {
int ovfl = 0;
int i;
unsigned long long *val;
@@ -253,7 +242,7 @@ static void dump_incr_db(FILE *fp)
val = &kern_db->val[realm*4];
rate = &kern_db->rate[realm*4];
- for (k=0; k<4; k++) {
+ for (k = 0; k < 4; k++) {
rval[k] = val[k];
if (rval[k] < hist_db->val[realm*4+k])
ovfl = 1;
@@ -261,7 +250,7 @@ static void dump_incr_db(FILE *fp)
rval[k] -= hist_db->val[realm*4+k];
}
if (ovfl) {
- for (k=0; k<4; k++)
+ for (k = 0; k < 4; k++)
rval[k] = val[k];
}
if (hist_db) {
@@ -306,7 +295,7 @@ static void update_db(int interval)
ival = read_kern_table(_ival);
- for (i=0; i<256*4; i++) {
+ for (i = 0; i < 256*4; i++) {
double sample;
__u32 incr = ival[i] - kern_db->ival[i];
@@ -324,6 +313,7 @@ static void update_db(int interval)
kern_db->rate[i] = sample;
} else {
double w = W*(double)interval/scan_interval;
+
kern_db->rate[i] += w*(sample-kern_db->rate[i]);
}
}
@@ -335,7 +325,8 @@ static void send_db(int fd)
int tot = 0;
while (tot < sizeof(*kern_db)) {
- int n = write(fd, ((char*)kern_db) + tot, sizeof(*kern_db)-tot);
+ int n = write(fd, ((char *)kern_db) + tot, sizeof(*kern_db)-tot);
+
if (n < 0) {
if (errno == EINTR)
continue;
@@ -347,16 +338,17 @@ static void send_db(int fd)
-#define T_DIFF(a,b) (((a).tv_sec-(b).tv_sec)*1000 + ((a).tv_usec-(b).tv_usec)/1000)
+#define T_DIFF(a, b) (((a).tv_sec-(b).tv_sec)*1000 + ((a).tv_usec-(b).tv_usec)/1000)
static void pad_kern_table(struct rtacct_data *dat, __u32 *ival)
{
int i;
+
memset(dat->rate, 0, sizeof(dat->rate));
if (dat->ival != ival)
memcpy(dat->ival, ival, sizeof(dat->ival));
- for (i=0; i<256*4; i++)
+ for (i = 0; i < 256*4; i++)
dat->val[i] = ival[i];
}
@@ -364,12 +356,13 @@ static void server_loop(int fd)
{
struct timeval snaptime = { 0 };
struct pollfd p;
+
p.fd = fd;
p.events = p.revents = POLLIN;
sprintf(kern_db->signature,
"%u.%lu sampling_interval=%d time_const=%d",
- (unsigned) getpid(), (unsigned long)random(),
+ (unsigned int) getpid(), (unsigned long)random(),
scan_interval/1000, time_constant/1000);
pad_kern_table(kern_db, read_kern_table(kern_db->ival));
@@ -378,6 +371,7 @@ static void server_loop(int fd)
int status;
int tdiff;
struct timeval now;
+
gettimeofday(&now, NULL);
tdiff = T_DIFF(now, snaptime);
if (tdiff >= scan_interval) {
@@ -388,12 +382,14 @@ static void server_loop(int fd)
if (poll(&p, 1, tdiff + scan_interval) > 0
&& (p.revents&POLLIN)) {
int clnt = accept(fd, NULL, NULL);
+
if (clnt >= 0) {
pid_t pid;
+
if (children >= 5) {
close(clnt);
} else if ((pid = fork()) != 0) {
- if (pid>0)
+ if (pid > 0)
children++;
close(clnt);
} else {
@@ -414,7 +410,7 @@ static int verify_forging(int fd)
struct ucred cred;
socklen_t olen = sizeof(cred);
- if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, (void*)&cred, &olen) ||
+ if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, (void *)&cred, &olen) ||
olen < sizeof(cred))
return -1;
if (cred.uid == getuid() || cred.uid == 0)
@@ -440,7 +436,7 @@ int main(int argc, char *argv[])
int fd;
while ((ch = getopt(argc, argv, "h?vVzrM:nasd:t:")) != EOF) {
- switch(ch) {
+ switch (ch) {
case 'z':
dump_zeros = 1;
break;
@@ -489,6 +485,7 @@ int main(int argc, char *argv[])
if (argc) {
while (argc > 0) {
__u32 realm;
+
if (rtnl_rtrealm_a2n(&realm, argv[0])) {
fprintf(stderr, "Warning: realm \"%s\" does not exist.\n", argv[0]);
exit(-1);
@@ -515,7 +512,7 @@ int main(int argc, char *argv[])
perror("rtacct: socket");
exit(-1);
}
- if (bind(fd, (struct sockaddr*)&sun, 2+1+strlen(sun.sun_path+1)) < 0) {
+ if (bind(fd, (struct sockaddr *)&sun, 2+1+strlen(sun.sun_path+1)) < 0) {
perror("rtacct: bind");
exit(-1);
}
@@ -580,6 +577,7 @@ int main(int argc, char *argv[])
if (!ignore_history) {
FILE *tfp;
long uptime = -1;
+
if ((tfp = fopen("/proc/uptime", "r")) != NULL) {
if (fscanf(tfp, "%ld", &uptime) != 1)
uptime = -1;
@@ -596,11 +594,11 @@ int main(int argc, char *argv[])
}
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0 &&
- (connect(fd, (struct sockaddr*)&sun, 2+1+strlen(sun.sun_path+1)) == 0
+ (connect(fd, (struct sockaddr *)&sun, 2+1+strlen(sun.sun_path+1)) == 0
|| (strcpy(sun.sun_path+1, "rtacct0"),
- connect(fd, (struct sockaddr*)&sun, 2+1+strlen(sun.sun_path+1)) == 0))
+ connect(fd, (struct sockaddr *)&sun, 2+1+strlen(sun.sun_path+1)) == 0))
&& verify_forging(fd) == 0) {
- nread(fd, (char*)kern_db, sizeof(*kern_db));
+ nread(fd, (char *)kern_db, sizeof(*kern_db));
if (hist_db && hist_db->signature[0] &&
strcmp(kern_db->signature, hist_db->signature)) {
fprintf(stderr, "rtacct: history is stale, ignoring it.\n");