The branch main has been updated by asomers:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=61e404271ab81ec8035f4c9d23e6190c15d7f24c

commit 61e404271ab81ec8035f4c9d23e6190c15d7f24c
Author:     Damin Rido <r...@freebsd.org>
AuthorDate: 2025-08-08 13:04:17 +0000
Commit:     Alan Somers <asom...@freebsd.org>
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 <p...@juniper.net>
    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) {

Reply via email to