Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F159355745
D57508.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
12 KB
Referenced Files
None
Subscribers
None
D57508.diff
View Options
diff --git a/usr.bin/sockstat/main.c b/usr.bin/sockstat/main.c
--- a/usr.bin/sockstat/main.c
+++ b/usr.bin/sockstat/main.c
@@ -107,49 +107,59 @@
/*
* Protocols that we support.
- * TODO: merge unix(4) protocols into here.
*/
+enum sockstatproto {
+ SCTP = 0, TCP, UDP, UDPLITE, DIVERT, STREAM, DGRAM, SEQPACK
+};
struct proto;
typedef void gather_func_t(struct proto *);
-static gather_func_t gather_sctp, gather_inet;
+static gather_func_t gather_sctp, gather_inet, gather_unix;
static struct proto {
gather_func_t *gather;
const char *name;
const char *pcblist;
- union {
- int protonum; /* gather_inet() */
- };
bool disabled;
} protos[] = {
- {
+ [SCTP] = {
.name = "sctp",
.gather = gather_sctp,
.pcblist = "net.inet.sctp.assoclist",
- .protonum = IPPROTO_SCTP,
},
- {
+ [TCP] = {
.name = "tcp",
.gather = gather_inet,
.pcblist = "net.inet.tcp.pcblist",
- .protonum = IPPROTO_TCP,
},
- {
+ [UDP] = {
.name = "udp",
.gather = gather_inet,
.pcblist = "net.inet.udp.pcblist",
- .protonum = IPPROTO_UDP,
},
- {
+ [UDPLITE] = {
.name = "udplite",
.gather = gather_inet,
.pcblist = "net.inet.udplite.pcblist",
- .protonum = IPPROTO_UDPLITE,
},
- {
+ [DIVERT] = {
.name = "divert",
.gather = gather_inet,
.pcblist = "net.inet.divert.pcblist",
},
+ [STREAM] = {
+ .name = "unix/stream",
+ .gather = gather_unix,
+ .pcblist = "net.local.stream.pcblist",
+ },
+ [DGRAM] = {
+ .name = "unix/dgram",
+ .gather = gather_unix,
+ .pcblist = "net.local.dgram.pcblist",
+ },
+ [SEQPACK] = {
+ .name = "unix/seqpack",
+ .gather = gather_unix,
+ .pcblist = "net.local.seqpacket.pcblist",
+ },
};
/*
@@ -185,10 +195,10 @@
int shown;
int vflag;
int family;
- int proto;
int state;
int fibnum;
int bblog_state;
+ const struct proto *proto;
const char *protoname;
char stack[TCP_FUNCTION_NAME_LEN_MAX];
char cc[TCP_CA_NAME_MAX];
@@ -387,8 +397,7 @@
if ((sock = calloc(1, sizeof *sock)) == NULL)
xo_err(1, "malloc()");
sock->socket = xinpcb->socket;
- sock->proto = IPPROTO_SCTP;
- sock->protoname = "sctp";
+ sock->proto = proto;
if (xinpcb->maxqlen == 0)
sock->state = SCTP_CLOSED;
else
@@ -488,8 +497,7 @@
if ((sock = calloc(1, sizeof *sock)) == NULL)
xo_err(1, "malloc()");
sock->socket = xinpcb->socket;
- sock->proto = IPPROTO_SCTP;
- sock->protoname = "sctp";
+ sock->proto = proto;
sock->state = (int)xstcb->state;
if (xinpcb->flags & SCTP_PCB_FLAGS_BOUND_V6) {
sock->family = AF_INET6;
@@ -665,7 +673,7 @@
xig = (struct xinpgen *)(void *)((char *)xig + xig->xig_len);
if (xig >= exig)
break;
- if (proto->protonum == IPPROTO_TCP) {
+ if (proto == &protos[TCP]) {
xtp = (struct xtcpcb *)xig;
xip = &xtp->xt_inp;
if (!check_ksize(xtp->xt_len, struct xtcpcb))
@@ -713,7 +721,7 @@
sock->socket = so->xso_so;
sock->pcb = so->so_pcb;
sock->splice_socket = so->so_splice_so;
- sock->proto = proto->protonum;
+ sock->proto = proto;
sock->inp_gencnt = xip->inp_gencnt;
sock->fibnum = so->so_fibnum;
if (xip->inp_vflag & INP_IPV4) {
@@ -729,14 +737,14 @@
sockaddr(&faddr->address, sock->family,
&xip->in6p_faddr, xip->inp_fport);
}
- if (proto->protonum == IPPROTO_TCP)
+ if (proto == &protos[TCP])
faddr->encaps_port = xtp->xt_encaps_port;
laddr->next = NULL;
faddr->next = NULL;
sock->laddr = laddr;
sock->faddr = faddr;
sock->vflag = xip->inp_vflag;
- if (proto->protonum == IPPROTO_TCP) {
+ if (proto == &protos[TCP]) {
sock->state = xtp->t_state;
sock->bblog_state = xtp->t_logstate;
memcpy(sock->stack, xtp->xt_stack,
@@ -755,33 +763,22 @@
}
static void
-gather_unix(int proto)
+gather_unix(struct proto *proto)
{
struct xunpgen *xug, *exug;
struct xunpcb *xup;
struct sock *sock;
struct addr *laddr, *faddr;
- const char *varname, *protoname;
+ const char *protoname;
size_t len, bufsize;
void *buf;
int retry;
- switch (proto) {
- case SOCK_STREAM:
- varname = "net.local.stream.pcblist";
- protoname = "stream";
- break;
- case SOCK_DGRAM:
- varname = "net.local.dgram.pcblist";
- protoname = "dgram";
- break;
- case SOCK_SEQPACKET:
- varname = "net.local.seqpacket.pcblist";
- protoname = is_xo_style_encoding ? "seqpacket" : "seqpack";
- break;
- default:
- abort();
- }
+ if (proto == &protos[SEQPACK] && is_xo_style_encoding)
+ protoname = "seqpacket";
+ else
+ protoname = strchr(proto->name, '/') + 1;
+
buf = NULL;
bufsize = 8192;
retry = 5;
@@ -790,8 +787,8 @@
if ((buf = realloc(buf, bufsize)) == NULL)
xo_err(1, "realloc()");
len = bufsize;
- if (cap_sysctlbyname(capsysctl, varname, buf, &len,
- NULL, 0) == 0)
+ if (cap_sysctlbyname(capsysctl, proto->pcblist, buf,
+ &len, NULL, 0) == 0)
break;
if (errno != ENOMEM || len != bufsize)
xo_err(1, "cap_sysctlbyname()");
@@ -1256,8 +1253,8 @@
}
}
if (opt_i) {
- if (s->proto == IPPROTO_TCP ||
- s->proto == IPPROTO_UDP) {
+ if (s->proto == &protos[TCP] ||
+ s->proto == &protos[UDP]) {
len = snprintf(NULL, 0,
"%" PRIu64, s->inp_gencnt);
cw->inp_gencnt = MAX(cw->inp_gencnt, len);
@@ -1265,11 +1262,11 @@
}
if (opt_U) {
if (faddr != NULL &&
- ((s->proto == IPPROTO_SCTP &&
+ ((s->proto == &protos[SCTP] &&
s->state != SCTP_CLOSED &&
s->state != SCTP_BOUND &&
s->state != SCTP_LISTEN) ||
- (s->proto == IPPROTO_TCP &&
+ (s->proto == &protos[TCP] &&
s->state != TCPS_CLOSED &&
s->state != TCPS_LISTEN))) {
len = snprintf(NULL, 0, "%u",
@@ -1279,7 +1276,7 @@
}
if (opt_s) {
if (faddr != NULL &&
- s->proto == IPPROTO_SCTP &&
+ s->proto == &protos[SCTP] &&
s->state != SCTP_CLOSED &&
s->state != SCTP_BOUND &&
s->state != SCTP_LISTEN) {
@@ -1289,33 +1286,27 @@
}
if (first) {
if (opt_s) {
- if (s->proto == IPPROTO_SCTP ||
- s->proto == IPPROTO_TCP) {
- switch (s->proto) {
- case IPPROTO_SCTP:
+ if (s->proto == &protos[SCTP]) {
+ len = strlen(sctp_conn_state(s->state));
+ cw->conn_state = MAX(cw->conn_state,
+ len);
+ }
+ if (s->proto == &protos[TCP]) {
+ if (s->state >= 0 &&
+ s->state < TCP_NSTATES) {
len = strlen(
- sctp_conn_state(s->state));
+ tcpstates[s->state]);
cw->conn_state = MAX(
- cw->conn_state, len);
- break;
- case IPPROTO_TCP:
- if (s->state >= 0 &&
- s->state < TCP_NSTATES) {
- len = strlen(
- tcpstates[s->state]);
- cw->conn_state = MAX(
- cw->conn_state,
- len);
- }
- break;
+ cw->conn_state,
+ len);
}
}
}
- if (opt_S && s->proto == IPPROTO_TCP) {
+ if (opt_S && s->proto == &protos[TCP]) {
len = strlen(s->stack);
cw->stack = MAX(cw->stack, len);
}
- if (opt_C && s->proto == IPPROTO_TCP) {
+ if (opt_C && s->proto == &protos[TCP]) {
len = strlen(s->cc);
cw->cc = MAX(cw->cc, len);
}
@@ -1482,8 +1473,8 @@
cw->splice_address, buf);
}
if (opt_i) {
- if (s->proto == IPPROTO_TCP ||
- s->proto == IPPROTO_UDP) {
+ if (s->proto == &protos[TCP] ||
+ s->proto == &protos[UDP]) {
snprintf(buf, bufsize, "%" PRIu64,
s->inp_gencnt);
xo_emit(" {:id/%*s}", cw->inp_gencnt, buf);
@@ -1492,11 +1483,11 @@
}
if (opt_U) {
if (faddr != NULL &&
- ((s->proto == IPPROTO_SCTP &&
+ ((s->proto == &protos[SCTP] &&
s->state != SCTP_CLOSED &&
s->state != SCTP_BOUND &&
s->state != SCTP_LISTEN) ||
- (s->proto == IPPROTO_TCP &&
+ (s->proto == &protos[TCP] &&
s->state != TCPS_CLOSED &&
s->state != TCPS_LISTEN))) {
xo_emit(" {:encaps/%*u}", cw->encaps,
@@ -1506,7 +1497,7 @@
}
if (opt_s && show_path_state) {
if (faddr != NULL &&
- s->proto == IPPROTO_SCTP &&
+ s->proto == &protos[SCTP] &&
s->state != SCTP_CLOSED &&
s->state != SCTP_BOUND &&
s->state != SCTP_LISTEN) {
@@ -1518,31 +1509,25 @@
}
if (first) {
if (opt_s) {
- if (s->proto == IPPROTO_SCTP ||
- s->proto == IPPROTO_TCP) {
- switch (s->proto) {
- case IPPROTO_SCTP:
+ if (s->proto == &protos[SCTP]) {
+ xo_emit(" {:conn-state/%-*s}",
+ cw->conn_state,
+ sctp_conn_state(s->state));
+ } else if (s->proto == &protos[TCP]) {
+ if (s->state >= 0 &&
+ s->state < TCP_NSTATES)
xo_emit(" {:conn-state/%-*s}",
cw->conn_state,
- sctp_conn_state(s->state));
- break;
- case IPPROTO_TCP:
- if (s->state >= 0 &&
- s->state < TCP_NSTATES)
- xo_emit(" {:conn-state/%-*s}",
- cw->conn_state,
- tcpstates[s->state]);
- else if (!is_xo_style_encoding)
- xo_emit(" {:conn-state/%-*s}",
- cw->conn_state, "??");
- break;
- }
+ tcpstates[s->state]);
+ else if (!is_xo_style_encoding)
+ xo_emit(" {:conn-state/%-*s}",
+ cw->conn_state, "??");
} else if (!is_xo_style_encoding)
xo_emit(" {:conn-state/%-*s}",
cw->conn_state, "??");
}
if (opt_b) {
- if (s->proto == IPPROTO_TCP)
+ if (s->proto == &protos[TCP])
xo_emit(" {:bblog-state/%-*s}",
cw->bblog_state,
bblog_state(s->bblog_state));
@@ -1551,7 +1536,7 @@
cw->bblog_state, "??");
}
if (opt_S) {
- if (s->proto == IPPROTO_TCP)
+ if (s->proto == &protos[TCP])
xo_emit(" {:stack/%-*s}",
cw->stack, s->stack);
else if (!is_xo_style_encoding)
@@ -1559,7 +1544,7 @@
cw->stack, "??");
}
if (opt_C) {
- if (s->proto == IPPROTO_TCP)
+ if (s->proto == &protos[TCP])
xo_emit(" {:cc/%-*s}", cw->cc, s->cc);
else if (!is_xo_style_encoding)
xo_emit(" {:cc/%-*s}", cw->cc, "??");
@@ -1983,23 +1968,42 @@
if (opt_F && !parse_filter_user())
xo_errx(1, "Invalid username or UID specified");
- if ((!opt_4 && !opt_6) && protos_defined)
- opt_4 = opt_6 = true;
- if (!opt_4 && !opt_6 && !opt_u)
- opt_4 = opt_6 = opt_u = true;
if (!opt_c && !opt_l)
opt_c = opt_l = true;
- if (opt_4 || opt_6)
- for (u_int i = 0; i < nitems(protos); i++)
- if (!protos[i].disabled)
- protos[i].gather(&protos[i]);
-
- if (opt_u || (!protos_defined && !opt_4 && !opt_6)) {
- gather_unix(SOCK_STREAM);
- gather_unix(SOCK_DGRAM);
- gather_unix(SOCK_SEQPACKET);
+ /*
+ * By default all protocols are gathered.
+ *
+ * With -u and without -[46] disables all but unix(4).
+ * With -[46] and without -u disables unix(4).
+ * With -P only specified are gathered and -4 and -6 are ignored,
+ * however -u is not ignored (historical bug).
+ *
+ * divert(4) is controlled by -4 (historical bug).
+ *
+ * NB: opt_4 and opt_6 are used outside this function, thus need to
+ * be set to true if both are false.
+ */
+ if (protos_defined) {
+ if (opt_u)
+ protos[STREAM].disabled = protos[DGRAM].disabled =
+ protos[SEQPACK].disabled = false;
+ } else {
+ if (!opt_u && (opt_4 || opt_6))
+ protos[STREAM].disabled = protos[DGRAM].disabled =
+ protos[SEQPACK].disabled = true;
+ if (opt_u && !(opt_4 || opt_6))
+ protos[SCTP].disabled = protos[TCP].disabled =
+ protos[UDP].disabled = protos[UDPLITE].disabled =
+ true;
}
+ if (!opt_4 && !opt_6)
+ opt_4 = opt_6 = true;
+
+ for (u_int i = 0; i < nitems(protos); i++)
+ if (!protos[i].disabled)
+ protos[i].gather(&protos[i]);
+
getfiles();
display();
exit(0);
diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1
--- a/usr.bin/sockstat/sockstat.1
+++ b/usr.bin/sockstat/sockstat.1
@@ -119,7 +119,10 @@
.Qq tcp ,
.Qq sctp ,
.Qq udp ,
-.Qq udplite
+.Qq udplite ,
+.Qq unix/stream ,
+.Qq unix/dgram ,
+.Qq unix/seqpack ,
and
.Qq divert .
.It Fl q
@@ -257,6 +260,13 @@
$ sockstat -6 -P tcp
.Ed
.Pp
+Show all listening
+.Xr unix 4
+datagram sockets:
+.Bd -literal -offset indent
+$ sockstat -P unix/dgram -l
+.Ed
+.Pp
Show all sockets in JSON format with neat alignment:
.Bd -literal -offset indent
$ sockstat --libxo json,pretty
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Jun 14, 5:39 AM (14 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33942945
Default Alt Text
D57508.diff (12 KB)
Attached To
Mode
D57508: sockstat: consolidate unix(4) protocols in the array of protocols
Attached
Detach File
Event Timeline
Log In to Comment