version 1.29, 1994/10/20 04:26:28 |
version 1.35, 1995/02/03 16:18:46 |
Line 167 kernfs_xread(kt, off, bufp, len) |
|
Line 167 kernfs_xread(kt, off, bufp, len) |
|
} |
} |
|
|
case KTT_AVENRUN: |
case KTT_AVENRUN: |
|
averunnable.fscale = FSCALE; |
sprintf(*bufp, "%ld %ld %ld %ld\n", |
sprintf(*bufp, "%ld %ld %ld %ld\n", |
averunnable.ldavg[0], averunnable.ldavg[1], |
averunnable.ldavg[0], averunnable.ldavg[1], |
averunnable.ldavg[2], averunnable.fscale); |
averunnable.ldavg[2], averunnable.fscale); |
Line 230 kernfs_lookup(ap) |
|
Line 231 kernfs_lookup(ap) |
|
printf("kernfs_lookup(%s)\n", pname); |
printf("kernfs_lookup(%s)\n", pname); |
#endif |
#endif |
|
|
|
*vpp = NULLVP; |
|
|
|
if (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME) |
|
return (EROFS); |
|
|
if (cnp->cn_namelen == 1 && *pname == '.') { |
if (cnp->cn_namelen == 1 && *pname == '.') { |
*vpp = dvp; |
*vpp = dvp; |
VREF(dvp); |
VREF(dvp); |
Line 246 kernfs_lookup(ap) |
|
Line 252 kernfs_lookup(ap) |
|
} |
} |
#endif |
#endif |
|
|
*vpp = NULLVP; |
for (kt = kern_targets, i = 0; i < nkern_targets; kt++, i++) { |
|
|
for (error = ENOENT, kt = kern_targets, i = 0; i < nkern_targets; |
|
kt++, i++) { |
|
if (cnp->cn_namelen == kt->kt_namlen && |
if (cnp->cn_namelen == kt->kt_namlen && |
bcmp(kt->kt_name, pname, cnp->cn_namelen) == 0) { |
bcmp(kt->kt_name, pname, cnp->cn_namelen) == 0) |
error = 0; |
goto found; |
break; |
|
} |
|
} |
} |
|
|
#ifdef KERNFS_DIAGNOSTIC |
#ifdef KERNFS_DIAGNOSTIC |
printf("kernfs_lookup: i = %d, error = %d\n", i, error); |
printf("kernfs_lookup: i = %d, failed", i); |
#endif |
#endif |
|
|
if (error) |
return (cnp->cn_nameiop == LOOKUP ? ENOENT : EROFS); |
return (error); |
|
|
|
|
found: |
if (kt->kt_tag == KTT_DEVICE) { |
if (kt->kt_tag == KTT_DEVICE) { |
dev_t *dp = kt->kt_data; |
dev_t *dp = kt->kt_data; |
loop: |
loop: |
|
|
kernfs_access(ap) |
kernfs_access(ap) |
struct vop_access_args /* { |
struct vop_access_args /* { |
struct vnode *a_vp; |
struct vnode *a_vp; |
int a_mode; |
int a_mode; |
struct ucred *a_cred; |
struct ucred *a_cred; |
struct proc *a_p; |
struct proc *a_p; |
} */ *ap; |
} */ *ap; |
{ |
{ |
struct vnode *vp = ap->a_vp; |
struct vnode *vp = ap->a_vp; |
struct ucred *cred = ap->a_cred; |
|
mode_t amode = ap->a_mode; |
|
mode_t fmode = |
mode_t fmode = |
(vp->v_flag & VROOT) ? DIR_MODE : VTOKERN(vp)->kf_kt->kt_mode; |
(vp->v_flag & VROOT) ? DIR_MODE : VTOKERN(vp)->kf_kt->kt_mode; |
mode_t mask = 0; |
|
gid_t *gp; |
|
int i; |
|
|
|
/* Some files are simply not modifiable. */ |
|
if ((amode & VWRITE) && (fmode & (S_IWUSR|S_IWGRP|S_IWOTH)) == 0) |
|
return (EPERM); |
|
|
|
/* Root can do anything else. */ |
|
if (cred->cr_uid == 0) |
|
return (0); |
|
|
|
/* Check for group 0 (wheel) permissions. */ |
|
for (i = 0, gp = cred->cr_groups; i < cred->cr_ngroups; i++, gp++) |
|
if (*gp == 0) { |
|
if (amode & VEXEC) |
|
mask |= S_IXGRP; |
|
if (amode & VREAD) |
|
mask |= S_IRGRP; |
|
if (amode & VWRITE) |
|
mask |= S_IWGRP; |
|
return ((fmode & mask) == mask ? 0 : EACCES); |
|
} |
|
|
|
/* Otherwise, check everyone else. */ |
return (vaccess(fmode, (uid_t)0, (gid_t)0, ap->a_mode, ap->a_cred)); |
if (amode & VEXEC) |
|
mask |= S_IXOTH; |
|
if (amode & VREAD) |
|
mask |= S_IROTH; |
|
if (amode & VWRITE) |
|
mask |= S_IWOTH; |
|
return ((fmode & mask) == mask ? 0 : EACCES); |
|
} |
} |
|
|
kernfs_getattr(ap) |
kernfs_getattr(ap) |