Print this page
XXXX adding PID information to netstat output

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/sockfs/socksubr.c
          +++ new/usr/src/uts/common/fs/sockfs/socksubr.c
↓ open down ↓ 105 lines elided ↑ open up ↑
 106  106  static int sockfs_update(kstat_t *, int);
 107  107  static int sockfs_snapshot(kstat_t *, void *, int);
 108  108  extern smod_info_t *sotpi_smod_create(void);
 109  109  
 110  110  extern void sendfile_init();
 111  111  
 112  112  extern void nl7c_init(void);
 113  113  
 114  114  extern int modrootloaded;
 115  115  
 116      -#define ADRSTRLEN (2 * sizeof (void *) + 1)
 117      -/*
 118      - * kernel structure for passing the sockinfo data back up to the user.
 119      - * the strings array allows us to convert AF_UNIX addresses into strings
 120      - * with a common method regardless of which n-bit kernel we're running.
 121      - */
 122      -struct k_sockinfo {
 123      -        struct sockinfo ks_si;
 124      -        char            ks_straddr[3][ADRSTRLEN];
 125      -};
 126      -
 127  116  /*
 128  117   * Translate from a device pathname (e.g. "/dev/tcp") to a vnode.
 129  118   * Returns with the vnode held.
 130  119   */
 131  120  int
 132  121  sogetvp(char *devpath, vnode_t **vpp, int uioflag)
 133  122  {
 134  123          struct snode *csp;
 135  124          vnode_t *vp, *dvp;
 136  125          major_t maj;
↓ open down ↓ 622 lines elided ↑ open up ↑
 759  748                   * the option headers and values are only 4 bytes
 760  749                   * aligned. So its safer to do a bcopy compared to
 761  750                   * assigning fdbuf->fd_fds[i] to fp.
 762  751                   */
 763  752                  bcopy((char *)&fdbuf->fd_fds[i], (char *)&fp, sizeof (fp));
 764  753                  mutex_enter(&fp->f_tlock);
 765  754                  fp->f_count++;
 766  755                  mutex_exit(&fp->f_tlock);
 767  756                  setf(fd, fp);
 768  757                  *rp++ = fd;
      758 +                /* add curproc to the pid list associated with that file */
      759 +                if (fp->f_vnode != NULL)
      760 +                        (void) VOP_IOCTL(fp->f_vnode, F_FORKED,
      761 +                            (intptr_t)curproc, FKIOCTL, kcred, NULL, NULL);
      762 +
 769  763                  if (AU_AUDITING())
 770  764                          audit_fdrecv(fd, fp);
 771  765                  dprint(1, ("fdbuf_extract: [%d] = %d, %p refcnt %d\n",
 772  766                      i, fd, (void *)fp, fp->f_count));
 773  767          }
 774  768          return (0);
 775  769  
 776  770  cleanup:
 777  771          /*
 778  772           * Undo whatever partial work the loop above has done.
↓ open down ↓ 957 lines elided ↑ open up ↑
1736 1730   * Zones:
1737 1731   * Note that nactive is going to be different for each zone.
1738 1732   * This means we require kstat to call sockfs_update and then sockfs_snapshot
1739 1733   * for the same zone, or sockfs_snapshot will be taken into the wrong size
1740 1734   * buffer. This is safe, but if the buffer is too small, user will not be
1741 1735   * given details of all sockets. However, as this kstat has a ks_lock, kstat
1742 1736   * driver will keep it locked between the update and the snapshot, so no
1743 1737   * other process (zone) can currently get inbetween resulting in a wrong size
1744 1738   * buffer allocation.
1745 1739   */
     1740 +
1746 1741  static int
1747 1742  sockfs_update(kstat_t *ksp, int rw)
1748 1743  {
1749      -        uint_t  nactive = 0;            /* # of active AF_UNIX sockets  */
     1744 +        uint_t  n, nactive = 0;         /* # of active AF_UNIX sockets  */
     1745 +        uint_t  tsze, sze;
1750 1746          struct sonode   *so;            /* current sonode on socklist   */
1751 1747          zoneid_t        myzoneid = (zoneid_t)(uintptr_t)ksp->ks_private;
1752 1748  
     1749 +        tsze = sze = 0;
     1750 +
1753 1751          ASSERT((zoneid_t)(uintptr_t)ksp->ks_private == getzoneid());
1754 1752  
1755 1753          if (rw == KSTAT_WRITE) {        /* bounce all writes            */
1756 1754                  return (EACCES);
1757 1755          }
1758 1756  
1759 1757          for (so = socklist.sl_list; so != NULL; so = SOTOTPI(so)->sti_next_so) {
1760 1758                  if (so->so_count != 0 && so->so_zoneid == myzoneid) {
     1759 +
1761 1760                          nactive++;
     1761 +
     1762 +                        mutex_enter(&so->so_pid_list_lock);
     1763 +                        n = list_size(&so->so_pid_list);
     1764 +                        mutex_exit(&so->so_pid_list_lock);
     1765 +
     1766 +                        sze = sizeof (struct sockinfo);
     1767 +                        sze += (n > 1)?((n - 1) * sizeof (conn_pid_node_t)):0;
     1768 +                        tsze += sze;
     1769 +
1762 1770                  }
1763 1771          }
1764 1772          ksp->ks_ndata = nactive;
1765      -        ksp->ks_data_size = nactive * sizeof (struct k_sockinfo);
     1773 +        ksp->ks_data_size = tsze;
1766 1774  
1767 1775          return (0);
1768 1776  }
1769 1777  
1770 1778  static int
1771 1779  sockfs_snapshot(kstat_t *ksp, void *buf, int rw)
1772 1780  {
1773 1781          int                     ns;     /* # of sonodes we've copied    */
1774 1782          struct sonode           *so;    /* current sonode on socklist   */
1775      -        struct k_sockinfo       *pksi;  /* where we put sockinfo data   */
     1783 +        struct sockinfo         *psi;   /* where we put sockinfo data   */
1776 1784          t_uscalar_t             sn_len; /* soa_len                      */
1777 1785          zoneid_t                myzoneid = (zoneid_t)(uintptr_t)ksp->ks_private;
1778 1786          sotpi_info_t            *sti;
1779 1787  
     1788 +        uint_t                          sze;
     1789 +        conn_pid_node_list_hdr_t        *cph;
     1790 +
1780 1791          ASSERT((zoneid_t)(uintptr_t)ksp->ks_private == getzoneid());
1781 1792  
1782 1793          ksp->ks_snaptime = gethrtime();
1783 1794  
1784 1795          if (rw == KSTAT_WRITE) {        /* bounce all writes            */
1785 1796                  return (EACCES);
1786 1797          }
1787 1798  
1788 1799          /*
1789 1800           * for each sonode on the socklist, we massage the important
1790 1801           * info into buf, in k_sockinfo format.
1791 1802           */
1792      -        pksi = (struct k_sockinfo *)buf;
     1803 +        psi = (struct sockinfo *)buf;
1793 1804          ns = 0;
1794 1805          for (so = socklist.sl_list; so != NULL; so = SOTOTPI(so)->sti_next_so) {
1795 1806                  /* only stuff active sonodes and the same zone:         */
1796 1807                  if (so->so_count == 0 || so->so_zoneid != myzoneid) {
1797 1808                          continue;
1798 1809                  }
1799 1810  
     1811 +                /* get the pidnode list associated with this sonode */
     1812 +                cph = so_get_sock_pid_list((sock_upper_handle_t)so);
     1813 +
     1814 +                /* calculate the size of this sockinfo structure */
     1815 +                sze = sizeof (struct sockinfo);
     1816 +                sze += (cph->cph_pn_cnt > 1)?
     1817 +                        ((cph->cph_pn_cnt - 1) * sizeof (conn_pid_node_t)):0;
     1818 +
1800 1819                  /*
1801 1820                   * If the sonode was activated between the update and the
1802      -                 * snapshot, we're done - as this is only a snapshot.
     1821 +                 * snapshot, we're done - as this is only a snapshot. We need
     1822 +                 * to make sure that we have space for this sockinfo.
1803 1823                   */
1804      -                if ((caddr_t)(pksi) >= (caddr_t)buf + ksp->ks_data_size) {
     1824 +                if (((caddr_t)(psi) + sze) >
     1825 +                        ((caddr_t)buf + ksp->ks_data_size)) {
1805 1826                          break;
1806 1827                  }
1807 1828  
1808 1829                  sti = SOTOTPI(so);
1809 1830                  /* copy important info into buf:                        */
1810      -                pksi->ks_si.si_size = sizeof (struct k_sockinfo);
1811      -                pksi->ks_si.si_family = so->so_family;
1812      -                pksi->ks_si.si_type = so->so_type;
1813      -                pksi->ks_si.si_flag = so->so_flag;
1814      -                pksi->ks_si.si_state = so->so_state;
1815      -                pksi->ks_si.si_serv_type = sti->sti_serv_type;
1816      -                pksi->ks_si.si_ux_laddr_sou_magic =
     1831 +                psi->si_size = sze;
     1832 +                psi->si_family = so->so_family;
     1833 +                psi->si_type = so->so_type;
     1834 +                psi->si_flag = so->so_flag;
     1835 +                psi->si_state = so->so_state;
     1836 +                psi->si_serv_type = sti->sti_serv_type;
     1837 +                psi->si_ux_laddr_sou_magic =
1817 1838                      sti->sti_ux_laddr.soua_magic;
1818      -                pksi->ks_si.si_ux_faddr_sou_magic =
     1839 +                psi->si_ux_faddr_sou_magic =
1819 1840                      sti->sti_ux_faddr.soua_magic;
1820      -                pksi->ks_si.si_laddr_soa_len = sti->sti_laddr.soa_len;
1821      -                pksi->ks_si.si_faddr_soa_len = sti->sti_faddr.soa_len;
1822      -                pksi->ks_si.si_szoneid = so->so_zoneid;
1823      -                pksi->ks_si.si_faddr_noxlate = sti->sti_faddr_noxlate;
     1841 +                psi->si_laddr_soa_len = sti->sti_laddr.soa_len;
     1842 +                psi->si_faddr_soa_len = sti->sti_faddr.soa_len;
     1843 +                psi->si_szoneid = so->so_zoneid;
     1844 +                psi->si_faddr_noxlate = sti->sti_faddr_noxlate;
     1845 +
1824 1846  
1825 1847                  mutex_enter(&so->so_lock);
1826 1848  
1827 1849                  if (sti->sti_laddr_sa != NULL) {
1828 1850                          ASSERT(sti->sti_laddr_sa->sa_data != NULL);
1829 1851                          sn_len = sti->sti_laddr_len;
1830 1852                          ASSERT(sn_len <= sizeof (short) +
1831      -                            sizeof (pksi->ks_si.si_laddr_sun_path));
     1853 +                            sizeof (psi->si_laddr_sun_path));
1832 1854  
1833      -                        pksi->ks_si.si_laddr_family =
     1855 +                        psi->si_laddr_family =
1834 1856                              sti->sti_laddr_sa->sa_family;
1835 1857                          if (sn_len != 0) {
1836 1858                                  /* AF_UNIX socket names are NULL terminated */
1837      -                                (void) strncpy(pksi->ks_si.si_laddr_sun_path,
     1859 +                                (void) strncpy(psi->si_laddr_sun_path,
1838 1860                                      sti->sti_laddr_sa->sa_data,
1839      -                                    sizeof (pksi->ks_si.si_laddr_sun_path));
1840      -                                sn_len = strlen(pksi->ks_si.si_laddr_sun_path);
     1861 +                                    sizeof (psi->si_laddr_sun_path));
     1862 +                                sn_len = strlen(psi->si_laddr_sun_path);
1841 1863                          }
1842      -                        pksi->ks_si.si_laddr_sun_path[sn_len] = 0;
     1864 +                        psi->si_laddr_sun_path[sn_len] = 0;
1843 1865                  }
1844 1866  
1845 1867                  if (sti->sti_faddr_sa != NULL) {
1846 1868                          ASSERT(sti->sti_faddr_sa->sa_data != NULL);
1847 1869                          sn_len = sti->sti_faddr_len;
1848 1870                          ASSERT(sn_len <= sizeof (short) +
1849      -                            sizeof (pksi->ks_si.si_faddr_sun_path));
     1871 +                            sizeof (psi->si_faddr_sun_path));
1850 1872  
1851      -                        pksi->ks_si.si_faddr_family =
     1873 +                        psi->si_faddr_family =
1852 1874                              sti->sti_faddr_sa->sa_family;
1853 1875                          if (sn_len != 0) {
1854      -                                (void) strncpy(pksi->ks_si.si_faddr_sun_path,
     1876 +                                (void) strncpy(psi->si_faddr_sun_path,
1855 1877                                      sti->sti_faddr_sa->sa_data,
1856      -                                    sizeof (pksi->ks_si.si_faddr_sun_path));
1857      -                                sn_len = strlen(pksi->ks_si.si_faddr_sun_path);
     1878 +                                    sizeof (psi->si_faddr_sun_path));
     1879 +                                sn_len = strlen(psi->si_faddr_sun_path);
1858 1880                          }
1859      -                        pksi->ks_si.si_faddr_sun_path[sn_len] = 0;
     1881 +                        psi->si_faddr_sun_path[sn_len] = 0;
1860 1882                  }
1861 1883  
1862 1884                  mutex_exit(&so->so_lock);
1863 1885  
1864      -                (void) sprintf(pksi->ks_straddr[0], "%p", (void *)so);
1865      -                (void) sprintf(pksi->ks_straddr[1], "%p",
     1886 +                (void) sprintf(psi->si_son_straddr, "%p", (void *)so);
     1887 +                (void) sprintf(psi->si_lvn_straddr, "%p",
1866 1888                      (void *)sti->sti_ux_laddr.soua_vp);
1867      -                (void) sprintf(pksi->ks_straddr[2], "%p",
     1889 +                (void) sprintf(psi->si_fvn_straddr, "%p",
1868 1890                      (void *)sti->sti_ux_faddr.soua_vp);
1869 1891  
     1892 +                if ((psi->si_pn_cnt = cph->cph_pn_cnt) > 0)
     1893 +                        (void) memcpy(psi->si_pns, cph->cph_cpns,
     1894 +                                psi->si_pn_cnt * sizeof (conn_pid_node_t));
     1895 +
     1896 +                kmem_free(cph, cph->cph_tot_size);
     1897 +
     1898 +                psi = (struct sockinfo *)((char *)psi + psi->si_size);
1870 1899                  ns++;
1871      -                pksi++;
1872 1900          }
1873 1901  
1874 1902          ksp->ks_ndata = ns;
1875 1903          return (0);
1876 1904  }
1877 1905  
1878 1906  ssize_t
1879 1907  soreadfile(file_t *fp, uchar_t *buf, u_offset_t fileoff, int *err, size_t size)
1880 1908  {
1881 1909          struct uio auio;
↓ open down ↓ 68 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX