From nobody Tue Aug 12 15:15:06 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4c1Zn66jcsz64wnk; Tue, 12 Aug 2025 15:15:06 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4c1Zn65xM6z3gXP; Tue, 12 Aug 2025 15:15:06 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1755011706; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=PYYiPXKiElHlf/BXFr7bbBY3XBXdKLA3B1PYdfM/NNg=; b=fVCu3Yyu0WIrq21b6QHwBU1i4Dml3MYpAi2n5anckFATwG53IJ4/ZPRoIYdTef9fZ4l/Um 3VAQGZ4z5SWpruJpjCdEO5xwzMjDDYKAcZiu+Qgg+cekwwhC1tFR0+pFt++blnz0Z1Hgrj MAQRzQt4NTyUyt7ewkjThndaHdHlCznIUvXNet+o2/5CqNRqMdicYOOgaOXpPQlftPW3OV Kt+g2ygw4CxgDKhSALYpxYYDzQdvehhJczeOVEbzUpjlobz9m5O1zObomjDv5O5KxZJxLk uKb6zZFgFaRM5UtGsA4KuXU+QPZJJXlFROnCQkUs+mfEUJvQCXlgT8Z4BUVTtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1755011706; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=PYYiPXKiElHlf/BXFr7bbBY3XBXdKLA3B1PYdfM/NNg=; b=tYMeU0aVDF5JzgnHQtLjgbK2s+Pa744lgzhL3YMLPqjh0OfiUNJVXYeMQyFmhso//zmXEF GendCO4kiRw44eJcUtblD/UHbJ+an6jCfVEqSNJewqjeMr+J3aXSdt/0rxtflqsoTcNw2v JlsRedwVE/X1t94mDSteP4IIXpgT/WCXytPYs9A50BrgUrfcY6mj3JNTU8nfDXWARnkOuv a/bqR0/TEO30q8E7MuWvtxsOARD8b7KefFen6y9/s9px38CPc3x+dgwd1vPu0kYw7OCEgO qvuFoU0dlxzAw6xsj+1Esou3xma1mD0QhSrFYcwdGvgUJtvNdp4osLBtYTJc3g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1755011706; a=rsa-sha256; cv=none; b=hLJ1PQBo95wOo424OgHIbkG0yIVW31mqLwF3RwbnAqIVHfOrGIfApKq6EK/0jI05h5V/Hk FBtOl6sCC9eu4Gi/4keU4Zl2aZ7Obj3ChWSy2YBSzU/y6NaFvKHCCKZ7S7WhObh3By9H+L ajx38w1Aj4kAbvpXFUns/DKPvYkIoserwXmOttgCH5sFfpf0xwW9wU+iDJp5ALAlV2yiHw N+5YRG1q5knvzi1yrrkxFNUEHRF+iK9twMHDrp7rdFEq7x597IoDxvhge+9ksY11BWz68S ZnnlNyL1+MSHHkYfeqq5N3luvQwGdhAqkMM0pxJJ6Ph/8Q+LSkV6smiKAmsGZA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4c1Zn65VrpzkQy; Tue, 12 Aug 2025 15:15:06 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 57CFF6Zd052349; Tue, 12 Aug 2025 15:15:06 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 57CFF6ZM052346; Tue, 12 Aug 2025 15:15:06 GMT (envelope-from git) Date: Tue, 12 Aug 2025 15:15:06 GMT Message-Id: <202508121515.57CFF6ZM052346@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Alan Somers Subject: git: 61e404271ab8 - main - sockstat: complete libxo integration and improve formatting List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: asomers X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 61e404271ab81ec8035f4c9d23e6190c15d7f24c Auto-Submitted: auto-generated The branch main has been updated by asomers: URL: https://cgit.FreeBSD.org/src/commit/?id=61e404271ab81ec8035f4c9d23e6190c15d7f24c commit 61e404271ab81ec8035f4c9d23e6190c15d7f24c Author: Damin Rido AuthorDate: 2025-08-08 13:04:17 +0000 Commit: Alan Somers CommitDate: 2025-08-12 15:13:31 +0000 sockstat: complete libxo integration and improve formatting Fixed missing field names in xo_emit() calls for xolint compliance, treated XO_STYLE_HTML like XO_STYLE_TEXT to apply space-padded formatting for human-readable output, and updated usage() to indicate that --libxo accepts arguments. Reported by: Phil Shafer Sponsored by: Google, LLC (GSoC 2025) MFC after: 2 weeks Pull Request: https://github.com/freebsd/freebsd-src/pull/1806 Reviewed by: asomers --- usr.bin/sockstat/sockstat.c | 148 +++++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 70 deletions(-) diff --git a/usr.bin/sockstat/sockstat.c b/usr.bin/sockstat/sockstat.c index 6761faae5210..895c4d453b54 100644 --- a/usr.bin/sockstat/sockstat.c +++ b/usr.bin/sockstat/sockstat.c @@ -99,6 +99,7 @@ static bool opt_U; /* Show remote UDP encapsulation port number */ static bool opt_u; /* Show Unix domain sockets */ static u_int opt_v; /* Verbose mode */ static bool opt_w; /* Automatically size the columns */ +static bool is_xo_style_encoding; /* * Default protocols to use if no -P was defined. @@ -823,9 +824,7 @@ gather_unix(int proto) break; case SOCK_SEQPACKET: varname = "net.local.seqpacket.pcblist"; - protoname = (xo_get_style(NULL) == XO_STYLE_TEXT) - ? "seqpac" - : "seqpacket"; + protoname = is_xo_style_encoding ? "seqpacket" : "seqpack"; break; default: abort(); @@ -935,7 +934,6 @@ formataddr(struct sockaddr_storage *ss, char *buf, size_t bufsize) struct sockaddr_un *sun; char addrstr[NI_MAXHOST] = { '\0', '\0' }; int error, off, port = 0; - const bool is_text_style = (xo_get_style(NULL) == XO_STYLE_TEXT); switch (ss->ss_family) { case AF_INET: @@ -951,7 +949,7 @@ formataddr(struct sockaddr_storage *ss, char *buf, size_t bufsize) case AF_UNIX: sun = sstosun(ss); off = (int)((char *)&sun->sun_path - (char *)sun); - if (!is_text_style) { + if (is_xo_style_encoding) { xo_emit("{:path/%.*s}", sun->sun_len - off, sun->sun_path); return 0; @@ -965,7 +963,7 @@ formataddr(struct sockaddr_storage *ss, char *buf, size_t bufsize) if (error) xo_errx(1, "cap_getnameinfo()"); } - if (!is_text_style) { + if (is_xo_style_encoding) { xo_emit("{:address/%s}", addrstr); xo_emit("{:port/%d}", port); return 0; @@ -1113,15 +1111,14 @@ format_unix_faddr(struct addr *faddr, char *buf, size_t bufsize) { #define SAFESIZE (buf == NULL ? 0 : bufsize - pos) size_t pos = 0; - const bool is_text_style = (xo_get_style(NULL) == XO_STYLE_TEXT); if (faddr->conn != 0) { /* Remote peer we connect(2) to, if any. */ struct sock *p; - if (is_text_style) + if (!is_xo_style_encoding) pos += strlcpy(SAFEBUF, "-> ", SAFESIZE); p = RB_FIND(pcbs_t, &pcbs, &(struct sock){ .pcb = faddr->conn }); - if (__predict_false(p == NULL) && is_text_style) { + if (__predict_false(p == NULL) && !is_xo_style_encoding) { /* XXGL: can this happen at all? */ pos += snprintf(SAFEBUF, SAFESIZE, "??"); } else if (p->laddr->address.ss_len == 0) { @@ -1130,7 +1127,7 @@ format_unix_faddr(struct addr *faddr, char *buf, size_t bufsize) { &(struct file){ .xf_data = p->socket }); if (f != NULL) { - if (is_text_style) { + if (!is_xo_style_encoding) { pos += snprintf(SAFEBUF, SAFESIZE, "[%lu %d]", (u_long)f->xf_pid, f->xf_fd); @@ -1153,7 +1150,7 @@ format_unix_faddr(struct addr *faddr, char *buf, size_t bufsize) { kvaddr_t ref = faddr->firstref; bool fref = true; - if (is_text_style) + if (!is_xo_style_encoding) pos += snprintf(SAFEBUF, SAFESIZE, " <- "); xo_open_list("connections"); while ((p = RB_FIND(pcbs_t, &pcbs, @@ -1161,7 +1158,7 @@ format_unix_faddr(struct addr *faddr, char *buf, size_t bufsize) { f = RB_FIND(files_t, &ftree, &(struct file){ .xf_data = p->socket }); if (f != NULL) { - if (is_text_style) { + if (!is_xo_style_encoding) { pos += snprintf(SAFEBUF, SAFESIZE, "%s[%lu %d]", fref ? "" : ",", (u_long)f->xf_pid, f->xf_fd); @@ -1380,7 +1377,6 @@ display_sock(struct sock *s, struct col_widths *cw, char *buf, size_t bufsize) laddr = s->laddr; faddr = s->faddr; first = true; - const bool is_text_style = (xo_get_style(NULL) == XO_STYLE_TEXT); snprintf(buf, bufsize, "%s%s%s", s->protoname, @@ -1395,55 +1391,62 @@ display_sock(struct sock *s, struct col_widths *cw, char *buf, size_t bufsize) if (laddr->address.ss_len > 0) { xo_open_container("local"); formataddr(&laddr->address, buf, bufsize); - if (is_text_style) { - xo_emit(" {:/%-*.*s}", cw->local_addr, - cw->local_addr, buf); + if (!is_xo_style_encoding) { + xo_emit(" {:local-address/%-*.*s}", + cw->local_addr, cw->local_addr, + buf); } xo_close_container("local"); } else if (laddr->address.ss_len == 0 && - faddr->conn == 0 && is_text_style) { - xo_emit(" {:/%-*.*s}", cw->local_addr, - cw->local_addr, "(not connected)"); - } else if (is_text_style) { - xo_emit(" {:/%-*.*s}", cw->local_addr, - cw->local_addr, "??"); + faddr->conn == 0 && !is_xo_style_encoding) { + xo_emit(" {:local-address/%-*.*s}", + cw->local_addr, cw->local_addr, + "(not connected)"); + } else if (!is_xo_style_encoding) { + xo_emit(" {:local-address/%-*.*s}", + cw->local_addr, cw->local_addr, "??"); } if (faddr->conn != 0 || faddr->firstref != 0) { xo_open_container("foreign"); int len = format_unix_faddr(faddr, buf, bufsize); - if (len == 0 && is_text_style) - xo_emit(" {:/%-*s}", + if (len == 0 && !is_xo_style_encoding) + xo_emit(" {:foreign-address/%-*s}", cw->foreign_addr, "??"); - else if (is_text_style) - xo_emit(" {:/%-*.*s}", cw->foreign_addr, + else if (!is_xo_style_encoding) + xo_emit(" {:foreign-address/%-*.*s}", + cw->foreign_addr, cw->foreign_addr, buf); xo_close_container("foreign"); - } else if (is_text_style) - xo_emit(" {:/%-*s}", cw->foreign_addr, "??"); + } else if (!is_xo_style_encoding) + xo_emit(" {:foreign-address/%-*s}", + cw->foreign_addr, "??"); } else { if (laddr != NULL) { xo_open_container("local"); formataddr(&laddr->address, buf, bufsize); - if (is_text_style) { - xo_emit(" {:/%-*.*s}", cw->local_addr, - cw->local_addr, buf); + if (!is_xo_style_encoding) { + xo_emit(" {:local-address/%-*.*s}", + cw->local_addr, cw->local_addr, + buf); } xo_close_container("local"); - } else if (is_text_style) - xo_emit(" {:/%-*.*s}", cw->local_addr, - cw->local_addr, "??"); + } else if (!is_xo_style_encoding) + xo_emit(" {:local-address/%-*.*s}", + cw->local_addr, cw->local_addr, "??"); if (faddr != NULL) { xo_open_container("foreign"); formataddr(&faddr->address, buf, bufsize); - if (is_text_style) { - xo_emit(" {:/%-*.*s}", cw->foreign_addr, + if (!is_xo_style_encoding) { + xo_emit(" {:foreign-address/%-*.*s}", + cw->foreign_addr, cw->foreign_addr, buf); } xo_close_container("foreign"); - } else if (is_text_style) { - xo_emit(" {:/%-*.*s}", cw->foreign_addr, - cw->foreign_addr, "??"); + } else if (!is_xo_style_encoding) { + xo_emit(" {:foreign-address/%-*.*s}", + cw->foreign_addr, cw->foreign_addr, + "??"); } } if (opt_A) { @@ -1463,12 +1466,13 @@ display_sock(struct sock *s, struct col_widths *cw, char *buf, size_t bufsize) formataddr(&sp->laddr->address, buf, bufsize); xo_close_container("splice"); - } else if (is_text_style) + } else if (!is_xo_style_encoding) strlcpy(buf, "??", bufsize); - } else if (is_text_style) + } else if (!is_xo_style_encoding) strlcpy(buf, "??", bufsize); - if (is_text_style) - xo_emit(" {:/%-*s}", cw->splice_address, buf); + if (!is_xo_style_encoding) + xo_emit(" {:splice-address/%-*s}", + cw->splice_address, buf); } if (opt_i) { if (s->proto == IPPROTO_TCP || s->proto == IPPROTO_UDP) @@ -1476,8 +1480,8 @@ display_sock(struct sock *s, struct col_widths *cw, char *buf, size_t bufsize) snprintf(buf, bufsize, "%" PRIu64, s->inp_gencnt); xo_emit(" {:id/%*s}", cw->inp_gencnt, buf); - } else if (is_text_style) - xo_emit(" {:/%*s}", cw->inp_gencnt, "??"); + } else if (!is_xo_style_encoding) + xo_emit(" {:id/%*s}", cw->inp_gencnt, "??"); } if (opt_U) { if (faddr != NULL && @@ -1490,8 +1494,8 @@ display_sock(struct sock *s, struct col_widths *cw, char *buf, size_t bufsize) s->state != TCPS_LISTEN))) { xo_emit(" {:encaps/%*u}", cw->encaps, ntohs(faddr->encaps_port)); - } else if (is_text_style) - xo_emit(" {:/%*s}", cw->encaps, "??"); + } else if (!is_xo_style_encoding) + xo_emit(" {:encaps/%*s}", cw->encaps, "??"); } if (opt_s) { if (faddr != NULL && @@ -1501,8 +1505,9 @@ display_sock(struct sock *s, struct col_widths *cw, char *buf, size_t bufsize) s->state != SCTP_LISTEN) { xo_emit(" {:path-state/%-*s}", cw->path_state, sctp_path_state(faddr->state)); - } else if (is_text_style) - xo_emit(" {:/%-*s}", cw->path_state, "??"); + } else if (!is_xo_style_encoding) + xo_emit(" {:path-state/%-*s}", cw->path_state, + "??"); } if (first) { if (opt_s) { @@ -1520,37 +1525,37 @@ display_sock(struct sock *s, struct col_widths *cw, char *buf, size_t bufsize) xo_emit(" {:conn-state/%-*s}", cw->conn_state, tcpstates[s->state]); - else if (is_text_style) - xo_emit(" {:/%-*s}", + else if (!is_xo_style_encoding) + xo_emit(" {:conn-state/%-*s}", cw->conn_state, "??"); break; } - } else if (is_text_style) - xo_emit(" {:/%-*s}", + } else if (!is_xo_style_encoding) + xo_emit(" {:conn-state/%-*s}", cw->conn_state, "??"); } if (opt_S) { if (s->proto == IPPROTO_TCP) xo_emit(" {:stack/%-*s}", cw->stack, s->stack); - else if (is_text_style) - xo_emit(" {:/%-*s}", + else if (!is_xo_style_encoding) + xo_emit(" {:stack/%-*s}", cw->stack, "??"); } if (opt_C) { if (s->proto == IPPROTO_TCP) xo_emit(" {:cc/%-*s}", cw->cc, s->cc); - else if (is_text_style) - xo_emit(" {:/%-*s}", cw->cc, "??"); + else if (!is_xo_style_encoding) + xo_emit(" {:cc/%-*s}", cw->cc, "??"); } } if (laddr != NULL) laddr = laddr->next; if (faddr != NULL) faddr = faddr->next; - if (is_text_style && (laddr != NULL || faddr != NULL)) - xo_emit("{:/%-*s} {:/%-*s} {:/%*s} {:/%*s}", - cw->user, "??", cw->command, "??", + if (!is_xo_style_encoding && (laddr != NULL || faddr != NULL)) + xo_emit("{:user/%-*s} {:command/%-*s} {:pid/%*s}" + " {:fd/%*s}", cw->user, "??", cw->command, "??", cw->pid, "??", cw->fd, "??"); first = false; } @@ -1572,7 +1577,7 @@ display(void) return; } - if (xo_get_style(NULL) == XO_STYLE_TEXT) { + if (!is_xo_style_encoding) { cw = (struct col_widths) { .user = strlen("USER"), .command = 10, @@ -1643,8 +1648,8 @@ display(void) (u_long)xf->xf_uid); else xo_emit("{:user/%-*s}", cw.user, pwd->pw_name); - if (xo_get_style(NULL) == XO_STYLE_TEXT) - xo_emit(" {:/%-*.10s}", cw.command, + if (!is_xo_style_encoding) + xo_emit(" {:command/%-*.10s}", cw.command, getprocname(xf->xf_pid)); else xo_emit(" {:command/%-*s}", cw.command, @@ -1661,9 +1666,9 @@ display(void) if (!check_ports(s)) continue; xo_open_instance("socket"); - if (xo_get_style(NULL) == XO_STYLE_TEXT) - xo_emit("{:/%-*s} {:/%-*s} {:/%*s} {:/%*s}", - cw.user, "??", cw.command, "??", + if (!is_xo_style_encoding) + xo_emit("{:user/%-*s} {:command/%-*s} {:pid/%*s}" + " {:fd/%*s}", cw.user, "??", cw.command, "??", cw.pid, "??", cw.fd, "??"); display_sock(s, &cw, buf, bufsize); xo_close_instance("socket"); @@ -1674,9 +1679,9 @@ display(void) if (!check_ports(s)) continue; xo_open_instance("socket"); - if (xo_get_style(NULL) == XO_STYLE_TEXT) - xo_emit("{:/%-*s} {:/%-*s} {:/%*s} {:/%*s}", - cw.user, "??", cw.command, "??", + if (!is_xo_style_encoding) + xo_emit("{:user/%-*s} {:command/%-*s} {:pid/%*s}" + " {:fd/%*s}", cw.user, "??", cw.command, "??", cw.pid, "??", cw.fd, "??"); display_sock(s, &cw, buf, bufsize); xo_close_instance("socket"); @@ -1749,7 +1754,7 @@ static void usage(void) { xo_error( -"usage: sockstat [--libxo] [-46ACcfIiLlnqSsUuvw] [-j jid] [-p ports]\n" +"usage: sockstat [--libxo ...] [-46ACcfIiLlnqSsUuvw] [-j jid] [-p ports]\n" " [-P protocols]\n"); exit(1); } @@ -1767,6 +1772,9 @@ main(int argc, char *argv[]) argc = xo_parse_args(argc, argv); if (argc < 0) exit(1); + if (xo_get_style(NULL) != XO_STYLE_TEXT && + xo_get_style(NULL) != XO_STYLE_HTML) + is_xo_style_encoding = true; opt_j = -1; while ((o = getopt(argc, argv, "46ACcfIij:Llnp:P:qSsUuvw")) != -1) switch (o) {