X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/e053a1acc74e14747d6626475e89993495ac1f4f..679a7c6b30cb5961b6ae8204bfd02c0138af681c:/usr/src/sys/miscfs/procfs/procfs_subr.c diff --git a/usr/src/sys/miscfs/procfs/procfs_subr.c b/usr/src/sys/miscfs/procfs/procfs_subr.c index 9505f33ee5..6c4b989692 100644 --- a/usr/src/sys/miscfs/procfs/procfs_subr.c +++ b/usr/src/sys/miscfs/procfs/procfs_subr.c @@ -8,7 +8,7 @@ * * %sccs.include.redist.c% * - * @(#)procfs_subr.c 8.4 (Berkeley) %G% + * @(#)procfs_subr.c 8.5 (Berkeley) %G% * * From: * $Id: procfs_subr.c,v 3.2 1993/12/15 09:40:17 jsp Exp $ @@ -59,18 +59,20 @@ procfs_allocvp(mp, vpp, pid, pfs_type) long pid; pfstype pfs_type; { - int error; struct pfsnode *pfs; + struct vnode *vp; struct pfsnode **pp; + int error; loop: for (pfs = pfshead; pfs != 0; pfs = pfs->pfs_next) { + vp = PFSTOV(pfs); if (pfs->pfs_pid == pid && pfs->pfs_type == pfs_type && - PFSTOV(pfs)->v_mount == mp) { - if (vget(pfs->pfs_vnode, 0)) + vp->v_mount == mp) { + if (vget(vp, 0)) goto loop; - *vpp = pfs->pfs_vnode; + *vpp = vp; return (0); } } @@ -86,18 +88,17 @@ loop: } pfsvplock |= PROCFS_LOCKED; - error = getnewvnode(VT_PROCFS, mp, procfs_vnodeop_p, vpp); - if (error) + if (error = getnewvnode(VT_PROCFS, mp, procfs_vnodeop_p, vpp)) goto out; + vp = *vpp; - MALLOC((*vpp)->v_data, void *, sizeof(struct pfsnode), - M_TEMP, M_WAITOK); + MALLOC(pfs, void *, sizeof(struct pfsnode), M_TEMP, M_WAITOK); + vp->v_data = pfs; - pfs = VTOPFS(*vpp); pfs->pfs_next = 0; pfs->pfs_pid = (pid_t) pid; pfs->pfs_type = pfs_type; - pfs->pfs_vnode = *vpp; + pfs->pfs_vnode = vp; pfs->pfs_flags = 0; pfs->pfs_fileno = PROCFS_FILENO(pid, pfs_type); @@ -106,46 +107,44 @@ loop: pfs->pfs_mode = (VREAD|VEXEC) | (VREAD|VEXEC) >> 3 | (VREAD|VEXEC) >> 6; + vp->v_type = VDIR; + vp->v_flag = VROOT; + break; + + case Pcurproc: /* /proc/curproc = lr--r--r-- */ + pfs->pfs_mode = (VREAD) | + (VREAD >> 3) | + (VREAD >> 6); + vp->v_type = VLNK; break; case Pproc: pfs->pfs_mode = (VREAD|VEXEC) | (VREAD|VEXEC) >> 3 | (VREAD|VEXEC) >> 6; + vp->v_type = VDIR; break; case Pfile: - pfs->pfs_mode = (VREAD|VWRITE); - break; - case Pmem: - pfs->pfs_mode = (VREAD|VWRITE); - break; - case Pregs: - pfs->pfs_mode = (VREAD|VWRITE); - break; - case Pfpregs: pfs->pfs_mode = (VREAD|VWRITE); + vp->v_type = VREG; break; case Pctl: + case Pnote: + case Pnotepg: pfs->pfs_mode = (VWRITE); + vp->v_type = VREG; break; case Pstatus: pfs->pfs_mode = (VREAD) | (VREAD >> 3) | (VREAD >> 6); - break; - - case Pnote: - pfs->pfs_mode = (VWRITE); - break; - - case Pnotepg: - pfs->pfs_mode = (VWRITE); + vp->v_type = VREG; break; default: @@ -257,8 +256,7 @@ vfs_getuserstr(uio, buf, buflenp) return (EMSGSIZE); xlen = uio->uio_resid; - error = uiomove(buf, xlen, uio); - if (error) + if (error = uiomove(buf, xlen, uio)) return (error); /* allow multiple writes without seeks */ @@ -280,6 +278,7 @@ vfs_findname(nm, buf, buflen) char *buf; int buflen; { + for (; nm->nm_name; nm++) if (bcmp(buf, (char *) nm->nm_name, buflen+1) == 0) return (nm);