Print this page


Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/proc/prvnops.c
          +++ new/usr/src/uts/common/fs/proc/prvnops.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
  24      - * Copyright (c) 2018, Joyent, Inc.
       24 + * Copyright 2019 Joyent, Inc.
  25   25   * Copyright (c) 2017 by Delphix. All rights reserved.
  26   26   * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
  27   27   * Copyright 2022 MNX Cloud, Inc.
  28   28   * Copyright 2023 Oxide Computer Company
  29   29   */
  30   30  
  31   31  /*      Copyright (c) 1984,      1986, 1987, 1988, 1989 AT&T    */
  32   32  /*        All Rights Reserved   */
  33   33  
  34   34  #include <sys/types.h>
↓ open down ↓ 129 lines elided ↑ open up ↑
 164  164          { PR_LWPDIR,    24 * sizeof (prdirent_t), sizeof (prdirent_t),
 165  165                  "lwp" },
 166  166          { PR_PRIV,      25 * sizeof (prdirent_t), sizeof (prdirent_t),
 167  167                  "priv" },
 168  168          { PR_PATHDIR,   26 * sizeof (prdirent_t), sizeof (prdirent_t),
 169  169                  "path" },
 170  170          { PR_CTDIR,     27 * sizeof (prdirent_t), sizeof (prdirent_t),
 171  171                  "contracts" },
 172  172          { PR_SECFLAGS,  28 * sizeof (prdirent_t), sizeof (prdirent_t),
 173  173                  "secflags" },
      174 +        { PR_ARGV,      29 * sizeof (prdirent_t), sizeof (prdirent_t),
      175 +                "argv" },
      176 +        { PR_CMDLINE,   30 * sizeof (prdirent_t), sizeof (prdirent_t),
      177 +                "cmdline" },
 174  178  #if defined(__x86)
 175      -        { PR_LDT,       29 * sizeof (prdirent_t), sizeof (prdirent_t),
      179 +        { PR_LDT,       31 * sizeof (prdirent_t), sizeof (prdirent_t),
 176  180                  "ldt" },
 177  181  #endif
 178  182  };
 179  183  
 180  184  #define NPIDDIRFILES    (sizeof (piddir) / sizeof (piddir[0]) - 2)
 181  185  
 182  186  /*
 183  187   * Contents of a /proc/<pid>/lwp/<lwpid> directory.
 184  188   */
 185  189  static prdirent_t lwpiddir[] = {
↓ open down ↓ 400 lines elided ↑ open up ↑
 586  590  /*
 587  591   * Array of read functions, indexed by /proc file type.
 588  592   */
 589  593  static int pr_read_inval(), pr_read_as(), pr_read_status(),
 590  594          pr_read_lstatus(), pr_read_psinfo(), pr_read_lpsinfo(),
 591  595          pr_read_map(), pr_read_rmap(), pr_read_xmap(),
 592  596          pr_read_cred(), pr_read_sigact(), pr_read_auxv(),
 593  597  #if defined(__x86)
 594  598          pr_read_ldt(),
 595  599  #endif
      600 +        pr_read_argv(), pr_read_cmdline(),
 596  601          pr_read_usage(), pr_read_lusage(), pr_read_pagedata(),
 597  602          pr_read_watch(), pr_read_lwpstatus(), pr_read_lwpsinfo(),
 598  603          pr_read_lwpusage(), pr_read_lwpname(),
 599  604          pr_read_xregs(), pr_read_priv(),
 600  605          pr_read_spymaster(), pr_read_secflags(),
 601  606  #if defined(__sparc)
 602  607          pr_read_gwindows(), pr_read_asrs(),
 603  608  #endif
 604  609          pr_read_piddir(), pr_read_pidfile(), pr_read_opagedata(),
 605  610          pr_read_fdinfo();
↓ open down ↓ 10 lines elided ↑ open up ↑
 616  621          pr_read_lpsinfo,        /* /proc/<pid>/lpsinfo                  */
 617  622          pr_read_map,            /* /proc/<pid>/map                      */
 618  623          pr_read_rmap,           /* /proc/<pid>/rmap                     */
 619  624          pr_read_xmap,           /* /proc/<pid>/xmap                     */
 620  625          pr_read_cred,           /* /proc/<pid>/cred                     */
 621  626          pr_read_sigact,         /* /proc/<pid>/sigact                   */
 622  627          pr_read_auxv,           /* /proc/<pid>/auxv                     */
 623  628  #if defined(__x86)
 624  629          pr_read_ldt,            /* /proc/<pid>/ldt                      */
 625  630  #endif
      631 +        pr_read_argv,           /* /proc/<pid>/argv                     */
      632 +        pr_read_cmdline,        /* /proc/<pid>/cmdline                  */
 626  633          pr_read_usage,          /* /proc/<pid>/usage                    */
 627  634          pr_read_lusage,         /* /proc/<pid>/lusage                   */
 628  635          pr_read_pagedata,       /* /proc/<pid>/pagedata                 */
 629  636          pr_read_watch,          /* /proc/<pid>/watch                    */
 630  637          pr_read_inval,          /* /proc/<pid>/cwd                      */
 631  638          pr_read_inval,          /* /proc/<pid>/root                     */
 632  639          pr_read_inval,          /* /proc/<pid>/fd                       */
 633  640          pr_read_inval,          /* /proc/<pid>/fd/nn                    */
 634  641          pr_read_inval,          /* /proc/<pid>/fdinfo                   */
 635  642          pr_read_fdinfo,         /* /proc/<pid>/fdinfo/nn                */
↓ open down ↓ 46 lines elided ↑ open up ↑
 682  689          count -= uiop->uio_offset;
 683  690          if (count > 0 && uiop->uio_offset >= 0) {
 684  691                  error = uiomove((char *)base + uiop->uio_offset,
 685  692                      count, UIO_READ, uiop);
 686  693          }
 687  694  
 688  695          return (error);
 689  696  }
 690  697  
 691  698  static int
      699 +pr_read_cmdline(prnode_t *pnp, uio_t *uiop)
      700 +{
      701 +        char *args;
      702 +        int error;
      703 +        size_t asz = PRMAXARGVLEN, sz;
      704 +
      705 +        /*
      706 +         * Allocate a scratch buffer for collection of the process arguments.
      707 +         */
      708 +        args = kmem_alloc(asz, KM_SLEEP);
      709 +
      710 +        ASSERT(pnp->pr_type == PR_CMDLINE);
      711 +
      712 +        if ((error = prlock(pnp, ZNO)) != 0) {
      713 +                kmem_free(args, asz);
      714 +                return (error);
      715 +        }
      716 +
      717 +        if ((error = prreadcmdline(pnp->pr_common->prc_proc, args, asz,
      718 +            &sz)) != 0) {
      719 +                prunlock(pnp);
      720 +                kmem_free(args, asz);
      721 +                return (error);
      722 +        }
      723 +
      724 +        prunlock(pnp);
      725 +
      726 +        error = pr_uioread(args, sz, uiop);
      727 +
      728 +        kmem_free(args, asz);
      729 +
      730 +        return (error);
      731 +}
      732 +
      733 +static int
      734 +pr_read_argv(prnode_t *pnp, uio_t *uiop)
      735 +{
      736 +        char *args;
      737 +        int error;
      738 +        size_t asz = PRMAXARGVLEN, sz;
      739 +
      740 +        /*
      741 +         * Allocate a scratch buffer for collection of the process arguments.
      742 +         */
      743 +        args = kmem_alloc(asz, KM_SLEEP);
      744 +
      745 +        ASSERT(pnp->pr_type == PR_ARGV);
      746 +
      747 +        if ((error = prlock(pnp, ZNO)) != 0) {
      748 +                kmem_free(args, asz);
      749 +                return (error);
      750 +        }
      751 +
      752 +        if ((error = prreadargv(pnp->pr_common->prc_proc, args, asz,
      753 +            &sz)) != 0) {
      754 +                prunlock(pnp);
      755 +                kmem_free(args, asz);
      756 +                return (error);
      757 +        }
      758 +
      759 +        prunlock(pnp);
      760 +
      761 +        error = pr_uioread(args, sz, uiop);
      762 +
      763 +        kmem_free(args, asz);
      764 +
      765 +        return (error);
      766 +}
      767 +
      768 +static int
 692  769  pr_read_as(prnode_t *pnp, uio_t *uiop)
 693  770  {
 694  771          int error;
 695  772  
 696  773          ASSERT(pnp->pr_type == PR_AS);
 697  774  
 698  775          if ((error = prlock(pnp, ZNO)) == 0) {
 699  776                  proc_t *p = pnp->pr_common->prc_proc;
 700  777                  struct as *as = p->p_as;
 701  778  
↓ open down ↓ 1221 lines elided ↑ open up ↑
1923 2000          pr_read_lpsinfo_32,     /* /proc/<pid>/lpsinfo                  */
1924 2001          pr_read_map_32,         /* /proc/<pid>/map                      */
1925 2002          pr_read_rmap_32,        /* /proc/<pid>/rmap                     */
1926 2003          pr_read_xmap_32,        /* /proc/<pid>/xmap                     */
1927 2004          pr_read_cred,           /* /proc/<pid>/cred                     */
1928 2005          pr_read_sigact_32,      /* /proc/<pid>/sigact                   */
1929 2006          pr_read_auxv_32,        /* /proc/<pid>/auxv                     */
1930 2007  #if defined(__x86)
1931 2008          pr_read_ldt,            /* /proc/<pid>/ldt                      */
1932 2009  #endif
     2010 +        pr_read_argv,           /* /proc/<pid>/argv                     */
     2011 +        pr_read_cmdline,        /* /proc/<pid>/cmdline                  */
1933 2012          pr_read_usage_32,       /* /proc/<pid>/usage                    */
1934 2013          pr_read_lusage_32,      /* /proc/<pid>/lusage                   */
1935 2014          pr_read_pagedata_32,    /* /proc/<pid>/pagedata                 */
1936 2015          pr_read_watch_32,       /* /proc/<pid>/watch                    */
1937 2016          pr_read_inval,          /* /proc/<pid>/cwd                      */
1938 2017          pr_read_inval,          /* /proc/<pid>/root                     */
1939 2018          pr_read_inval,          /* /proc/<pid>/fd                       */
1940 2019          pr_read_inval,          /* /proc/<pid>/fd/nn                    */
1941 2020          pr_read_inval,          /* /proc/<pid>/fdinfo                   */
1942 2021          pr_read_fdinfo,         /* /proc/<pid>/fdinfo/nn                */
↓ open down ↓ 908 lines elided ↑ open up ↑
2851 2930           */
2852 2931          if (curproc->p_model == DATAMODEL_LP64)
2853 2932                  return (pr_read_function[pnp->pr_type](pnp, uiop, cr));
2854 2933          else
2855 2934                  return (pr_read_function_32[pnp->pr_type](pnp, uiop, cr));
2856 2935  #else
2857 2936          return (pr_read_function[pnp->pr_type](pnp, uiop, cr));
2858 2937  #endif
2859 2938  }
2860 2939  
     2940 +/*
     2941 + * We make pr_write_psinfo_fname() somewhat simpler by asserting at compile
     2942 + * time that PRFNSZ has the same definition as MAXCOMLEN.
     2943 + */
     2944 +#if PRFNSZ != MAXCOMLEN
     2945 +#error PRFNSZ/MAXCOMLEN mismatch
     2946 +#endif
     2947 +
     2948 +static int
     2949 +pr_write_psinfo_fname(prnode_t *pnp, uio_t *uiop)
     2950 +{
     2951 +        char fname[PRFNSZ];
     2952 +        int offset = offsetof(psinfo_t, pr_fname), error;
     2953 +
     2954 +#ifdef _SYSCALL32_IMPL
     2955 +        if (curproc->p_model != DATAMODEL_LP64)
     2956 +                offset = offsetof(psinfo32_t, pr_fname);
     2957 +#endif
     2958 +
     2959 +        /*
     2960 +         * If this isn't a write to pr_fname (or if the size doesn't match
     2961 +         * PRFNSZ) return.
     2962 +         */
     2963 +        if (uiop->uio_offset != offset || uiop->uio_resid != PRFNSZ)
     2964 +                return (0);
     2965 +
     2966 +        if ((error = uiomove(fname, PRFNSZ, UIO_WRITE, uiop)) != 0)
     2967 +                return (error);
     2968 +
     2969 +        fname[PRFNSZ - 1] = '\0';
     2970 +
     2971 +        if ((error = prlock(pnp, ZNO)) != 0)
     2972 +                return (error);
     2973 +
     2974 +        bcopy(fname, pnp->pr_common->prc_proc->p_user.u_comm, PRFNSZ);
     2975 +
     2976 +        prunlock(pnp);
     2977 +
     2978 +        return (0);
     2979 +}
     2980 +
     2981 +/*
     2982 + * We make pr_write_psinfo_psargs() somewhat simpler by asserting at compile
     2983 + * time that PRARGSZ has the same definition as PSARGSZ.
     2984 + */
     2985 +#if PRARGSZ != PSARGSZ
     2986 +#error PRARGSZ/PSARGSZ mismatch
     2987 +#endif
     2988 +
     2989 +static int
     2990 +pr_write_psinfo_psargs(prnode_t *pnp, uio_t *uiop)
     2991 +{
     2992 +        char psargs[PRARGSZ];
     2993 +        int offset = offsetof(psinfo_t, pr_psargs), error;
     2994 +
     2995 +#ifdef _SYSCALL32_IMPL
     2996 +        if (curproc->p_model != DATAMODEL_LP64)
     2997 +                offset = offsetof(psinfo32_t, pr_psargs);
     2998 +#endif
     2999 +
     3000 +        /*
     3001 +         * If this isn't a write to pr_psargs (or if the size doesn't match
     3002 +         * PRARGSZ) return.
     3003 +         */
     3004 +        if (uiop->uio_offset != offset || uiop->uio_resid != PRARGSZ)
     3005 +                return (0);
     3006 +
     3007 +        if ((error = uiomove(psargs, PRARGSZ, UIO_WRITE, uiop)) != 0)
     3008 +                return (error);
     3009 +
     3010 +        psargs[PRARGSZ - 1] = '\0';
     3011 +
     3012 +        if ((error = prlock(pnp, ZNO)) != 0)
     3013 +                return (error);
     3014 +
     3015 +        bcopy(psargs, pnp->pr_common->prc_proc->p_user.u_psargs, PRARGSZ);
     3016 +
     3017 +        prunlock(pnp);
     3018 +
     3019 +        return (0);
     3020 +}
     3021 +
     3022 +int
     3023 +pr_write_psinfo(prnode_t *pnp, uio_t *uiop)
     3024 +{
     3025 +        int error;
     3026 +
     3027 +        if ((error = pr_write_psinfo_fname(pnp, uiop)) != 0)
     3028 +                return (error);
     3029 +
     3030 +        if ((error = pr_write_psinfo_psargs(pnp, uiop)) != 0)
     3031 +                return (error);
     3032 +
     3033 +        return (0);
     3034 +}
     3035 +
     3036 +
2861 3037  /* Note we intentionally don't handle partial writes/updates. */
2862 3038  static int
2863 3039  pr_write_lwpname(prnode_t *pnp, uio_t *uiop)
2864 3040  {
2865 3041          kthread_t *t = NULL;
2866 3042          char *lwpname;
2867 3043          int error;
2868 3044  
2869 3045          lwpname = kmem_zalloc(THREAD_NAME_MAX, KM_SLEEP);
2870 3046  
↓ open down ↓ 106 lines elided ↑ open up ↑
2977 3153                  error = prwritectl(vp, uiop, CRED());
2978 3154  #endif
2979 3155                  /*
2980 3156                   * This hack makes sure that the EINTR is passed
2981 3157                   * all the way back to the caller's write() call.
2982 3158                   */
2983 3159                  if (error == EINTR)
2984 3160                          uiop->uio_resid = resid;
2985 3161                  return (error);
2986 3162  
     3163 +        case PR_PSINFO:
     3164 +                return (pr_write_psinfo(pnp, uiop));
     3165 +
2987 3166          case PR_LWPNAME:
2988 3167                  return (pr_write_lwpname(pnp, uiop));
2989 3168  
2990 3169          default:
2991 3170                  return ((vp->v_type == VDIR)? EISDIR : EBADF);
2992 3171          }
2993 3172          /* NOTREACHED */
2994 3173  }
2995 3174  
2996 3175  static int
↓ open down ↓ 309 lines elided ↑ open up ↑
3306 3485                  vap->va_size = sizeof (prsecflags_t);
3307 3486                  break;
3308 3487          case PR_SIGACT:
3309 3488                  nsig = PROC_IS_BRANDED(curproc)? BROP(curproc)->b_nsig : NSIG;
3310 3489                  vap->va_size = (nsig-1) *
3311 3490                      PR_OBJSIZE(struct sigaction32, struct sigaction);
3312 3491                  break;
3313 3492          case PR_AUXV:
3314 3493                  vap->va_size = __KERN_NAUXV_IMPL * PR_OBJSIZE(auxv32_t, auxv_t);
3315 3494                  break;
     3495 +        case PR_ARGV:
     3496 +                if ((p->p_flag & SSYS) || p->p_as == &kas) {
     3497 +                        vap->va_size = PSARGSZ;
     3498 +                } else {
     3499 +                        vap->va_size = PRMAXARGVLEN;
     3500 +                }
     3501 +                break;
3316 3502  #if defined(__x86)
3317 3503          case PR_LDT:
3318 3504                  mutex_exit(&p->p_lock);
3319 3505                  mutex_enter(&p->p_ldtlock);
3320 3506                  vap->va_size = prnldt(p) * sizeof (struct ssd);
3321 3507                  mutex_exit(&p->p_ldtlock);
3322 3508                  mutex_enter(&p->p_lock);
3323 3509                  break;
3324 3510  #endif
3325 3511          case PR_USAGE:
↓ open down ↓ 102 lines elided ↑ open up ↑
3428 3614  #ifdef _LP64
3429 3615                  if (p->p_model == DATAMODEL_LP64)
3430 3616                          vap->va_size = sizeof (asrset_t);
3431 3617                  else
3432 3618  #endif
3433 3619                          vap->va_size = 0;
3434 3620                  break;
3435 3621  #endif
3436 3622          case PR_CTL:
3437 3623          case PR_LWPCTL:
     3624 +        case PR_CMDLINE:
3438 3625          default:
3439 3626                  vap->va_size = 0;
3440 3627                  break;
3441 3628          }
3442 3629  
3443 3630          prunlock(pnp);
3444 3631          vap->va_nblocks = (fsblkcnt64_t)btod(vap->va_size);
3445 3632          return (0);
3446 3633  }
3447 3634  
↓ open down ↓ 34 lines elided ↑ open up ↑
3482 3669                  return (VOP_ACCESS(rvp, mode, flags, cr, ct));
3483 3670  
3484 3671          case PR_PSINFO:         /* these files can be read by anyone */
3485 3672          case PR_LPSINFO:
3486 3673          case PR_LWPSINFO:
3487 3674          case PR_LWPDIR:
3488 3675          case PR_LWPIDDIR:
3489 3676          case PR_USAGE:
3490 3677          case PR_LUSAGE:
3491 3678          case PR_LWPUSAGE:
     3679 +        case PR_ARGV:
     3680 +        case PR_CMDLINE:
