]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - misc/rtacct.c
ss: Render buffer to output every time a number of chunks are allocated
[mirror_iproute2.git] / misc / rtacct.c
index bb8c90f98f5a621ca14dcdfd7753024d60fb40dc..b1cb378818ab5c12582e473f2a4c14869235be91 100644 (file)
 
 #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");