Print this page
XXXX adding PID information to netstat output

@@ -35,10 +35,11 @@
 #include <sys/cmn_err.h>
 
 #include <sys/stropts.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
+#include <sys/fcntl.h>
 
 #define _SUN_TPI_VERSION        2
 #include <sys/tihdr.h>
 #include <sys/sockio.h>
 #include <sys/kmem_impl.h>

@@ -355,10 +356,11 @@
                     nso->so_proto_handle, (sock_upper_handle_t)nso, cr)) != 0) {
                         (void) socket_close(nso, 0, cr);
                         socket_destroy(nso);
                 } else {
                         *nsop = nso;
+                        sonode_insert_pid(nso, curproc);
                 }
         }
 
         SO_UNBLOCK_FALLBACK(so);
         return (error);

@@ -1538,10 +1540,49 @@
         struct sonode *so = (struct sonode *)sock_handle;
 
         VN_RELE(SOTOV(so));
 }
 
+conn_pid_node_list_hdr_t *
+so_get_sock_pid_list(sock_upper_handle_t sock_handle)
+{
+        int sz, n = 0;
+        pid_node_t                      *pn;
+        conn_pid_node_t                 *cpn;
+        conn_pid_node_list_hdr_t        *cph;
+        struct sonode                   *so = (struct sonode *)sock_handle;
+
+        mutex_enter(&so->so_pid_list_lock);
+
+        n = list_size(&so->so_pid_list);
+        sz = sizeof (conn_pid_node_list_hdr_t);
+        sz += (n > 1)?((n - 1) * sizeof (conn_pid_node_t)):0;
+        cph = kmem_zalloc(sz, KM_SLEEP);
+
+        cph->cph_magic = CONN_PID_NODE_LIST_HDR_MAGIC;
+        cph->cph_contents = CONN_PID_NODE_LIST_HDR_SOC;
+        cph->cph_pn_cnt = n;
+        cph->cph_tot_size = sz;
+        cph->cph_flags = 0;
+        cph->cph_optional1 = 0;
+        cph->cph_optional2 = 0;
+
+        if (cph->cph_pn_cnt > 0) {
+                cpn = cph->cph_cpns;
+                pn = list_head(&so->so_pid_list);
+                while (pn != NULL) {
+                        PIDNODE2CONNPIDNODE(pn, cpn);
+                        pn = list_next(&so->so_pid_list, pn);
+                        cpn++;
+                }
+        }
+
+        mutex_exit(&so->so_pid_list_lock);
+
+        return (cph);
+}
+
 void
 so_zcopy_notify(sock_upper_handle_t sock_handle)
 {
         struct sonode *so = (struct sonode *)sock_handle;
 

@@ -1938,7 +1979,8 @@
         so_set_prop,
         so_txq_full,
         so_signal_oob,
         so_zcopy_notify,
         so_set_error,
-        so_closed
+        so_closed,
+        so_get_sock_pid_list
 };