3492 3681                  p = pr_p_lock(pnp);
3493 3682                  mutex_exit(&pr_pidlock);
3494 3683                  if (p == NULL)
3495 3684                          return (ENOENT);
3496 3685                  prunlock(pnp);
3497 3686                  break;
3498 3687  
3499 3688          default:
3500 3689                  /*
3501 3690                   * Except for the world-readable files above,
↓ open down ↓ 65 lines elided ↑ open up ↑
3567 3756          pr_lookup_notdir,       /* /proc/<pid>/lpsinfo                  */
3568 3757          pr_lookup_notdir,       /* /proc/<pid>/map                      */
3569 3758          pr_lookup_notdir,       /* /proc/<pid>/rmap                     */
3570 3759          pr_lookup_notdir,       /* /proc/<pid>/xmap                     */
3571 3760          pr_lookup_notdir,       /* /proc/<pid>/cred                     */
3572 3761          pr_lookup_notdir,       /* /proc/<pid>/sigact                   */
3573 3762          pr_lookup_notdir,       /* /proc/<pid>/auxv                     */
3574 3763  #if defined(__x86)
3575 3764          pr_lookup_notdir,       /* /proc/<pid>/ldt                      */
3576 3765  #endif
     3766 +        pr_lookup_notdir,       /* /proc/<pid>/argv                     */
     3767 +        pr_lookup_notdir,       /* /proc/<pid>/cmdline                  */
3577 3768          pr_lookup_notdir,       /* /proc/<pid>/usage                    */
3578 3769          pr_lookup_notdir,       /* /proc/<pid>/lusage                   */
3579 3770          pr_lookup_notdir,       /* /proc/<pid>/pagedata                 */
3580 3771          pr_lookup_notdir,       /* /proc/<pid>/watch                    */
3581 3772          pr_lookup_notdir,       /* /proc/<pid>/cwd                      */
3582 3773          pr_lookup_notdir,       /* /proc/<pid>/root                     */
3583 3774          pr_lookup_fddir,        /* /proc/<pid>/fd                       */
3584 3775          pr_lookup_notdir,       /* /proc/<pid>/fd/nn                    */
3585 3776          pr_lookup_fdinfodir,    /* /proc/<pid>/fdinfo                   */
3586 3777          pr_lookup_notdir,       /* /proc/<pid>/fdinfo/nn                */
↓ open down ↓ 1310 lines elided ↑ open up ↑
4897 5088          case PR_CTL:
4898 5089          case PR_LWPCTL:
4899 5090                  pnp->pr_mode = 0200;    /* write-only by owner only */
4900 5091                  break;
4901 5092  
4902 5093          case PR_PIDFILE:
4903 5094          case PR_LWPIDFILE:
4904 5095                  pnp->pr_mode = 0600;    /* read-write by owner only */
4905 5096                  break;
4906 5097  
     5098 +        case PR_PSINFO:
