tf(" %*s", cw->encaps, "??"); + } + if (opt_s) { + if (faddr != NULL && + s->proto == IPPROTO_SCTP && + s->state != SCTP_CLOSED && + s->state != SCTP_BOUND && + s->state != SCTP_LISTEN) { + printf(" %-*s", cw->path_state, + sctp_path_state(faddr->state)); + } else + printf(" %-*s", cw->path_state, "??"); } if (first) { if (opt_s) { if (s->proto == IPPROTO_SCTP || s->proto == IPPROTO_TCP) { - do - pos += xprintf(" "); - while (pos < offset); switch (s->proto) { case IPPROTO_SCTP: - pos += xprintf("%s", + printf(" %-*s", cw->conn_state, sctp_conn_state(s->state)); break; case IPPROTO_TCP: if (s->state >= 0 && - s->state < TCP_NSTATES) - pos += xprintf("%s", - tcpstates[s->state]); + s->state < TCP_NSTATES) + printf(" %-*s", + cw->conn_state, + tcpstates[s->state]); else - pos += xprintf("?"); + printf(" %-*s", + cw->conn_state, "??"); break; } - } - offset += 13; + } else + printf(" %-*s", cw->conn_state, "??"); } if (opt_S) { - if (s->proto == IPPROTO_TCP) { - do - pos += xprintf(" "); - while (pos < offset); - pos += xprintf("%.*s", - TCP_FUNCTION_NAME_LEN_MAX, - s->stack); - } - offset += TCP_FUNCTION_NAME_LEN_MAX + 1; + if (s->proto == IPPROTO_TCP) + printf(" %-*s", cw->stack, s->stack); + else + printf(" %-*s", cw->stack, "??"); } if (opt_C) { - if (s->proto == IPPROTO_TCP) { - do - pos += xprintf(" "); - while (pos < offset); - xprintf("%.*s", TCP_CA_NAME_MAX, s->cc); - } - offset += TCP_CA_NAME_MAX + 1; + if (s->proto == IPPROTO_TCP) + printf(" %-*s", cw->cc, s->cc); + else + printf(" %-*s", cw->cc, "??"); } } if (laddr != NULL) laddr = laddr->next; if (faddr != NULL) faddr = faddr->next; - if ((laddr != NULL) || (faddr != NULL)) { - xprintf("\n"); - pos = 0; - } - first = 0; + if (laddr != NULL || faddr != NULL) + printf("%-*s %-*s %-*s %-*s %-*s", cw->user, "", + cw->command, "", cw->pid, "", cw->fd, "", + cw->proto, ""); + first = false; } - xprintf("\n"); + printf("\n"); } static void @@ -1344,33 +1502,41 @@ display(void) struct passwd *pwd; struct file *xf; struct sock *s; - int n, pos; + int n; + struct col_widths cw; + const size_t bufsize = 512; + void *buf; + if ((buf = (char *)malloc(bufsize)) == NULL) { + err(1, "malloc()"); + return; + } + calculate_column_widths(&cw); if (!opt_q) { - printf("%-8s %-10s %-5s %-3s %-6s %-*s %-*s", - "USER", "COMMAND", "PID", "FD", "PROTO", - opt_w ? 45 : 21, "LOCAL ADDRESS", - opt_w ? 45 : 21, "FOREIGN ADDRESS"); + printf("%-*s %-*s %*s %*s %-*s %-*s %-*s", + cw.user, "USER", cw.command, "COMMAND", + cw.pid, "PID", cw.fd, "FD", cw.proto, "PROTO", + cw.local_addr, "LOCAL ADDRESS", + cw.foreign_addr,"FOREIGN ADDRESS"); if (opt_A) - printf(" %-18s", "PCB KVA"); + printf(" %-*s", cw.pcb_kva, "PCB KVA"); if (opt_f) /* RT_MAXFIBS is 65535. */ - printf(" %-6s", "FIB"); + printf(" %*s", cw.fib, "FIB"); if (opt_I) - printf(" %-*s", opt_w ? 45 : 21, "SPLICE ADDRESS"); + printf(" %-*s", cw.splice_address, "SPLICE ADDRESS"); if (opt_i) - printf(" %-8s", "ID"); + printf(" %*s", cw.inp_gencnt, "ID"); if (opt_U) - printf(" %-6s", "ENCAPS"); + printf(" %*s", cw.encaps, "ENCAPS"); if (opt_s) { - printf(" %-12s", "PATH STATE"); - printf(" %-12s", "CONN STATE"); + printf(" %-*s", cw.path_state, "PATH STATE"); + printf(" %-*s", cw.conn_state, "CONN STATE"); } if (opt_S) - printf(" %-*.*s", TCP_FUNCTION_NAME_LEN_MAX, - TCP_FUNCTION_NAME_LEN_MAX, "STACK"); + printf(" %-*s", cw.stack, "STACK"); if (opt_C) - printf(" %-.*s", TCP_CA_NAME_MAX, "CC"); + printf(" %-*s", cw.cc, "CC"); printf("\n"); } cap_setpassent(cappwd, 1); @@ -1380,28 +1546,19 @@ display(void) if (opt_j >= 0 && opt_j != getprocjid(xf->xf_pid)) continue; s = RB_FIND(socks_t, &socks, - &(struct sock){ .socket = xf->xf_data}); + &(struct sock){ .socket = xf->xf_data}); if (s != NULL && check_ports(s)) { s->shown = 1; - pos = 0; if (opt_n || (pwd = cap_getpwuid(cappwd, xf->xf_uid)) == NULL) - pos += xprintf("%lu", (u_long)xf->xf_uid); + printf("%-*lu", cw.user, (u_long)xf->xf_uid); else - pos += xprintf("%s", pwd->pw_name); - do - pos += xprintf(" "); - while (pos < 9); - pos += xprintf("%.10s", getprocname(xf->xf_pid)); - do - pos += xprintf(" "); - while (pos < 20); - pos += xprintf("%5lu", (u_long)xf->xf_pid); - do - pos += xprintf(" "); - while (pos < 26); - pos += xprintf("%-3d", xf->xf_fd); - displaysock(s, pos); + printf("%-*s", cw.user, pwd->pw_name); + printf(" %-*.*s", cw.command, cw.command, + getprocname(xf->xf_pid)); + printf(" %*lu", cw.pid, (u_long)xf->xf_pid); + printf(" %*d", cw.fd, xf->xf_fd); + display_sock(s, &cw, buf, bufsize); } } if (opt_j >= 0) @@ -1409,19 +1566,20 @@ display(void) SLIST_FOREACH(s, &nosocks, socket_list) { if (!check_ports(s)) continue; - pos = xprintf("%-8s %-10s %-5s %-3s", - "?", "?", "?", "?"); - displaysock(s, pos); + printf("%-*s %-*s %*s %*s", cw.user, "??", cw.command, "??", + cw.pid, "??", cw.fd, "??"); + display_sock(s, &cw, buf, bufsize); } RB_FOREACH(s, socks_t, &socks) { if (s->shown) continue; if (!check_ports(s)) continue; - pos = xprintf("%-8s %-10s %-5s %-3s", - "?", "?", "?", "?"); - displaysock(s, pos); + printf("%-*s %-*s %*s %*s", cw.user, "??", cw.command, "??", + cw.pid, "??", cw.fd, "??"); + display_sock(s, &cw, buf, bufsize); } + free(buf); } static int @@ -1484,7 +1642,7 @@ static void usage(void) { errx(1, - "usage: sockstat [-46ACcfIiLlnqSsUuvw] [-j jid] [-p ports] [-P protocols]"); + "usage: sockstat [-46ACcfIiLlnqSsUuv] [-j jid] [-p ports] [-P protocols]"); } int @@ -1563,7 +1721,7 @@ main(int argc, char *argv[]) ++opt_v; break; case 'w': - opt_w = true; + /* left for backward compatibility. */ break; default: usage();