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,12 @@
                     nso->so_proto_handle, (sock_upper_handle_t)nso, cr)) != 0) {
                         (void) socket_close(nso, 0, cr);
                         socket_destroy(nso);
                 } else {
                         *nsop = nso;
+                        if (!(curproc->p_flag & SSYS))
+                                sonode_insert_pid(nso, curproc->p_pidp->pid_id);
                 }
         }
 
         SO_UNBLOCK_FALLBACK(so);
         return (error);

@@ -1551,10 +1554,48 @@
         struct sonode *so = (struct sonode *)sock_handle;
 
         VN_RELE(SOTOV(so));
 }
 
+mblk_t *
+so_get_sock_pid_mblk(sock_upper_handle_t sock_handle)
+{
+        ulong_t sz, n;
+        mblk_t *mblk;
+        pid_node_t *pn;
+        pid_t *pids;
+        conn_pid_info_t *cpi;
+        struct sonode *so = (struct sonode *)sock_handle;
+
+        mutex_enter(&so->so_pid_tree_lock);
+
+        n = avl_numnodes(&so->so_pid_tree);
+        sz = sizeof (conn_pid_info_t);
+        sz += (n > 1) ? ((n - 1) * sizeof (pid_t)) : 0;
+        if ((mblk = allocb(sz, BPRI_HI)) == NULL) {
+                mutex_exit(&so->so_pid_tree_lock);
+                return (NULL);
+        }
+        mblk->b_wptr += sz;
+        cpi = (conn_pid_info_t *)mblk->b_datap->db_base;
+
+        cpi->cpi_magic = CONN_PID_INFO_MGC;
+        cpi->cpi_contents = CONN_PID_INFO_SOC;
+        cpi->cpi_pids_cnt = n;
+        cpi->cpi_tot_size = sz;
+        cpi->cpi_pids[0] = 0;
+
+        if (cpi->cpi_pids_cnt > 0) {
+                pids = cpi->cpi_pids;
+                for (pn = avl_first(&so->so_pid_tree); pn != NULL;
+                    pids++, pn = AVL_NEXT(&so->so_pid_tree, pn))
+                        *pids = pn->pn_pid;
+        }
+        mutex_exit(&so->so_pid_tree_lock);
+        return (mblk);
+}
+
 void
 so_zcopy_notify(sock_upper_handle_t sock_handle)
 {
         struct sonode *so = (struct sonode *)sock_handle;
 

@@ -1951,7 +1992,8 @@
         so_set_prop,
         so_txq_full,
         so_signal_oob,
         so_zcopy_notify,
         so_set_error,
-        so_closed
+        so_closed,
+        so_get_sock_pid_mblk
 };