4907 5099          case PR_LWPNAME:
4908 5100                  pnp->pr_mode = 0644;    /* readable by all + owner can write */
4909 5101                  break;
4910 5102  
4911      -        case PR_PSINFO:
4912 5103          case PR_LPSINFO:
4913 5104          case PR_LWPSINFO:
4914 5105          case PR_USAGE:
4915 5106          case PR_LUSAGE:
4916 5107          case PR_LWPUSAGE:
     5108 +        case PR_ARGV:
     5109 +        case PR_CMDLINE:
4917 5110                  pnp->pr_mode = 0444;    /* read-only by all */
4918 5111                  break;
4919 5112  
4920 5113          default:
4921 5114                  pnp->pr_mode = 0400;    /* read-only by owner only */
4922 5115                  break;
4923 5116          }
4924 5117          vn_exists(vp);
4925 5118          return (pnp);
4926 5119  }
↓ open down ↓ 87 lines elided ↑ open up ↑
5014 5207          pr_readdir_notdir,      /* /proc/<pid>/lpsinfo                  */
5015 5208          pr_readdir_notdir,      /* /proc/<pid>/map                      */
5016 5209          pr_readdir_notdir,      /* /proc/<pid>/rmap                     */
5017 5210          pr_readdir_notdir,      /* /proc/<pid>/xmap                     */
5018 5211          pr_readdir_notdir,      /* /proc/<pid>/cred                     */
5019 5212          pr_readdir_notdir,      /* /proc/<pid>/sigact                   */
5020 5213          pr_readdir_notdir,      /* /proc/<pid>/auxv                     */
5021 5214  #if defined(__x86)
5022 5215          pr_readdir_notdir,      /* /proc/<pid>/ldt                      */
5023 5216  #endif
     5217 +        pr_readdir_notdir,      /* /proc/<pid>/argv                     */
     5218 +        pr_readdir_notdir,      /* /proc/<pid>/cmdline                  */
