This looks good.  Some issues below:

On 30 Jul 2025, at 16:27, Alan Somers wrote:
> @@ -1345,65 +1380,104 @@ display_sock(struct sock *s, struct col_widths *cw, 
> char *buf, size_t bufsize)
> ...
>> +                       } 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, "??");
> +                       }

These calls are missing a field name; you should have seen warning for this, 
something like:

  foo: missing field name: %-*.*s
  <missing-field-name>??      </missing-field-name>

You'll need something like "{:local-address/%*.*s}".

Please be sure to test with "--libxo:W", which will report many issues.  Also 
there's "xolint" for checking source code.

Longer term, I'd like to make some sort of clang plugin to report formatting 
issues at build time.

> @@ -1436,47 +1510,52 @@ display_sock(struct sock *s, struct col_widths *cw, 
> char *buf, size_t bufsize)
>                                     s->proto == IPPROTO_TCP) {
>                                         switch (s->proto) {
>                                         case IPPROTO_SCTP:
> -                                               printf(" %-*s", 
> cw->conn_state,
> -                                                   
> sctp_conn_state(s->state));
> +                                               xo_emit(" {:path-state/%-*s}",
> +                                                       cw->path_state,
> +                                                       sctp_path_state(
> +                                                               
> faddr->state));
>                                                 break;

Is the change from conn_state to path_state intentional?


> +       if (xo_get_style(NULL) == XO_STYLE_TEXT) {
> +               cw = (struct col_widths) {
> ...

Here and elsewhere: when you check for XO_STYLE_TEXT for formatting, you'll 
also care about XO_STYLE_HTML and other future styles.  I have a function in 
libxo that's currently private/static:

        /*
         * Indicate if the style is an "encoding" one as opposed to a "display" 
one.
         */
        static int
        xo_style_is_encoding (xo_handle_t *xop)
        {
            if (xo_style(xop) == XO_STYLE_JSON
                || xo_style(xop) == XO_STYLE_XML
                || xo_style(xop) == XO_STYLE_SDPARAMS
                || xo_style(xop) == XO_STYLE_ENCODER)
                return TRUE;
            return FALSE;
        }

I can make that public, allowing you to say "if (!xo_style_is_encoding(NULL)) { 
... }", but for now, you'll need to explicitly test for XO_STYLE_HTML.

> +     xo_error(
> +"usage: sockstat [--libxo] [-46ACcfIiLlnqSsUuvw] [-j jid] [-p ports]\n"
> +"                [-P protocols]\n");
> +     exit(1);

I don't have a real convention for this, but maybe "[--libxo ...]" would convey 
that there's content with the option?

Thanks,
 Phil

Reply via email to