The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/fs/procfs/procfs.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-4-Clause
    3  *
    4  * Copyright (c) 2001 Dag-Erling Smørgrav
    5  * Copyright (c) 1993 Jan-Simon Pendry
    6  * Copyright (c) 1993
    7  *      The Regents of the University of California.  All rights reserved.
    8  *
    9  * This code is derived from software contributed to Berkeley by
   10  * Jan-Simon Pendry.
   11  *
   12  * Redistribution and use in source and binary forms, with or without
   13  * modification, are permitted provided that the following conditions
   14  * are met:
   15  * 1. Redistributions of source code must retain the above copyright
   16  *    notice, this list of conditions and the following disclaimer.
   17  * 2. Redistributions in binary form must reproduce the above copyright
   18  *    notice, this list of conditions and the following disclaimer in the
   19  *    documentation and/or other materials provided with the distribution.
   20  * 3. All advertising materials mentioning features or use of this software
   21  *    must display the following acknowledgement:
   22  *      This product includes software developed by the University of
   23  *      California, Berkeley and its contributors.
   24  * 4. Neither the name of the University nor the names of its contributors
   25  *    may be used to endorse or promote products derived from this software
   26  *    without specific prior written permission.
   27  *
   28  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   29  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   32  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   37  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   38  * SUCH DAMAGE.
   39  *
   40  *      @(#)procfs_vfsops.c     8.7 (Berkeley) 5/10/95
   41  *
   42  * $FreeBSD$
   43  */
   44 
   45 #include <sys/param.h>
   46 #include <sys/queue.h>
   47 #include <sys/exec.h>
   48 #include <sys/lock.h>
   49 #include <sys/kernel.h>
   50 #include <sys/malloc.h>
   51 #include <sys/mount.h>
   52 #include <sys/mutex.h>
   53 #include <sys/proc.h>
   54 #include <sys/sbuf.h>
   55 #include <sys/sysproto.h>
   56 #include <sys/systm.h>
   57 #include <sys/vnode.h>
   58 
   59 #include <vm/vm.h>
   60 #include <vm/pmap.h>
   61 #include <vm/vm_param.h>
   62 
   63 #include <fs/pseudofs/pseudofs.h>
   64 #include <fs/procfs/procfs.h>
   65 
   66 /*
   67  * Filler function for proc/pid/file
   68  */
   69 int
   70 procfs_doprocfile(PFS_FILL_ARGS)
   71 {
   72         char *fullpath, *freepath, *binpath;
   73         int error;
   74 
   75         freepath = NULL;
   76         binpath = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
   77         PROC_LOCK(p);
   78         error = proc_get_binpath(p, binpath, &fullpath, &freepath);
   79         if (error == 0)
   80                 sbuf_cat(sb, fullpath);
   81         free(binpath, M_TEMP);
   82         free(freepath, M_TEMP);
   83         return (error);
   84 }
   85 
   86 /*
   87  * Filler function for proc/curproc
   88  */
   89 int
   90 procfs_docurproc(PFS_FILL_ARGS)
   91 {
   92         sbuf_printf(sb, "%ld", (long)td->td_proc->p_pid);
   93         return (0);
   94 }
   95 
   96 static int
   97 procfs_attr(PFS_ATTR_ARGS, int mode) {
   98         vap->va_mode = mode;
   99         if (p != NULL) {
  100                 PROC_LOCK_ASSERT(p, MA_OWNED);
  101 
  102                 if ((p->p_flag & P_SUGID) && pn->pn_type != pfstype_procdir)
  103                         vap->va_mode = 0;
  104         }
  105 
  106         return (0);
  107 }
  108 
  109 int
  110 procfs_attr_all_rx(PFS_ATTR_ARGS)
  111 {
  112 
  113         return (procfs_attr(td, p, pn, vap, 0555));
  114 }
  115 
  116 int
  117 procfs_attr_rw(PFS_ATTR_ARGS)
  118 {
  119 
  120         return (procfs_attr(td, p, pn, vap, 0600));
  121 }
  122 
  123 int
  124 procfs_attr_w(PFS_ATTR_ARGS)
  125 {
  126 
  127         return (procfs_attr(td, p, pn, vap, 0200));
  128 }
  129 
  130 /*
  131  * Visibility: some files only exist for non-system processes
  132  * Non-static because linprocfs uses it.
  133  */
  134 int
  135 procfs_notsystem(PFS_VIS_ARGS)
  136 {
  137         PROC_LOCK_ASSERT(p, MA_OWNED);
  138         return ((p->p_flag & P_SYSTEM) == 0);
  139 }
  140 
  141 /*
  142  * Visibility: some files are only visible to process that can debug
  143  * the target process.
  144  */
  145 int
  146 procfs_candebug(PFS_VIS_ARGS)
  147 {
  148         PROC_LOCK_ASSERT(p, MA_OWNED);
  149         return ((p->p_flag & P_SYSTEM) == 0 && p_candebug(td, p) == 0);
  150 }
  151 
  152 /*
  153  * Constructor
  154  */
  155 static int
  156 procfs_init(PFS_INIT_ARGS)
  157 {
  158         struct pfs_node *root;
  159         struct pfs_node *dir;
  160 
  161         root = pi->pi_root;
  162 
  163         pfs_create_link(root, "curproc", procfs_docurproc,
  164             NULL, NULL, NULL, 0);
  165 
  166         dir = pfs_create_dir(root, "pid",
  167             procfs_attr_all_rx, NULL, NULL, PFS_PROCDEP);
  168         pfs_create_file(dir, "cmdline", procfs_doproccmdline,
  169             NULL, NULL, NULL, PFS_RD);
  170         pfs_create_file(dir, "dbregs", procfs_doprocdbregs,
  171             procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
  172         pfs_create_file(dir, "etype", procfs_doproctype,
  173             NULL, NULL, NULL, PFS_RD);
  174         pfs_create_file(dir, "fpregs", procfs_doprocfpregs,
  175             procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
  176         pfs_create_file(dir, "map", procfs_doprocmap,
  177             NULL, procfs_notsystem, NULL, PFS_RD);
  178         pfs_create_file(dir, "mem", procfs_doprocmem,
  179             procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
  180         pfs_create_file(dir, "note", procfs_doprocnote,
  181             procfs_attr_w, procfs_candebug, NULL, PFS_WR);
  182         pfs_create_file(dir, "notepg", procfs_doprocnote,
  183             procfs_attr_w, procfs_candebug, NULL, PFS_WR);
  184         pfs_create_file(dir, "regs", procfs_doprocregs,
  185             procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
  186         pfs_create_file(dir, "rlimit", procfs_doprocrlimit,
  187             NULL, NULL, NULL, PFS_RD);
  188         pfs_create_file(dir, "status", procfs_doprocstatus,
  189             NULL, NULL, NULL, PFS_RD);
  190         pfs_create_file(dir, "osrel", procfs_doosrel,
  191             procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR);
  192 
  193         pfs_create_link(dir, "file", procfs_doprocfile,
  194             NULL, procfs_notsystem, NULL, 0);
  195 
  196         return (0);
  197 }
  198 
  199 /*
  200  * Destructor
  201  */
  202 static int
  203 procfs_uninit(PFS_INIT_ARGS)
  204 {
  205         /* nothing to do, pseudofs will GC */
  206         return (0);
  207 }
  208 
  209 PSEUDOFS(procfs, 1, VFCF_JAIL);

Cache object: c65b02ae22a8d40c7ce6aeb2c3478db5


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.