int ignore_history;
int no_output;
int json_output;
-int pretty;
int no_update;
int scan_interval;
int time_constant;
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;
static void load_ugly_table(FILE *fp)
{
- char buf[4096];
+ char *buf = NULL;
+ size_t buflen = 0;
+ ssize_t nread;
struct nstat_ent *db = NULL;
struct nstat_ent *n;
- while (fgets(buf, sizeof(buf), fp) != NULL) {
- char idbuf[sizeof(buf)];
+ while ((nread = getline(&buf, &buflen, fp)) != -1) {
+ char idbuf[4096];
int off;
char *p;
int count1, count2, skip = 0;
p = next;
}
n = db;
- if (fgets(buf, sizeof(buf), fp) == NULL)
+ nread = getline(&buf, &buflen, fp);
+ if (nread == -1)
abort();
count2 = count_spaces(buf);
if (count2 > count1)
n = n->next;
} while (p > buf + off + 2);
}
+ free(buf);
while (db) {
n = db;
}
}
+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");
h = hist_db;
if (jw) {
+ jsonw_start_object(jw);
jsonw_pretty(jw, pretty);
jsonw_name(jw, info_source);
jsonw_start_object(jw);
}
if (jw) {
+ jsonw_end_object(jw);
+
jsonw_end_object(jw);
jsonw_destroy(&jw);
}
h = hist_db;
if (jw) {
+ jsonw_start_object(jw);
jsonw_pretty(jw, pretty);
jsonw_name(jw, info_source);
jsonw_start_object(jw);
}
if (jw) {
+ jsonw_end_object(jw);
+
jsonw_end_object(jw);
jsonw_destroy(&jw);
}
load_netstat();
load_snmp6();
load_snmp();
+ load_sctp_snmp();
h = kern_db;
kern_db = n;
load_netstat();
load_snmp6();
load_snmp();
+ load_sctp_snmp();
for (;;) {
int status;
{
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);
}
&& 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);
load_netstat();
load_snmp6();
load_snmp();
+ load_sctp_snmp();
if (info_source[0] == 0)
strcpy(info_source, "kernel");
}