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
};