X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=misc%2Fnstat.c;h=88f1c7698243235b12f58cd067afce488af1be4c;hb=3f7bd0fd909e5d25b8858d0182725c6ad4792d12;hp=e579ce1d315862ff8dec1d8a44b0314db9e1feb3;hpb=f62f952fad7883d96248a2526195420504b8f10e;p=mirror_iproute2.git diff --git a/misc/nstat.c b/misc/nstat.c index e579ce1d..88f1c769 100644 --- a/misc/nstat.c +++ b/misc/nstat.c @@ -37,7 +37,6 @@ int reset_history; int ignore_history; int no_output; int json_output; -int pretty; int no_update; int scan_interval; int time_constant; @@ -76,6 +75,11 @@ static int net_snmp6_open(void) return generic_proc_open("PROC_NET_SNMP6", "net/snmp6"); } +static int net_sctp_snmp_open(void) +{ + return generic_proc_open("PROC_NET_SCTP_SNMP", "net/sctp/snmp"); +} + struct nstat_ent { struct nstat_ent *next; char *id; @@ -173,12 +177,12 @@ static int count_spaces(const char *line) static void load_ugly_table(FILE *fp) { - char buf[4096]; + char buf[2048]; struct nstat_ent *db = NULL; struct nstat_ent *n; while (fgets(buf, sizeof(buf), fp) != NULL) { - char idbuf[sizeof(buf)]; + char idbuf[4096]; int off; char *p; int count1, count2, skip = 0; @@ -247,6 +251,16 @@ static void load_ugly_table(FILE *fp) } } +static void load_sctp_snmp(void) +{ + FILE *fp = fdopen(net_sctp_snmp_open(), "r"); + + if (fp) { + load_good_table(fp); + fclose(fp); + } +} + static void load_snmp(void) { FILE *fp = fdopen(net_snmp_open(), "r"); @@ -285,6 +299,7 @@ static void dump_kern_db(FILE *fp, int to_hist) h = hist_db; if (jw) { + jsonw_start_object(jw); jsonw_pretty(jw, pretty); jsonw_name(jw, info_source); jsonw_start_object(jw); @@ -317,6 +332,8 @@ static void dump_kern_db(FILE *fp, int to_hist) } if (jw) { + jsonw_end_object(jw); + jsonw_end_object(jw); jsonw_destroy(&jw); } @@ -329,6 +346,7 @@ static void dump_incr_db(FILE *fp) h = hist_db; if (jw) { + jsonw_start_object(jw); jsonw_pretty(jw, pretty); jsonw_name(jw, info_source); jsonw_start_object(jw); @@ -364,6 +382,8 @@ static void dump_incr_db(FILE *fp) } if (jw) { + jsonw_end_object(jw); + jsonw_end_object(jw); jsonw_destroy(&jw); } @@ -385,6 +405,7 @@ static void update_db(int interval) load_netstat(); load_snmp6(); load_snmp(); + load_sctp_snmp(); h = kern_db; kern_db = n; @@ -444,6 +465,7 @@ static void server_loop(int fd) load_netstat(); load_snmp6(); load_snmp(); + load_sctp_snmp(); for (;;) { int status; @@ -503,17 +525,17 @@ static void usage(void) { fprintf(stderr, "Usage: nstat [OPTION] [ PATTERN [ PATTERN ] ]\n" -" -h, --help this message\n" -" -a, --ignore ignore history\n" -" -d, --scan=SECS sample every statistics every SECS\n" -" -j, --json format output in JSON\n" -" -n, --nooutput do history only\n" -" -p, --pretty pretty print\n" -" -r, --reset reset history\n" -" -s, --noupdate don\'t update history\n" -" -t, --interval=SECS report average over the last SECS\n" -" -V, --version output version information\n" -" -z, --zeros show entries with zero activity\n"); +" -h, --help this message\n" +" -a, --ignore ignore history\n" +" -d, --scan=SECS sample every statistics every SECS\n" +" -j, --json format output in JSON\n" +" -n, --nooutput do history only\n" +" -p, --pretty pretty print\n" +" -r, --reset reset history\n" +" -s, --noupdate don't update history\n" +" -t, --interval=SECS report average over the last SECS\n" +" -V, --version output version information\n" +" -z, --zeros show entries with zero activity\n"); exit(-1); } @@ -683,12 +705,18 @@ int main(int argc, char *argv[]) && verify_forging(fd) == 0) { FILE *sfp = fdopen(fd, "r"); - load_good_table(sfp); - if (hist_db && source_mismatch) { - fprintf(stderr, "nstat: history is stale, ignoring it.\n"); - hist_db = NULL; + if (!sfp) { + fprintf(stderr, "nstat: fdopen failed: %s\n", + strerror(errno)); + close(fd); + } else { + load_good_table(sfp); + if (hist_db && source_mismatch) { + fprintf(stderr, "nstat: history is stale, ignoring it.\n"); + hist_db = NULL; + } + fclose(sfp); } - fclose(sfp); } else { if (fd >= 0) close(fd); @@ -700,6 +728,7 @@ int main(int argc, char *argv[]) load_netstat(); load_snmp6(); load_snmp(); + load_sctp_snmp(); if (info_source[0] == 0) strcpy(info_source, "kernel"); }