diff options
| -rw-r--r-- | sys/miscfs/procfs/procfs.h | 8 | ||||
| -rw-r--r-- | sys/miscfs/procfs/procfs_ctl.c | 6 | ||||
| -rw-r--r-- | sys/miscfs/procfs/procfs_status.c | 4 | ||||
| -rw-r--r-- | sys/miscfs/procfs/procfs_subr.c | 38 | ||||
| -rw-r--r-- | sys/miscfs/procfs/procfs_vfsops.c | 48 | ||||
| -rw-r--r-- | sys/miscfs/procfs/procfs_vnops.c | 136 |
6 files changed, 172 insertions, 68 deletions
diff --git a/sys/miscfs/procfs/procfs.h b/sys/miscfs/procfs/procfs.h index 710957959dc..2972d8eb962 100644 --- a/sys/miscfs/procfs/procfs.h +++ b/sys/miscfs/procfs/procfs.h @@ -37,7 +37,7 @@ * From: * Id: procfs.h,v 4.1 1993/12/17 10:47:45 jsp Rel * - * $Id: procfs.h,v 1.2 1994/01/05 11:08:07 cgd Exp $ + * $Id: procfs.h,v 1.3 1994/01/09 19:44:03 ws Exp $ */ /* @@ -94,7 +94,7 @@ struct pfsdent { #define UIO_MX sizeof(struct pfsdent) #define PROCFS_FILENO(pid, type) \ (((type) == Proot) ? \ - 2 : \ + ((pid) + 2) : \ ((((pid)+1) << 3) + ((int) (type)))) /* @@ -242,10 +242,10 @@ int procfs_readdir __P(( int *eofflagp, u_int *cookies, int ncookies)); -#define procfs_readlink ((int (*) __P(( \ +int procfs_readlink __P(( \ struct vnode *vp, \ struct uio *uio, \ - struct ucred *cred))) procfs_badop) + struct ucred *cred)); int procfs_abortop __P(( struct nameidata *ndp)); int procfs_inactive __P(( diff --git a/sys/miscfs/procfs/procfs_ctl.c b/sys/miscfs/procfs/procfs_ctl.c index 7455a7e49db..611fae2331c 100644 --- a/sys/miscfs/procfs/procfs_ctl.c +++ b/sys/miscfs/procfs/procfs_ctl.c @@ -37,7 +37,7 @@ * From: * Id: procfs_ctl.c,v 4.1 1993/12/17 10:47:45 jsp Rel * - * $Id: procfs_ctl.c,v 1.2 1994/01/08 10:47:02 cgd Exp $ + * $Id: procfs_ctl.c,v 1.3 1994/01/09 19:44:04 ws Exp $ */ #include <sys/param.h> @@ -190,7 +190,6 @@ procfs_control(curp, p, op) p->p_oppid = 0; p->p_flag &= ~SWTED; /* XXX ? */ - wakeup((caddr_t) curp); /* XXX for CTL_WAIT below ? */ break; @@ -198,7 +197,8 @@ procfs_control(curp, p, op) * Step. Let the target process execute a single instruction. */ case PROCFS_CTL_STEP: - process_sstep(p); + if (error = process_sstep(p)) + return error; break; /* diff --git a/sys/miscfs/procfs/procfs_status.c b/sys/miscfs/procfs/procfs_status.c index 2055a7c2597..927682ceb3f 100644 --- a/sys/miscfs/procfs/procfs_status.c +++ b/sys/miscfs/procfs/procfs_status.c @@ -37,7 +37,7 @@ * From: * Id: procfs_status.c,v 4.1 1993/12/17 10:47:45 jsp Rel * - * $Id: procfs_status.c,v 1.1 1994/01/05 07:51:27 cgd Exp $ + * $Id: procfs_status.c,v 1.2 1994/01/09 19:44:06 ws Exp $ */ #include <sys/param.h> @@ -122,7 +122,7 @@ pfs_dostatus(curp, p, pfs, uio) cr = p->p_ucred; ps += sprintf(ps, " %d %d", cr->cr_uid, cr->cr_gid); - for (i = 0; i < cr->cr_ngroups; i++) + for (i = 1; i < cr->cr_ngroups; i++) ps += sprintf(ps, " %d", cr->cr_groups[i]); ps += sprintf(ps, "\n"); diff --git a/sys/miscfs/procfs/procfs_subr.c b/sys/miscfs/procfs/procfs_subr.c index f5042aefa7a..b37e81da9a3 100644 --- a/sys/miscfs/procfs/procfs_subr.c +++ b/sys/miscfs/procfs/procfs_subr.c @@ -37,7 +37,7 @@ * From: * Id: procfs_subr.c,v 4.1 1993/12/17 10:47:45 jsp Rel * - * $Id: procfs_subr.c,v 1.5 1994/01/05 07:51:29 cgd Exp $ + * $Id: procfs_subr.c,v 1.6 1994/01/09 19:44:07 ws Exp $ */ #include <sys/param.h> @@ -122,55 +122,71 @@ loop: pfs->pfs_next = 0; pfs->pfs_pid = (pid_t) pid; pfs->pfs_type = pfs_type; - pfs->pfs_vnode = *vpp; + pfs->pfs_vnode = vp = *vpp; pfs->pfs_flags = 0; pfs->pfs_fileno = PROCFS_FILENO(pid, pfs_type); switch (pfs_type) { - case Proot: /* /proc = dr-xr-xr-x */ - pfs->pfs_mode = (VREAD|VEXEC) | - (VREAD|VEXEC) >> 3 | - (VREAD|VEXEC) >> 6; + case Proot: + switch ((int)pid) { + case 0: /* /proc = dr-xr-xr-x */ + pfs->pfs_mode = (VREAD|VEXEC) | + (VREAD|VEXEC) >> 3 | + (VREAD|VEXEC) >> 6; + vp->v_type = VDIR; + vp->v_flag = VROOT; + break; + case 1: /* /proc/curdir = lr--r--r-- */ + pfs->pfs_mode = VREAD | + VREAD >> 3 | + VREAD >> 6; + vp->v_type = VLNK; + default: + panic("procfs_allocvp root"); + } break; case Pproc: pfs->pfs_mode = (VREAD|VEXEC) | (VREAD|VEXEC) >> 3 | (VREAD|VEXEC) >> 6; - break; - - case Pfile: - pfs->pfs_mode = (VREAD|VWRITE); + vp->v_type = VDIR; break; case Pmem: pfs->pfs_mode = (VREAD|VWRITE); + vp->v_type = VREG; break; case Pregs: pfs->pfs_mode = (VREAD|VWRITE); + vp->v_type = VREG; break; case Pctl: pfs->pfs_mode = (VWRITE); + vp->v_type = VREG; break; case Pstatus: pfs->pfs_mode = (VREAD) | (VREAD >> 3) | (VREAD >> 6); + vp->v_type = VREG; break; case Pnote: pfs->pfs_mode = (VWRITE); + vp->v_type = VREG; break; case Pnotepg: pfs->pfs_mode = (VWRITE); + vp->v_type = VREG; break; default: - panic("procfs_allocvp"); + panic("procfs_allocvp type"); } /* add to procfs vnode list */ diff --git a/sys/miscfs/procfs/procfs_vfsops.c b/sys/miscfs/procfs/procfs_vfsops.c index f2fe00d0c0b..771ac90e410 100644 --- a/sys/miscfs/procfs/procfs_vfsops.c +++ b/sys/miscfs/procfs/procfs_vfsops.c @@ -37,7 +37,7 @@ * From: * Id: procfs_vfsops.c,v 4.1 1993/12/17 10:47:45 jsp Rel * - * $Id: procfs_vfsops.c,v 1.9 1994/01/05 07:51:31 cgd Exp $ + * $Id: procfs_vfsops.c,v 1.10 1994/01/09 19:44:08 ws Exp $ */ /* @@ -48,6 +48,7 @@ #include <sys/time.h> #include <sys/kernel.h> #include <sys/proc.h> +#include <sys/resourcevar.h> #include <sys/buf.h> #include <sys/syslog.h> #include <sys/mount.h> @@ -133,7 +134,6 @@ procfs_root(mp, vpp) struct mount *mp; struct vnode **vpp; { - struct pfsnode *pfs; struct vnode *vp; int error; @@ -141,10 +141,6 @@ procfs_root(mp, vpp) if (error) return (error); - vp->v_type = VDIR; - vp->v_flag = VROOT; - pfs = VTOPFS(vp); - *vpp = vp; return (0); } @@ -207,21 +203,57 @@ procfs_sync(mp, waitfor) return (0); } +struct pfs_handle { + u_short h_len; + u_short h_align; + pfstype h_pfstype; + pid_t h_pid; + struct timeval h_start; +}; + procfs_fhtovp(mp, fhp, vpp) struct mount *mp; struct fid *fhp; struct vnode **vpp; { + struct pfs_handle *php; + struct proc *p; + + php = (struct pfs_handle *)fhp; + + if (php->h_pfstype != Proot) { + + if (!(p = PFIND(php->h_pid))) + return ESTALE; - return (EINVAL); + if (bcmp(&p->p_stats->p_start,&php->h_start,sizeof(struct timeval))) + return ESTALE; + } + + return procfs_allocvp(mp,vpp,php->h_pid,php->h_pfstype); } procfs_vptofh(vp, fhp) struct vnode *vp; struct fid *fhp; { + struct pfs_handle *php; + struct proc *p; + struct pfsnode *pfs = VTOPFS(vp); + + php = (struct pfs_handle *)fhp; + php->h_len = sizeof(*php); + + php->h_pfstype = pfs->pfs_type; + php->h_pid = pfs->pfs_pid; + + if (pfs->pfs_type != Proot) { + if (!(p = PFIND(pfs->pfs_pid))) + return ENOENT; + php->h_start = p->p_stats->p_start; + } - return EINVAL; + return 0; } procfs_init() diff --git a/sys/miscfs/procfs/procfs_vnops.c b/sys/miscfs/procfs/procfs_vnops.c index 0ec5ba62411..863b381cf65 100644 --- a/sys/miscfs/procfs/procfs_vnops.c +++ b/sys/miscfs/procfs/procfs_vnops.c @@ -37,7 +37,7 @@ * From: * Id: procfs_vnops.c,v 4.2 1994/01/02 15:28:44 jsp Exp * - * $Id: procfs_vnops.c,v 1.11 1994/01/05 21:56:02 cgd Exp $ + * $Id: procfs_vnops.c,v 1.12 1994/01/09 19:44:10 ws Exp $ */ /* @@ -76,6 +76,8 @@ static struct pfsnames { } procent[] = { #define N(s) sizeof(s)-1, s /* namlen, nam, type */ + { N("."), Pproc }, + { N(".."), Proot }, { N("file"), Pfile }, { N("mem"), Pmem }, { N("regs"), Pregs }, @@ -87,6 +89,8 @@ static struct pfsnames { }; #define Nprocent (sizeof(procent)/sizeof(procent[0])) +#define PROCFS_XFILES 3 /* number of other entries, like "curproc" */ + static pid_t atopid __P((const char *, u_int)); /* @@ -297,13 +301,6 @@ procfs_getattr(vp, vap, cred, p) struct proc *procp; int error; - /* first check the process still exists */ - procp = PFIND(pfs->pfs_pid); - if (procp == 0) - return (ENOENT); - - error = 0; - /* start by zeroing out the attributes */ VATTR_NULL(vap); @@ -326,6 +323,19 @@ procfs_getattr(vp, vap, cred, p) microtime(&vap->va_ctime); vap->va_atime = vap->va_mtime = vap->va_ctime; + error = 0; + + if (pfs->pfs_type != Proot) { + /* check the process still exists */ + procp = PFIND(pfs->pfs_pid); + if (procp == 0) + return (ENOENT); + /* most of the time we want these values */ + vap->va_nlink = 1; + vap->va_uid = procp->p_ucred->cr_uid; + vap->va_gid = procp->p_ucred->cr_gid; + } + /* * now do the object specific fields * @@ -338,45 +348,53 @@ procfs_getattr(vp, vap, cred, p) switch (pfs->pfs_type) { case Proot: - vap->va_nlink = 2; - vap->va_uid = 0; - vap->va_gid = 0; + switch ((int)pfs->pfs_pid) { + case 0: /* /proc */ + vap->va_nlink = 2; + vap->va_uid = 0; + vap->va_gid = 0; + vap->va_bytes = vap->va_size + = (maxproc + 1 + PROCFS_XFILES) * UIO_MX; + break; + case 1: /* /proc/curproc */ + vap->va_nlink = 1; + vap->va_uid = 0; + vap->va_gid = 0; + break; + default: + panic("procfs_getattr root"); + } break; case Pproc: vap->va_nlink = 2; - vap->va_uid = procp->p_ucred->cr_uid; - vap->va_gid = procp->p_ucred->cr_gid; - break; - - case Pfile: - error = EOPNOTSUPP; + vap->va_bytes = vap->va_size = Nprocent * UIO_MX; break; case Pmem: - vap->va_nlink = 1; vap->va_bytes = vap->va_size = ctob(procp->p_vmspace->vm_tsize + procp->p_vmspace->vm_dsize + procp->p_vmspace->vm_ssize); - vap->va_uid = procp->p_ucred->cr_uid; - vap->va_gid = procp->p_ucred->cr_gid; break; case Pregs: vap->va_bytes = vap->va_size = sizeof(struct reg); - /* fall through */ - case Pctl: + break; + case Pstatus: + vap->va_bytes = vap->va_size = 256; /* only a maximum */ + break; + + case Pctl: + break; + case Pnote: case Pnotepg: - vap->va_nlink = 1; - vap->va_uid = procp->p_ucred->cr_uid; - vap->va_gid = procp->p_ucred->cr_gid; break; default: - panic("procfs_getattr"); + panic("procfs_getattr type"); } return (error); @@ -508,10 +526,14 @@ procfs_lookup(dvp, ndp, p) if (ndp->ni_isdotdot) return (EIO); - if (NDEQ(ndp, "curproc", 7)) - pid = p->p_pid; - else - pid = atopid(pname, ndp->ni_namelen); + if (NDEQ(ndp, "curproc", 7)) { + if (error = procfs_allocvp(dvp->v_mount, &nvp, 1, Proot)) + return error; + ndp->ni_vp = nvp; + return 0; + } + + pid = atopid(pname, ndp->ni_namelen); if (pid == NO_PID) return (ENOENT); @@ -523,9 +545,6 @@ procfs_lookup(dvp, ndp, p) if (error) return (error); - nvp->v_type = VDIR; - pfs = VTOPFS(nvp); - ndp->ni_vp = nvp; return (0); @@ -566,7 +585,6 @@ procfs_lookup(dvp, ndp, p) if (error) return (error); - nvp->v_type = VREG; pfs = VTOPFS(nvp); } ndp->ni_vp = nvp; @@ -624,8 +642,9 @@ procfs_readdir(vp, uio, cred, eofflagp, cookies, ncookies) * from the procent[] table (top of this file). */ case Pproc: { - while (uio->uio_resid >= UIO_MX) { + while (uio->uio_resid >= UIO_MX && (!cookies || ncookies > 0)) { struct pfsnames *dt; + pid_t pid = pfs->pfs_pid; if (i >= Nprocent) { *eofflagp = 1; @@ -634,7 +653,10 @@ procfs_readdir(vp, uio, cred, eofflagp, cookies, ncookies) dt = &procent[i]; dp->d_reclen = UIO_MX; - dp->d_fileno = PROCFS_FILENO(pfs->pfs_pid, dt->d_pfstype); + + if (dt->d_pfstype == Proot) + pid = 0; + dp->d_fileno = PROCFS_FILENO(pid, dt->d_pfstype); dp->d_namlen = dt->d_namlen; bcopy(dt->d_name, dp->d_name, sizeof(dt->d_name)-1); error = uiomove((caddr_t) dp, UIO_MX, uio); @@ -642,6 +664,10 @@ procfs_readdir(vp, uio, cred, eofflagp, cookies, ncookies) break; count += UIO_MX; i++; + if (cookies) { + *cookies++ = i * UIO_MX; + ncookies--; + } } break; @@ -666,17 +692,23 @@ procfs_readdir(vp, uio, cred, eofflagp, cookies, ncookies) p = (struct proc *) allproc; -#define PROCFS_XFILES 1 /* number of other entries, like "curproc" */ pcnt = PROCFS_XFILES; - while (p && uio->uio_resid >= UIO_MX) { + while (p && uio->uio_resid >= UIO_MX && (!cookies || ncookies > 0)) { bzero((char *) dp, UIO_MX); dp->d_reclen = UIO_MX; switch (i) { - case 0: + case 0: /* `.' */ + case 1: /* `..' */ + dp->d_fileno = PROCFS_FILENO(0, Proot); + bcopy("..",dp->d_name,3); + dp->d_namlen = i + 1; + dp->d_name[i + 1] = 0; + break; + case 2: /* ship out entry for "curproc" */ - dp->d_fileno = PROCFS_FILENO(PID_MAX+1, Pproc); + dp->d_fileno = PROCFS_FILENO(1, Proot); dp->d_namlen = 7; bcopy("curproc", dp->d_name, dp->d_namlen+1); break; @@ -706,6 +738,10 @@ procfs_readdir(vp, uio, cred, eofflagp, cookies, ncookies) break; count += UIO_MX; i++; + if (cookies) { + *cookies++ = i * UIO_MX; + ncookies--; + } } break; @@ -725,6 +761,26 @@ procfs_readdir(vp, uio, cred, eofflagp, cookies, ncookies) } /* + * readlink reads the link of "curproc" + */ +procfs_readlink(vp, uio, cred) + struct vnode *vp; + struct uio *uio; + struct ucred *cred; +{ + struct pfsnode *pfs = VTOPFS(vp); + char buf[16]; /* should be enough */ + int len; + + if (pfs->pfs_fileno != PROCFS_FILENO(1,Proot)) + return EINVAL; + + len = sprintf(buf,"%ld",(long)curproc->p_pid); + + return uiomove(buf, len, uio); +} + +/* * convert decimal ascii to pid_t */ static pid_t |
