Print this page
XXXX adding PID information to netstat output

@@ -836,15 +836,18 @@
 
 /*
  * Duplicate all file descriptors across a fork.
  */
 void
-flist_fork(uf_info_t *pfip, uf_info_t *cfip)
+flist_fork(proc_t *pp, proc_t *cp)
 {
         int fd, nfiles;
         uf_entry_t *pufp, *cufp;
 
+        uf_info_t *pfip = P_FINFO(pp);
+        uf_info_t *cfip = P_FINFO(cp);
+
         mutex_init(&cfip->fi_lock, NULL, MUTEX_DEFAULT, NULL);
         cfip->fi_rlist = NULL;
 
         /*
          * We don't need to hold fi_lock because all other lwp's in the

@@ -858,10 +861,17 @@
             fd++, pufp++, cufp++) {
                 cufp->uf_file = pufp->uf_file;
                 cufp->uf_alloc = pufp->uf_alloc;
                 cufp->uf_flag = pufp->uf_flag;
                 cufp->uf_busy = pufp->uf_busy;
+
+                if (cufp->uf_file != NULL && cufp->uf_file->f_vnode != NULL) {
+                        (void) VOP_IOCTL(cufp->uf_file->f_vnode, F_ASSOCI_PID,
+                            (intptr_t)cp->p_pidp->pid_id, FKIOCTL, kcred,
+                            NULL, NULL);
+                }
+
                 if (pufp->uf_file == NULL) {
                         ASSERT(pufp->uf_flag == 0);
                         if (pufp->uf_busy) {
                                 /*
                                  * Grab locks to appease ASSERTs in fd_reserve

@@ -943,10 +953,15 @@
         count = fp->f_count--;
         flag = fp->f_flag;
         offset = fp->f_offset;
 
         vp = fp->f_vnode;
+        if (vp != NULL) {
+                (void) VOP_IOCTL(vp, F_DASSOC_PID,
+                    (intptr_t)(ttoproc(curthread)->p_pidp->pid_id), FKIOCTL,
+                    kcred, NULL, NULL);
+        }
 
         error = VOP_CLOSE(vp, flag, count, offset, fp->f_cred, NULL);
 
         if (count > 1) {
                 mutex_exit(&fp->f_tlock);