Print this page
XXXX adding PID information to netstat output
@@ -76,10 +76,11 @@
#include <sys/autoconf.h>
#include <sys/policy.h>
#include <sys/dld.h>
#include <sys/zone.h>
#include <c2/audit.h>
+#include <sys/fcntl.h>
/*
* This define helps improve the readability of streams code while
* still maintaining a very old streams performance enhancement. The
* performance enhancement basically involved having all callers
@@ -141,10 +142,11 @@
static void putback(struct stdata *, queue_t *, mblk_t *, int);
static void strcleanall(struct vnode *);
static int strwsrv(queue_t *);
static int strdocmd(struct stdata *, struct strcmd *, cred_t *);
+static boolean_t is_xti_str(const struct stdata *);
/*
* qinit and module_info structures for stream head read and write queues
*/
struct module_info strm_info = { 0, "strrhead", 0, INFPSZ, STRHIGH, STRLOW };
@@ -395,10 +397,18 @@
stp->sd_maxblk = INFPSZ;
qp->q_ptr = _WR(qp)->q_ptr = stp;
STREAM(qp) = STREAM(_WR(qp)) = stp;
vp->v_stream = stp;
mutex_exit(&vp->v_lock);
+
+ /*
+ * If this is not a system process, then add it to
+ * the list associated with the stream head.
+ */
+ if (!(curproc->p_flag & SSYS) && is_xti_str(stp))
+ sh_insert_pid(stp, curproc->p_pidp->pid_id);
+
if (vp->v_type == VFIFO) {
stp->sd_flag |= OLDNDELAY;
/*
* This means, both for pipes and fifos
* strwrite will send SIGPIPE if the other
@@ -5681,10 +5691,26 @@
}
case FIONBIO:
case FIOASYNC:
return (0); /* handled by the upper layer */
+ case F_ASSOCI_PID:
+ {
+ if (crp != kcred)
+ return (EPERM);
+ if (is_xti_str(stp))
+ sh_insert_pid(stp, (pid_t)arg);
+ return (0);
+ }
+ case F_DASSOC_PID:
+ {
+ if (crp != kcred)
+ return (EPERM);
+ if (is_xti_str(stp))
+ sh_remove_pid(stp, (pid_t)arg);
+ return (0);
+ }
}
}
/*
* Custom free routine used for M_PASSFP messages.
@@ -8633,5 +8659,35 @@
if (bp->b_wptr > bp->b_rptr)
return (B_TRUE);
}
return (B_FALSE);
}
+
+/*
+ * Check whether a stream is an XTI stream or not.
+ */
+static boolean_t
+is_xti_str(const struct stdata *stp)
+{
+ struct devnames *dnp;
+ vnode_t *vn;
+ major_t major;
+ if ((vn = stp->sd_vnode) != NULL && vn->v_type == VCHR &&
+ vn->v_rdev != 0) {
+ major = getmajor(vn->v_rdev);
+ dnp = (major != DDI_MAJOR_T_NONE && major >= 0 &&
+ major < devcnt) ? &devnamesp[major] : NULL;
+ if (dnp != NULL && dnp->dn_name != NULL &&
+ (strcmp(dnp->dn_name, "ip") == 0 ||
+ strcmp(dnp->dn_name, "tcp") == 0 ||
+ strcmp(dnp->dn_name, "udp") == 0 ||
+ strcmp(dnp->dn_name, "icmp") == 0 ||
+ strcmp(dnp->dn_name, "tl") == 0 ||
+ strcmp(dnp->dn_name, "ip6") == 0 ||
+ strcmp(dnp->dn_name, "tcp6") == 0 ||
+ strcmp(dnp->dn_name, "udp6") == 0 ||
+ strcmp(dnp->dn_name, "icmp6") == 0)) {
+ return (B_TRUE);
+ }
+ }
+ return (B_FALSE);
+}