Print this page
4142 truss should expand connect() arguments

@@ -80,10 +80,12 @@
 #include <sys/tsol/tndb.h>
 #include <sys/rctl.h>
 #include <sys/rctl_impl.h>
 #include <sys/fork.h>
 #include <sys/task.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
 #include "ramdata.h"
 #include "print.h"
 #include "proto.h"
 #include "systable.h"
 

@@ -1784,10 +1786,102 @@
         default:                prt_dec(pri, 0, val);           break;
         }
 }
 
 /*
+ * Print connect() 2nd and 3rd arguments.
+ */
+/*ARGSUSED*/
+void
+prt_sad(private_t *pri, int raw, long addr, long len)
+{
+        /*
+         * A buffer large enough for PATH_MAX size AF_UNIX address, which is
+         * also large enough to store a sockaddr_in or a sockaddr_in6.
+         */
+        long buf[(sizeof (short) + PATH_MAX + sizeof (long) - 1) /
+            sizeof (long)];
+        struct sockaddr *sa = (struct sockaddr *)buf;
+        struct sockaddr_in *sin = (struct sockaddr_in *)buf;
+        struct sockaddr_un *soun = (struct sockaddr_un *)buf;
+        struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)buf;
+        char addrbuf[INET6_ADDRSTRLEN];
+        char scope[8];
+        long rlen = len;
+
+        GROW(20);
+        if (data_model == PR_MODEL_ILP32) {
+                pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
+                    "0x%.8X", (int)addr);
+        } else {
+                pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
+                    "0x%.8lX", addr);
+        }
+
+        if (raw != 0)
+                return;
+
+        if (rlen >= sizeof (buf))       /* protect against ridiculous length */
+                rlen = sizeof (buf) - 1;
+        if (Pread(Proc, buf, rlen, addr) != rlen)
+                return;
+
+        GROW(175);
+
+        switch (sa->sa_family) {
+        case AF_INET6:
+                if (ntohl(sin6->sin6_scope_id) == 0) {
+                    scope[0] = '\0';
+                } else {
+                    sprintf(scope, "%%%u", ntohl(sin6->sin6_scope_id));
+                }
+                pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
+                    " AF_INET6 to = %s%s:%u",
+                    inet_ntop(AF_INET6, &sin6->sin6_addr, addrbuf,
+                    sizeof (addrbuf)),
+                    scope, ntohs(sin6->sin6_port));
+                pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
+                    " source id = 0x%x"
+                    " flow class = 0x%02x flow label = 0x%05x",
+                    ntohl(sin6->__sin6_src_id),
+                    ntohl((sin6->sin6_flowinfo & IPV6_FLOWINFO_TCLASS) >> 20),
+                    ntohl(sin6->sin6_flowinfo & IPV6_FLOWINFO_FLOWLABEL));
+                break;
+        case AF_INET:
+                pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
+                    " AF_INET to = %s:%u",
+                    inet_ntop(AF_INET, &sin->sin_addr, addrbuf,
+                    sizeof (addrbuf)),
+                    ntohs(sin->sin_port));
+                break;
+        case AF_UNIX:
+                len -= sizeof (soun->sun_family);
+                if (len >= 0) {
+                        /* Null terminate */
+                        soun->sun_path[len] = NULL;
+                        pri->sys_leng += sprintf(
+                            pri->sys_string + pri->sys_leng,
+                            " AF_UNIX to = %s", soun->sun_path);
+                }
+                break;
+        }
+
+        /*
+         * print the third argument len
+         */
+        if (data_model == PR_MODEL_ILP32) {
+                pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
+                    ", %d", (int)len);
+        } else {
+                pri->sys_leng += sprintf(pri->sys_string + pri->sys_leng,
+                    ", %ld", len);
+        }
+
+}
+
+
+/*
  * Print accept4() flags argument.
  */
 void
 prt_acf(private_t *pri, int raw, long val)
 {

@@ -2813,10 +2907,11 @@
         prt_mif,        /* MIF -- print meminfo() arguments */
         prt_pfm,        /* PFM -- print so_socket() proto-family (1st) arg */
         prt_skt,        /* SKT -- print so_socket() socket-type (2nd) arg */
         prt_skp,        /* SKP -- print so_socket() protocol (3rd) arg */
         prt_skv,        /* SKV -- print socket version arg */
+        prt_sad,        /* SAD -- print connect 2nd and 3rd arguments */
         prt_sol,        /* SOL -- print [sg]etsockopt() level (2nd) arg */
         prt_son,        /* SON -- print [sg]etsockopt() opt-name (3rd) arg */
         prt_utt,        /* UTT -- print utrap type */
         prt_uth,        /* UTH -- print utrap handler */
         prt_acc,        /* ACC -- print access() flags */