merge in netbsd changes.
[unix-history] / usr / src / sys / miscfs / procfs / procfs_subr.c
index 9505f33..6c4b989 100644 (file)
@@ -8,7 +8,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %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 $
  *
  * 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;
 {
        long pid;
        pfstype pfs_type;
 {
-       int error;
        struct pfsnode *pfs;
        struct pfsnode *pfs;
+       struct vnode *vp;
        struct pfsnode **pp;
        struct pfsnode **pp;
+       int error;
 
 loop:
        for (pfs = pfshead; pfs != 0; pfs = pfs->pfs_next) {
 
 loop:
        for (pfs = pfshead; pfs != 0; pfs = pfs->pfs_next) {
+               vp = PFSTOV(pfs);
                if (pfs->pfs_pid == pid &&
                    pfs->pfs_type == pfs_type &&
                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;
                                goto loop;
-                       *vpp = pfs->pfs_vnode;
+                       *vpp = vp;
                        return (0);
                }
        }
                        return (0);
                }
        }
@@ -86,18 +88,17 @@ loop:
        }
        pfsvplock |= PROCFS_LOCKED;
 
        }
        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;
                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_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);
 
        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;
                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;
                break;
 
        case Pproc:
                pfs->pfs_mode = (VREAD|VEXEC) |
                                (VREAD|VEXEC) >> 3 |
                                (VREAD|VEXEC) >> 6;
+               vp->v_type = VDIR;
                break;
 
        case Pfile:
                break;
 
        case Pfile:
-               pfs->pfs_mode = (VREAD|VWRITE);
-               break;
-
        case Pmem:
        case Pmem:
-               pfs->pfs_mode = (VREAD|VWRITE);
-               break;
-
        case Pregs:
        case Pregs:
-               pfs->pfs_mode = (VREAD|VWRITE);
-               break;
-
        case Pfpregs:
                pfs->pfs_mode = (VREAD|VWRITE);
        case Pfpregs:
                pfs->pfs_mode = (VREAD|VWRITE);
+               vp->v_type = VREG;
                break;
 
        case Pctl:
                break;
 
        case Pctl:
+       case Pnote:
+       case Pnotepg:
                pfs->pfs_mode = (VWRITE);
                pfs->pfs_mode = (VWRITE);
+               vp->v_type = VREG;
                break;
 
        case Pstatus:
                pfs->pfs_mode = (VREAD) |
                                (VREAD >> 3) |
                                (VREAD >> 6);
                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:
                break;
 
        default:
@@ -257,8 +256,7 @@ vfs_getuserstr(uio, buf, buflenp)
                return (EMSGSIZE);
        xlen = uio->uio_resid;
 
                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 */
                return (error);
 
        /* allow multiple writes without seeks */
@@ -280,6 +278,7 @@ vfs_findname(nm, buf, buflen)
        char *buf;
        int buflen;
 {
        char *buf;
        int buflen;
 {
+
        for (; nm->nm_name; nm++)
                if (bcmp(buf, (char *) nm->nm_name, buflen+1) == 0)
                        return (nm);
        for (; nm->nm_name; nm++)
                if (bcmp(buf, (char *) nm->nm_name, buflen+1) == 0)
                        return (nm);