summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorws <ws@NetBSD.org>1994-01-09 19:44:03 +0000
committerws <ws@NetBSD.org>1994-01-09 19:44:03 +0000
commit6202bab2db9783bc584dbffdfd88e0f94dcdd34d (patch)
treefcb41272fbfeaf245c59b4dbc2bcbba4a4474621 /sys
parent8243207be1d49a6f2461067340a20e8195ad3e66 (diff)
Bug fixes and enhancements:
Make NFS serving work (BUT DON'T USE "attach" TO /proc/*/ctl FOR NOW!!!) Make `curproc' a symbolic link Add `.' and `..' entries to the directories. Return better guesses on the size of the files.
Diffstat (limited to 'sys')
-rw-r--r--sys/miscfs/procfs/procfs.h8
-rw-r--r--sys/miscfs/procfs/procfs_ctl.c6
-rw-r--r--sys/miscfs/procfs/procfs_status.c4
-rw-r--r--sys/miscfs/procfs/procfs_subr.c38
-rw-r--r--sys/miscfs/procfs/procfs_vfsops.c48
-rw-r--r--sys/miscfs/procfs/procfs_vnops.c136
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