diff options
Diffstat (limited to 'misc/rtacct.c')
-rw-r--r-- | misc/rtacct.c | 106 |
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"); |