typedef enum {
Proot,
Pcurproc,
Pproc,
Pfile,
Pmem,
Pregs,
Pfpregs,
Pdbregs,
Pctl,
Pstatus,
Pnote,
Pnotepg,
Pmap,
Ptype,
Pcmdline,
Prlimit
} pfstype;
struct pfsnode {
struct pfsnode *pfs_next;
struct vnode *pfs_vnode;
pfstype pfs_type;
pid_t pfs_pid;
u_short pfs_mode;
u_long pfs_flags;
u_long pfs_fileno;
struct lock pfs_lock;
};
#define PROCFS_NOTELEN 64
#define PROCFS_CTLLEN 8
#define PROCFS_NAMELEN 8
#ifdef _KERNEL
#define CNEQ(cnp, s, len) \
((cnp)->cn_namelen == (len) && \
(bcmp((s), (cnp)->cn_nameptr, (len)) == 0))
#define PROCFS_FILENO(pid, type) \
(((type) < Pproc) ? \
((type) + 2) : \
((((pid)+1) << 4) + ((int) (type))))
#define CHECKIO(p1, p2) \
((((p1)->p_ucred->cr_uid == (p2)->p_ucred->cr_ruid) && \
((p1)->p_ucred->cr_ruid == (p2)->p_ucred->cr_ruid) && \
((p1)->p_ucred->cr_svuid == (p2)->p_ucred->cr_ruid) && \
((p2)->p_flags & (P_SUGID|P_INEXEC)) == 0) || \
(caps_priv_check((p1)->p_ucred, SYSCAP_NODEBUG_UNPRIV) == 0))
#define VTOPFS(vp) ((struct pfsnode *)(vp)->v_data)
#define PFSTOV(pfs) ((pfs)->pfs_vnode)
typedef struct vfs_namemap vfs_namemap_t;
struct vfs_namemap {
const char *nm_name;
int nm_val;
};
int vfs_getuserstr (struct uio *, char *, int *);
vfs_namemap_t *vfs_findname (vfs_namemap_t *, char *, int);
struct reg;
struct fpreg;
struct dbreg;
void procfs_exit (struct thread *);
int procfs_freevp (struct vnode *);
int procfs_allocvp (struct mount *, struct vnode **, long, pfstype);
struct vnode *procfs_findtextvp (struct proc *);
int procfs_sstep (struct lwp *);
int procfs_read_regs (struct lwp *, struct reg *);
int procfs_write_regs (struct lwp *, struct reg *);
int procfs_read_fpregs (struct lwp *, struct fpreg *);
int procfs_write_fpregs (struct lwp *, struct fpreg *);
int procfs_read_dbregs (struct lwp *, struct dbreg *);
int procfs_write_dbregs (struct lwp *, struct dbreg *);
int procfs_donote (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_doregs (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_dofpregs (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_dodbregs (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_domem (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_doctl (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_dostatus (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_domap (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_dotype (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_docmdline (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_dorlimit (struct proc *, struct lwp *, struct pfsnode *pfsp, struct uio *uio);
int procfs_validfile (struct lwp *);
int procfs_validfpregs (struct lwp *);
int procfs_validregs (struct lwp *);
int procfs_validdbregs (struct lwp *);
int procfs_validmap (struct lwp *);
int procfs_validtype (struct lwp *);
struct proc *pfs_pfind(pid_t);
struct proc *pfs_zpfind(pid_t);
void pfs_pdone(struct proc *);
#define PFS_DEAD 0x80000000
int procfs_root (struct mount *, struct vnode **);
int procfs_rw (struct vop_read_args *);
#endif