Author: tuexen
Date: Mon Jan 15 20:39:42 2018
New Revision: 328015
URL: https://svnweb.freebsd.org/changeset/base/328015

Log:
  Decode msghdr argument of sendmsg() and recvmsg().
  
  Sponsored by:         Netflix, Inc.

Modified:
  head/usr.bin/truss/syscall.h
  head/usr.bin/truss/syscalls.c

Modified: head/usr.bin/truss/syscall.h
==============================================================================
--- head/usr.bin/truss/syscall.h        Mon Jan 15 20:37:11 2018        
(r328014)
+++ head/usr.bin/truss/syscall.h        Mon Jan 15 20:39:42 2018        
(r328015)
@@ -82,7 +82,7 @@ enum Argtype { None = 1, Hex, Octal, Int, UInt, LongHe
        Sockoptname, Msgflags, CapRights, PUInt, PQuadHex, Acltype,
        Extattrnamespace, Minherit, Mlockall, Mountflags, Msync, Priowhich,
        Ptraceop, Quotactlcmd, Reboothowto, Rtpriofunc, Schedpolicy, Schedparam,
-       PSig, Siginfo, Kevent11, Iovec, Sctpsndrcvinfo,
+       PSig, Siginfo, Kevent11, Iovec, Sctpsndrcvinfo, Msghdr,
 
        CloudABIAdvice, CloudABIClockID, ClouduABIFDSFlags,
        CloudABIFDStat, CloudABIFileStat, CloudABIFileType,

Modified: head/usr.bin/truss/syscalls.c
==============================================================================
--- head/usr.bin/truss/syscalls.c       Mon Jan 15 20:37:11 2018        
(r328014)
+++ head/usr.bin/truss/syscalls.c       Mon Jan 15 20:39:42 2018        
(r328015)
@@ -401,7 +401,7 @@ static struct syscall decoded_syscalls[] = {
                    { Msgflags, 3 }, { Sockaddr | OUT, 4 },
                    { Ptr | OUT, 5 } } },
        { .name = "recvmsg", .ret_type = 1, .nargs = 3,
-         .args = { { Int, 0 }, { Ptr, 1 }, { Msgflags, 2 } } },
+         .args = { { Int, 0 }, { Msghdr | OUT, 1 }, { Msgflags, 2 } } },
        { .name = "rename", .ret_type = 1, .nargs = 2,
          .args = { { Name, 0 }, { Name, 1 } } },
        { .name = "renameat", .ret_type = 1, .nargs = 4,
@@ -444,7 +444,7 @@ static struct syscall decoded_syscalls[] = {
          .args = { { Int, 0 }, { Fd_set, 1 }, { Fd_set, 2 }, { Fd_set, 3 },
                    { Timeval, 4 } } },
        { .name = "sendmsg", .ret_type = 1, .nargs = 3,
-         .args = { { Int, 0 }, { Ptr, 1 }, { Msgflags, 2 } } },
+         .args = { { Int, 0 }, { Msghdr | IN, 1 }, { Msgflags, 2 } } },
        { .name = "sendto", .ret_type = 1, .nargs = 6,
          .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 },
                    { Msgflags, 3 }, { Sockaddr | IN, 4 },
@@ -1159,6 +1159,378 @@ print_utrace(FILE *fp, void *utrace_addr, size_t len)
        fprintf(fp, " }");
 }
 
+static void
+print_sockaddr(FILE *fp, struct trussinfo *trussinfo, void *arg, socklen_t len)
+{
+       char addr[64];
+       struct sockaddr_in *lsin;
+       struct sockaddr_in6 *lsin6;
+       struct sockaddr_un *sun;
+       struct sockaddr *sa;
+       u_char *q;
+       pid_t pid = trussinfo->curthread->proc->pid;
+
+       if (arg == NULL) {
+               fputs("NULL", fp);
+               return;
+       }
+       /* If the length is too small, just bail. */
+       if (len < sizeof(*sa)) {
+               fprintf(fp, "0x%p", arg);
+               return;
+       }
+
+       sa = calloc(1, len);
+       if (get_struct(pid, arg, sa, len) == -1) {
+               free(sa);
+               fprintf(fp, "0x%p", arg);
+               return;
+       }
+
+       switch (sa->sa_family) {
+       case AF_INET:
+               if (len < sizeof(*lsin))
+                       goto sockaddr_short;
+               lsin = (struct sockaddr_in *)(void *)sa;
+               inet_ntop(AF_INET, &lsin->sin_addr, addr, sizeof(addr));
+               fprintf(fp, "{ AF_INET %s:%d }", addr,
+                   htons(lsin->sin_port));
+               break;
+       case AF_INET6:
+               if (len < sizeof(*lsin6))
+                       goto sockaddr_short;
+               lsin6 = (struct sockaddr_in6 *)(void *)sa;
+               inet_ntop(AF_INET6, &lsin6->sin6_addr, addr,
+                   sizeof(addr));
+               fprintf(fp, "{ AF_INET6 [%s]:%d }", addr,
+                   htons(lsin6->sin6_port));
+               break;
+       case AF_UNIX:
+               sun = (struct sockaddr_un *)sa;
+               fprintf(fp, "{ AF_UNIX \"%.*s\" }",
+                   (int)(len - offsetof(struct sockaddr_un, sun_path)),
+                   sun->sun_path);
+               break;
+       default:
+       sockaddr_short:
+               fprintf(fp,
+                   "{ sa_len = %d, sa_family = %d, sa_data = {",
+                   (int)sa->sa_len, (int)sa->sa_family);
+               for (q = (u_char *)sa->sa_data;
+                    q < (u_char *)sa + len; q++)
+                       fprintf(fp, "%s 0x%02x",
+                           q == (u_char *)sa->sa_data ? "" : ",",
+                           *q);
+               fputs(" } }", fp);
+       }
+       free(sa);
+}
+
+#define IOV_LIMIT 16
+
+static void
+print_iovec(FILE *fp, struct trussinfo *trussinfo, void *arg, int iovcnt)
+{
+       struct iovec iov[IOV_LIMIT];
+       size_t max_string = trussinfo->strsize;
+       char tmp2[max_string + 1], *tmp3;
+       size_t len;
+       pid_t pid = trussinfo->curthread->proc->pid;
+       int i;
+       bool buf_truncated, iov_truncated;
+
+       if (iovcnt <= 0) {
+               fprintf(fp, "0x%p", arg);
+               return;
+       }
+       if (iovcnt > IOV_LIMIT) {
+               iovcnt = IOV_LIMIT;
+               iov_truncated = true;
+       } else {
+               iov_truncated = false;
+       }
+       if (get_struct(pid, arg, &iov, iovcnt * sizeof(struct iovec)) == -1) {
+               fprintf(fp, "0x%p", arg);
+               return;
+       }
+
+       fputs("[", fp);
+       for (i = 0; i < iovcnt; i++) {
+               len = iov[i].iov_len;
+               if (len > max_string) {
+                       len = max_string;
+                       buf_truncated = true;
+               } else {
+                       buf_truncated = false;
+               }
+               fprintf(fp, "%s{", (i > 0) ? "," : "");
+               if (len && get_struct(pid, iov[i].iov_base, &tmp2, len) != -1) {
+                       tmp3 = malloc(len * 4 + 1);
+                       while (len) {
+                               if (strvisx(tmp3, tmp2, len,
+                                   VIS_CSTYLE|VIS_TAB|VIS_NL) <=
+                                   (int)max_string)
+                                       break;
+                               len--;
+                               buf_truncated = true;
+                       }
+                       fprintf(fp, "\"%s\"%s", tmp3,
+                           buf_truncated ? "..." : "");
+                       free(tmp3);
+               } else {
+                       fprintf(fp, "0x%p", iov[i].iov_base);
+               }
+               fprintf(fp, ",%zu}", iov[i].iov_len);
+       }
+       fprintf(fp, "%s%s", iov_truncated ? ",..." : "", "]");
+}
+
+static void
+print_gen_cmsg(FILE *fp, struct cmsghdr *cmsghdr)
+{
+       u_char *q;
+
+       fputs("{", fp);
+       for (q = CMSG_DATA(cmsghdr);
+            q < (u_char *)cmsghdr + cmsghdr->cmsg_len; q++) {
+               fprintf(fp, "%s0x%02x", q == CMSG_DATA(cmsghdr) ? "" : ",", *q);
+       }
+       fputs("}", fp);
+}
+
+static void
+print_sctp_initmsg(FILE *fp, struct sctp_initmsg *init)
+{
+       fprintf(fp, "{out=%u,", init->sinit_num_ostreams);
+       fprintf(fp, "in=%u,", init->sinit_max_instreams);
+       fprintf(fp, "max_rtx=%u,", init->sinit_max_attempts);
+       fprintf(fp, "max_rto=%u}", init->sinit_max_init_timeo);
+}
+
+static void
+print_sctp_sndrcvinfo(FILE *fp, bool recv, struct sctp_sndrcvinfo *info)
+{
+       fprintf(fp, "{sid=%u,", info->sinfo_stream);
+       if (recv) {
+               fprintf(fp, "ssn=%u,", info->sinfo_ssn);
+       }
+       fputs("flgs=", fp);
+       sysdecode_sctp_sinfo_flags(fp, info->sinfo_flags);
+       fprintf(fp, ",ppid=%u,", ntohl(info->sinfo_ppid));
+       if (!recv) {
+               fprintf(fp, "ctx=%u,", info->sinfo_context);
+               fprintf(fp, "ttl=%u,", info->sinfo_timetolive);
+       }
+       if (recv) {
+               fprintf(fp, "tsn=%u,", info->sinfo_tsn);
+               fprintf(fp, "cumtsn=%u,", info->sinfo_cumtsn);
+       }
+       fprintf(fp, "id=%u}", info->sinfo_assoc_id);
+}
+
+static void
+print_sctp_sndinfo(FILE *fp, struct sctp_sndinfo *info)
+{
+       fprintf(fp, "{sid=%u,", info->snd_sid);
+       fputs("flgs=", fp);
+       print_mask_arg(sysdecode_sctp_snd_flags, fp, info->snd_flags);
+       fprintf(fp, ",ppid=%u,", ntohl(info->snd_ppid));
+       fprintf(fp, "ctx=%u,", info->snd_context);
+       fprintf(fp, "id=%u}", info->snd_assoc_id);
+}
+
+static void
+print_sctp_rcvinfo(FILE *fp, struct sctp_rcvinfo *info)
+{
+       fprintf(fp, "{sid=%u,", info->rcv_sid);
+       fprintf(fp, "ssn=%u,", info->rcv_ssn);
+       fputs("flgs=", fp);
+       print_mask_arg(sysdecode_sctp_rcv_flags, fp, info->rcv_flags);
+       fprintf(fp, ",ppid=%u,", ntohl(info->rcv_ppid));
+       fprintf(fp, "tsn=%u,", info->rcv_tsn);
+       fprintf(fp, "cumtsn=%u,", info->rcv_cumtsn);
+       fprintf(fp, "ctx=%u,", info->rcv_context);
+       fprintf(fp, "id=%u}", info->rcv_assoc_id);
+}
+
+static void
+print_sctp_nxtinfo(FILE *fp, struct sctp_nxtinfo *info)
+{
+       fprintf(fp, "{sid=%u,", info->nxt_sid);
+       fputs("flgs=", fp);
+       print_mask_arg(sysdecode_sctp_nxt_flags, fp, info->nxt_flags);
+       fprintf(fp, ",ppid=%u,", ntohl(info->nxt_ppid));
+       fprintf(fp, "len=%u,", info->nxt_length);
+       fprintf(fp, "id=%u}", info->nxt_assoc_id);
+}
+
+static void
+print_sctp_prinfo(FILE *fp, struct sctp_prinfo *info)
+{
+       fputs("{pol=", fp);
+       print_integer_arg(sysdecode_sctp_pr_policy, fp, info->pr_policy);
+       fprintf(fp, ",val=%u}", info->pr_value);
+}
+
+static void
+print_sctp_authinfo(FILE *fp, struct sctp_authinfo *info)
+{
+       fprintf(fp, "{num=%u}", info->auth_keynumber);
+}
+
+static void
+print_sctp_ipv4_addr(FILE *fp, struct in_addr *addr)
+{
+       char buf[INET_ADDRSTRLEN];
+       const char *s;
+
+       s = inet_ntop(AF_INET, addr, buf, INET_ADDRSTRLEN);
+       if (s != NULL)
+               fprintf(fp, "{addr=%s}", s);
+       else
+               fputs("{addr=???}", fp);
+}
+
+static void
+print_sctp_ipv6_addr(FILE *fp, struct in6_addr *addr)
+{
+       char buf[INET6_ADDRSTRLEN];
+       const char *s;
+
+       s = inet_ntop(AF_INET6, addr, buf, INET6_ADDRSTRLEN);
+       if (s != NULL)
+               fprintf(fp, "{addr=%s}", s);
+       else
+               fputs("{addr=???}", fp);
+}
+
+static void
+print_sctp_cmsg(FILE *fp, bool recv, struct cmsghdr *cmsghdr)
+{
+       void *data;
+       socklen_t len;
+
+       len = cmsghdr->cmsg_len;
+       data = CMSG_DATA(cmsghdr);
+       switch (cmsghdr->cmsg_type) {
+       case SCTP_INIT:
+               if (len == CMSG_LEN(sizeof(struct sctp_initmsg)))
+                       print_sctp_initmsg(fp, (struct sctp_initmsg *)data);
+               else
+                       print_gen_cmsg(fp, cmsghdr);
+               break;
+       case SCTP_SNDRCV:
+               if (len == CMSG_LEN(sizeof(struct sctp_sndrcvinfo)))
+                       print_sctp_sndrcvinfo(fp, recv,
+                           (struct sctp_sndrcvinfo *)data);
+               else
+                       print_gen_cmsg(fp, cmsghdr);
+               break;
+#if 0
+       case SCTP_EXTRCV:
+               if (len == CMSG_LEN(sizeof(struct sctp_extrcvinfo)))
+                       print_sctp_extrcvinfo(fp,
+                           (struct sctp_extrcvinfo *)data);
+               else
+                       print_gen_cmsg(fp, cmsghdr);
+               break;
+#endif
+       case SCTP_SNDINFO:
+               if (len == CMSG_LEN(sizeof(struct sctp_sndinfo)))
+                       print_sctp_sndinfo(fp, (struct sctp_sndinfo *)data);
+               else
+                       print_gen_cmsg(fp, cmsghdr);
+               break;
+       case SCTP_RCVINFO:
+               if (len == CMSG_LEN(sizeof(struct sctp_rcvinfo)))
+                       print_sctp_rcvinfo(fp, (struct sctp_rcvinfo *)data);
+               else
+                       print_gen_cmsg(fp, cmsghdr);
+               break;
+       case SCTP_NXTINFO:
+               if (len == CMSG_LEN(sizeof(struct sctp_nxtinfo)))
+                       print_sctp_nxtinfo(fp, (struct sctp_nxtinfo *)data);
+               else
+                       print_gen_cmsg(fp, cmsghdr);
+               break;
+       case SCTP_PRINFO:
+               if (len == CMSG_LEN(sizeof(struct sctp_prinfo)))
+                       print_sctp_prinfo(fp, (struct sctp_prinfo *)data);
+               else
+                       print_gen_cmsg(fp, cmsghdr);
+               break;
+       case SCTP_AUTHINFO:
+               if (len == CMSG_LEN(sizeof(struct sctp_authinfo)))
+                       print_sctp_authinfo(fp, (struct sctp_authinfo *)data);
+               else
+                       print_gen_cmsg(fp, cmsghdr);
+               break;
+       case SCTP_DSTADDRV4:
+               if (len == CMSG_LEN(sizeof(struct in_addr)))
+                       print_sctp_ipv4_addr(fp, (struct in_addr *)data);
+               else
+                       print_gen_cmsg(fp, cmsghdr);
+               break;
+       case SCTP_DSTADDRV6:
+               if (len == CMSG_LEN(sizeof(struct in6_addr)))
+                       print_sctp_ipv6_addr(fp, (struct in6_addr *)data);
+               else
+                       print_gen_cmsg(fp, cmsghdr);
+               break;
+       default:
+               print_gen_cmsg(fp, cmsghdr);
+       }
+}
+
+static void
+print_cmsgs(FILE *fp, pid_t pid, bool recv, struct msghdr *msghdr)
+{
+       struct cmsghdr *cmsghdr;
+       char *cmsgbuf;
+       const char *temp;
+       socklen_t len;
+       int level, type;
+       bool first;
+
+       len = msghdr->msg_controllen;
+       cmsgbuf = calloc(1, len);
+       if (get_struct(pid, msghdr->msg_control, cmsgbuf, len) == -1) {
+               fprintf(fp, "0x%p", msghdr);
+               free(cmsgbuf);
+       }
+       msghdr->msg_control = cmsgbuf;
+       first = true;
+       fputs("{", fp);
+       for (cmsghdr = CMSG_FIRSTHDR(msghdr);
+          cmsghdr != NULL;
+          cmsghdr = CMSG_NXTHDR(msghdr, cmsghdr)) {
+               level = cmsghdr->cmsg_level;
+               type = cmsghdr->cmsg_type;
+               len = cmsghdr->cmsg_len;
+               fprintf(fp, "%s{level=", first ? "" : ",");
+               print_integer_arg(sysdecode_sockopt_level, fp, level);
+               fputs(",type=", fp);
+               temp = sysdecode_cmsg_type(level, type);
+               if (temp) {
+                       fputs(temp, fp);
+               } else {
+                       fprintf(fp, "%d", type);
+               }
+               fputs(",data=", fp);
+               switch (level) {
+               case IPPROTO_SCTP:
+                       print_sctp_cmsg(fp, recv, cmsghdr);
+                       break;
+               default:
+                       print_gen_cmsg(fp, cmsghdr);
+                       break;
+               }
+               fputs("}", fp);
+       }
+       fputs("}", fp);
+       free(cmsgbuf);
+}
+
 /*
  * Converts a syscall argument into a string.  Said string is
  * allocated via malloc(), so needs to be free()'d.  sc is
@@ -1613,13 +1985,7 @@ print_arg(struct syscall_args *sc, unsigned long *args
                print_mask_arg(sysdecode_rfork_flags, fp, args[sc->offset]);
                break;
        case Sockaddr: {
-               char addr[64];
-               struct sockaddr_in *lsin;
-               struct sockaddr_in6 *lsin6;
-               struct sockaddr_un *sun;
-               struct sockaddr *sa;
                socklen_t len;
-               u_char *q;
 
                if (args[sc->offset] == 0) {
                        fputs("NULL", fp);
@@ -1641,56 +2007,7 @@ print_arg(struct syscall_args *sc, unsigned long *args
                } else
                        len = args[sc->offset + 1];
 
-               /* If the length is too small, just bail. */
-               if (len < sizeof(*sa)) {
-                       fprintf(fp, "0x%lx", args[sc->offset]);
-                       break;
-               }
-
-               sa = calloc(1, len);
-               if (get_struct(pid, (void *)args[sc->offset], sa, len) == -1) {
-                       free(sa);
-                       fprintf(fp, "0x%lx", args[sc->offset]);
-                       break;
-               }
-
-               switch (sa->sa_family) {
-               case AF_INET:
-                       if (len < sizeof(*lsin))
-                               goto sockaddr_short;
-                       lsin = (struct sockaddr_in *)(void *)sa;
-                       inet_ntop(AF_INET, &lsin->sin_addr, addr, sizeof(addr));
-                       fprintf(fp, "{ AF_INET %s:%d }", addr,
-                           htons(lsin->sin_port));
-                       break;
-               case AF_INET6:
-                       if (len < sizeof(*lsin6))
-                               goto sockaddr_short;
-                       lsin6 = (struct sockaddr_in6 *)(void *)sa;
-                       inet_ntop(AF_INET6, &lsin6->sin6_addr, addr,
-                           sizeof(addr));
-                       fprintf(fp, "{ AF_INET6 [%s]:%d }", addr,
-                           htons(lsin6->sin6_port));
-                       break;
-               case AF_UNIX:
-                       sun = (struct sockaddr_un *)sa;
-                       fprintf(fp, "{ AF_UNIX \"%.*s\" }",
-                           (int)(len - offsetof(struct sockaddr_un, sun_path)),
-                           sun->sun_path);
-                       break;
-               default:
-               sockaddr_short:
-                       fprintf(fp,
-                           "{ sa_len = %d, sa_family = %d, sa_data = {",
-                           (int)sa->sa_len, (int)sa->sa_family);
-                       for (q = (u_char *)sa->sa_data;
-                            q < (u_char *)sa + len; q++)
-                               fprintf(fp, "%s 0x%02x",
-                                   q == (u_char *)sa->sa_data ? "" : ",",
-                                   *q);
-                       fputs(" } }", fp);
-               }
-               free(sa);
+               print_sockaddr(fp, trussinfo, (void *)args[sc->offset], len);
                break;
        }
        case Sigaction: {
@@ -2148,93 +2465,43 @@ print_arg(struct syscall_args *sc, unsigned long *args
                        fprintf(fp, "0x%lx", args[sc->offset]);
                break;
        }
-#define IOV_LIMIT 16
-       case Iovec: {
+       case Iovec:
                /*
                 * Print argument as an array of struct iovec, where the next
                 * syscall argument is the number of elements of the array.
                 */
-               struct iovec iov[IOV_LIMIT];
-               size_t max_string = trussinfo->strsize;
-               char tmp2[max_string + 1], *tmp3;
-               size_t len;
-               int i, iovcnt;
-               bool buf_truncated, iov_truncated;
 
-               iovcnt = args[sc->offset + 1];
-               if (iovcnt <= 0) {
-                       fprintf(fp, "0x%lx", args[sc->offset]);
-                       break;
-               }
-               if (iovcnt > IOV_LIMIT) {
-                       iovcnt = IOV_LIMIT;
-                       iov_truncated = true;
-               } else {
-                       iov_truncated = false;
-               }
+               print_iovec(fp, trussinfo, (void *)args[sc->offset],
+                   (int)args[sc->offset + 1]);
+               break;
+       case Sctpsndrcvinfo: {
+               struct sctp_sndrcvinfo info;
+
                if (get_struct(pid, (void *)args[sc->offset],
-                   &iov, iovcnt * sizeof(struct iovec)) == -1) {
+                   &info, sizeof(struct sctp_sndrcvinfo)) == -1) {
                        fprintf(fp, "0x%lx", args[sc->offset]);
                        break;
                }
-
-               fprintf(fp, "%s", "[");
-               for (i = 0; i < iovcnt; i++) {
-                       len = iov[i].iov_len;
-                       if (len > max_string) {
-                               len = max_string;
-                               buf_truncated = true;
-                       } else {
-                               buf_truncated = false;
-                       }
-                       fprintf(fp, "%s{", (i > 0) ? "," : "");
-                       if (len && get_struct(pid, iov[i].iov_base, &tmp2, len)
-                           != -1) {
-                               tmp3 = malloc(len * 4 + 1);
-                               while (len) {
-                                       if (strvisx(tmp3, tmp2, len,
-                                           VIS_CSTYLE|VIS_TAB|VIS_NL) <=
-                                           (int)max_string)
-                                               break;
-                                       len--;
-                                       buf_truncated = true;
-                               }
-                               fprintf(fp, "\"%s\"%s", tmp3,
-                                   buf_truncated ? "..." : "");
-                               free(tmp3);
-                       } else {
-                               fprintf(fp, "0x%p", iov[i].iov_base);
-                       }
-                       fprintf(fp, ",%zu}", iov[i].iov_len);
-               }
-               fprintf(fp, "%s%s", iov_truncated ? ",..." : "", "]");
+               print_sctp_sndrcvinfo(fp, sc->type & OUT, &info);
                break;
        }
-       case Sctpsndrcvinfo: {
-               struct sctp_sndrcvinfo info;
+       case Msghdr: {
+               struct msghdr msghdr;
 
                if (get_struct(pid, (void *)args[sc->offset],
-                   &info, sizeof(struct sctp_sndrcvinfo)) == -1) {
+                   &msghdr, sizeof(struct msghdr)) == -1) {
                        fprintf(fp, "0x%lx", args[sc->offset]);
                        break;
                }
-               fprintf(fp, "{sid=%u,", info.sinfo_stream);
-               if (sc->type & OUT) {
-                       fprintf(fp, "ssn=%u,", info.sinfo_ssn);
-               }
-               fputs("flgs=", fp);
-               sysdecode_sctp_sinfo_flags(fp, info.sinfo_flags);
-               fprintf(fp, ",ppid=%u,", ntohl(info.sinfo_ppid));
-               /* Can't use IN here, since IN is 0 */
-               if ((sc->type & OUT) == 0) {
-                       fprintf(fp, "ctx=%u,", info.sinfo_context);
-                       fprintf(fp, "ttl=%u,", info.sinfo_timetolive);
-               }
-               if (sc->type & OUT) {
-                       fprintf(fp, "tsn=%u,", info.sinfo_tsn);
-                       fprintf(fp, "cumtsn=%u,", info.sinfo_cumtsn);
-               }
-               fprintf(fp, "id=%u}", info.sinfo_assoc_id);
+               fputs("{", fp);
+               print_sockaddr(fp, trussinfo, msghdr.msg_name, 
msghdr.msg_namelen);
+               fprintf(fp, ",%d,", msghdr.msg_namelen);
+               print_iovec(fp, trussinfo, msghdr.msg_iov, msghdr.msg_iovlen);
+               fprintf(fp, ",%d,", msghdr.msg_iovlen);
+               print_cmsgs(fp, pid, sc->type & OUT, &msghdr);
+               fprintf(fp, ",%u,", msghdr.msg_controllen);
+               print_mask_arg(sysdecode_msg_flags, fp, msghdr.msg_flags);
+               fputs("}", fp);
                break;
        }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to