Print this page
XXXX adding PID information to netstat output
@@ -177,10 +177,17 @@
} else {
if (cmd == F_DUPFD_CLOEXEC) {
f_setfd(retval, FD_CLOEXEC);
}
}
+
+ if (error == 0 && fp->f_vnode != NULL) {
+ (void) VOP_IOCTL(fp->f_vnode, F_ASSOCI_PID,
+ (intptr_t)p->p_pidp->pid_id, FKIOCTL, kcred,
+ NULL, NULL);
+ }
+
goto done;
case F_DUP2FD_CLOEXEC:
if (fdes == iarg) {
error = EINVAL;
@@ -213,20 +220,42 @@
*/
mutex_enter(&fp->f_tlock);
fp->f_count++;
mutex_exit(&fp->f_tlock);
releasef(fdes);
+
+ /*
+ * Assume we succeed to duplicate the file descriptor
+ * and associate the pid to the vnode.
+ */
+ if (fp->f_vnode != NULL) {
+ (void) VOP_IOCTL(fp->f_vnode, F_ASSOCI_PID,
+ (intptr_t)p->p_pidp->pid_id, FKIOCTL,
+ kcred, NULL, NULL);
+ }
+
if ((error = closeandsetf(iarg, fp)) == 0) {
if (cmd == F_DUP2FD_CLOEXEC) {
f_setfd(iarg, FD_CLOEXEC);
}
retval = iarg;
} else {
mutex_enter(&fp->f_tlock);
if (fp->f_count > 1) {
fp->f_count--;
mutex_exit(&fp->f_tlock);
+ /*
+ * Failed to duplicate fdes,
+ * disassociate the pid from the vnode.
+ */
+ if (fp->f_vnode != NULL) {
+ (void) VOP_IOCTL(fp->f_vnode,
+ F_DASSOC_PID,
+ (intptr_t)p->p_pidp->pid_id,
+ FKIOCTL, kcred, NULL, NULL);
+ }
+
} else {
mutex_exit(&fp->f_tlock);
(void) closef(fp);
}
}