| 1 | /* |
| 2 | * Copyright (c) 1993 Jan-Simon Pendry |
| 3 | * Copyright (c) 1993 |
| 4 | * The Regents of the University of California. All rights reserved. |
| 5 | * |
| 6 | * This code is derived from software contributed to Berkeley by |
| 7 | * Jan-Simon Pendry. |
| 8 | * |
| 9 | * Redistribution and use in source and binary forms, with or without |
| 10 | * modification, are permitted provided that the following conditions |
| 11 | * are met: |
| 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * 2. Redistributions in binary form must reproduce the above copyright |
| 15 | * notice, this list of conditions and the following disclaimer in the |
| 16 | * documentation and/or other materials provided with the distribution. |
| 17 | * 3. All advertising materials mentioning features or use of this software |
| 18 | * must display the following acknowledgement: |
| 19 | * This product includes software developed by the University of |
| 20 | * California, Berkeley and its contributors. |
| 21 | * 4. Neither the name of the University nor the names of its contributors |
| 22 | * may be used to endorse or promote products derived from this software |
| 23 | * without specific prior written permission. |
| 24 | * |
| 25 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
| 26 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 27 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 28 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
| 29 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 30 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| 31 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 32 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| 33 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 34 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 35 | * SUCH DAMAGE. |
| 36 | * |
| 37 | * @(#)procfs.h 8.9 (Berkeley) 5/14/95 |
| 38 | * |
| 39 | * From: |
| 40 | * $FreeBSD: src/sys/miscfs/procfs/procfs.h,v 1.32.2.3 2002/01/22 17:22:59 nectar Exp $ |
| 41 | * $DragonFly: src/sys/vfs/procfs/procfs.h,v 1.8 2007/02/19 01:14:24 corecode Exp $ |
| 42 | */ |
| 43 | |
| 44 | /* |
| 45 | * The different types of node in a procfs filesystem |
| 46 | */ |
| 47 | typedef enum { |
| 48 | Proot, /* the filesystem root */ |
| 49 | Pcurproc, /* symbolic link for curproc */ |
| 50 | Pproc, /* a process-specific sub-directory */ |
| 51 | Pfile, /* the executable file */ |
| 52 | Pmem, /* the process's memory image */ |
| 53 | Pregs, /* the process's register set */ |
| 54 | Pfpregs, /* the process's FP register set */ |
| 55 | Pdbregs, /* the process's debug register set */ |
| 56 | Pctl, /* process control */ |
| 57 | Pstatus, /* process status */ |
| 58 | Pnote, /* process notifier */ |
| 59 | Pnotepg, /* process group notifier */ |
| 60 | Pmap, /* memory map */ |
| 61 | Ptype, /* executable type */ |
| 62 | Pcmdline, /* command line */ |
| 63 | Prlimit /* resource limits */ |
| 64 | } pfstype; |
| 65 | |
| 66 | /* |
| 67 | * control data for the proc file system. |
| 68 | */ |
| 69 | struct pfsnode { |
| 70 | struct pfsnode *pfs_next; /* next on list */ |
| 71 | struct vnode *pfs_vnode; /* vnode associated with this pfsnode */ |
| 72 | pfstype pfs_type; /* type of procfs node */ |
| 73 | pid_t pfs_pid; /* associated process */ |
| 74 | u_short pfs_mode; /* mode bits for stat() */ |
| 75 | u_long pfs_flags; /* open flags */ |
| 76 | u_long pfs_fileno; /* unique file id */ |
| 77 | pid_t pfs_lockowner; /* pfs lock owner */ |
| 78 | }; |
| 79 | |
| 80 | #define PROCFS_NOTELEN 64 /* max length of a note (/proc/$pid/note) */ |
| 81 | #define PROCFS_CTLLEN 8 /* max length of a ctl msg (/proc/$pid/ctl */ |
| 82 | #define PROCFS_NAMELEN 8 /* max length of a filename component */ |
| 83 | |
| 84 | /* |
| 85 | * Kernel stuff follows |
| 86 | */ |
| 87 | #ifdef _KERNEL |
| 88 | #define CNEQ(cnp, s, len) \ |
| 89 | ((cnp)->cn_namelen == (len) && \ |
| 90 | (bcmp((s), (cnp)->cn_nameptr, (len)) == 0)) |
| 91 | |
| 92 | #define PROCFS_FILENO(pid, type) \ |
| 93 | (((type) < Pproc) ? \ |
| 94 | ((type) + 2) : \ |
| 95 | ((((pid)+1) << 4) + ((int) (type)))) |
| 96 | |
| 97 | #define CHECKIO(p1, p2) \ |
| 98 | ((((p1)->p_ucred->cr_uid == (p2)->p_ucred->cr_ruid) && \ |
| 99 | ((p1)->p_ucred->cr_ruid == (p2)->p_ucred->cr_ruid) && \ |
| 100 | ((p1)->p_ucred->cr_svuid == (p2)->p_ucred->cr_ruid) && \ |
| 101 | ((p2)->p_flag & (P_SUGID|P_INEXEC)) == 0) || \ |
| 102 | (priv_check_cred((p1)->p_ucred, PRIV_ROOT, PRISON_ROOT) == 0)) |
| 103 | |
| 104 | /* |
| 105 | * Convert between pfsnode vnode |
| 106 | */ |
| 107 | #define VTOPFS(vp) ((struct pfsnode *)(vp)->v_data) |
| 108 | #define PFSTOV(pfs) ((pfs)->pfs_vnode) |
| 109 | |
| 110 | typedef struct vfs_namemap vfs_namemap_t; |
| 111 | struct vfs_namemap { |
| 112 | const char *nm_name; |
| 113 | int nm_val; |
| 114 | }; |
| 115 | |
| 116 | int vfs_getuserstr (struct uio *, char *, int *); |
| 117 | vfs_namemap_t *vfs_findname (vfs_namemap_t *, char *, int); |
| 118 | |
| 119 | /* <machine/reg.h> */ |
| 120 | struct reg; |
| 121 | struct fpreg; |
| 122 | struct dbreg; |
| 123 | |
| 124 | #define PFIND(pid) ((pid) ? pfind(pid) : &proc0) |
| 125 | |
| 126 | void procfs_exit (struct thread *); |
| 127 | int procfs_freevp (struct vnode *); |
| 128 | int procfs_allocvp (struct mount *, struct vnode **, long, pfstype); |
| 129 | struct vnode *procfs_findtextvp (struct proc *); |
| 130 | int procfs_sstep (struct lwp *); |
| 131 | int procfs_read_regs (struct lwp *, struct reg *); |
| 132 | int procfs_write_regs (struct lwp *, struct reg *); |
| 133 | int procfs_read_fpregs (struct lwp *, struct fpreg *); |
| 134 | int procfs_write_fpregs (struct lwp *, struct fpreg *); |
| 135 | int procfs_read_dbregs (struct lwp *, struct dbreg *); |
| 136 | int procfs_write_dbregs (struct lwp *, struct dbreg *); |
| 137 | int procfs_donote (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 138 | int procfs_doregs (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 139 | int procfs_dofpregs (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 140 | int procfs_dodbregs (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 141 | int procfs_domem (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 142 | int procfs_doctl (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 143 | int procfs_dostatus (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 144 | int procfs_domap (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 145 | int procfs_dotype (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 146 | int procfs_docmdline (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 147 | int procfs_dorlimit (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio); |
| 148 | |
| 149 | /* functions to check whether or not files should be displayed */ |
| 150 | int procfs_validfile (struct lwp *); |
| 151 | int procfs_validfpregs (struct lwp *); |
| 152 | int procfs_validregs (struct lwp *); |
| 153 | int procfs_validdbregs (struct lwp *); |
| 154 | int procfs_validmap (struct lwp *); |
| 155 | int procfs_validtype (struct lwp *); |
| 156 | |
| 157 | #define PROCFS_LOCKED 0x01 |
| 158 | #define PROCFS_WANT 0x02 |
| 159 | |
| 160 | int procfs_root (struct mount *, struct vnode **); |
| 161 | int procfs_rw (struct vop_read_args *); |
| 162 | |
| 163 | #endif /* _KERNEL */ |