5024 5219          pr_readdir_notdir,      /* /proc/<pid>/usage                    */
5025 5220          pr_readdir_notdir,      /* /proc/<pid>/lusage                   */
5026 5221          pr_readdir_notdir,      /* /proc/<pid>/pagedata                 */
5027 5222          pr_readdir_notdir,      /* /proc/<pid>/watch                    */
5028 5223          pr_readdir_notdir,      /* /proc/<pid>/cwd                      */
5029 5224          pr_readdir_notdir,      /* /proc/<pid>/root                     */
5030 5225          pr_readdir_fddir,       /* /proc/<pid>/fd                       */
5031 5226          pr_readdir_notdir,      /* /proc/<pid>/fd/nn                    */
5032 5227          pr_readdir_fdinfodir,   /* /proc/<pid>/fdinfo                   */
5033 5228          pr_readdir_notdir,      /* /proc/<pid>/fdinfo/nn                */
↓ open down ↓ 133 lines elided ↑ open up ↑
5167 5362              uiop->uio_resid >= sizeof (prdirent_t) &&
5168 5363              dirp < &piddir[NPIDDIRFILES+2];
5169 5364              uiop->uio_offset = off + sizeof (prdirent_t), dirp++) {
5170 5365                  off = uiop->uio_offset;
5171 5366                  if (zombie) {
5172 5367                          switch (dirp->d_ino) {
5173 5368                          case PR_PIDDIR:
5174 5369                          case PR_PROCDIR:
5175 5370                          case PR_PSINFO:
5176 5371                          case PR_USAGE:
     5372 +                        case PR_ARGV:
     5373 +                        case PR_CMDLINE:
5177 5374                                  break;
5178 5375                          default:
5179 5376                                  continue;
5180 5377                          }
5181 5378                  }
5182 5379                  bcopy(dirp, &dirent, sizeof (prdirent_t));
5183 5380                  if (dirent.d_ino == PR_PROCDIR)
5184 5381                          dirent.d_ino = PRROOTINO;
5185 5382                  else
5186 5383                          dirent.d_ino = pmkino(0, pnp->pr_pcommon->prc_slot,
↓ open down ↓ 1262 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX