diff options
| author | David Greenman <dg@FreeBSD.org> | 1995-11-12 10:40:36 +0000 |
|---|---|---|
| committer | David Greenman <dg@FreeBSD.org> | 1995-11-12 10:40:36 +0000 |
| commit | 6a7f78e8170a23093bfaba38c37259a214f9cbbb (patch) | |
| tree | 5a878f010d00cf0505cbedd0bf3889dc5ee589e1 /sys/isofs | |
| parent | a90694e9ba0fc126d5eae7638001718132798494 (diff) | |
Notes
Diffstat (limited to 'sys/isofs')
| -rw-r--r-- | sys/isofs/cd9660/cd9660_lookup.c | 4 | ||||
| -rw-r--r-- | sys/isofs/cd9660/cd9660_vnops.c | 57 |
2 files changed, 56 insertions, 5 deletions
diff --git a/sys/isofs/cd9660/cd9660_lookup.c b/sys/isofs/cd9660/cd9660_lookup.c index 9c359d13403f..22fd911af37a 100644 --- a/sys/isofs/cd9660/cd9660_lookup.c +++ b/sys/isofs/cd9660/cd9660_lookup.c @@ -38,7 +38,7 @@ * from: @(#)ufs_lookup.c 7.33 (Berkeley) 5/19/91 * * @(#)cd9660_lookup.c 8.2 (Berkeley) 1/23/94 - * $Id: cd9660_lookup.c,v 1.7 1995/05/30 08:04:57 rgrimes Exp $ + * $Id: cd9660_lookup.c,v 1.7.4.1 1995/10/26 09:16:53 davidg Exp $ */ #include <sys/param.h> @@ -376,7 +376,7 @@ notfound: if (cnp->cn_flags & MAKEENTRY) cache_enter(vdp, *vpp, cnp); if (nameiop == CREATE || nameiop == RENAME) - return (EJUSTRETURN); + return (EROFS); return (ENOENT); found: diff --git a/sys/isofs/cd9660/cd9660_vnops.c b/sys/isofs/cd9660/cd9660_vnops.c index 3b538a8d0cb5..e4b9b4434013 100644 --- a/sys/isofs/cd9660/cd9660_vnops.c +++ b/sys/isofs/cd9660/cd9660_vnops.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)cd9660_vnops.c 8.3 (Berkeley) 1/23/94 - * $Id: cd9660_vnops.c,v 1.13 1995/03/28 07:46:38 phk Exp $ + * $Id: cd9660_vnops.c,v 1.14 1995/05/30 08:05:05 rgrimes Exp $ */ #include <sys/param.h> @@ -117,6 +117,43 @@ cd9660_mknod(ndp, vap, cred, p) #endif /* + * Setattr call. Only allowed for block and character special devices. + */ +int +cd9660_setattr(ap) + struct vop_setattr_args /* { + struct vnodeop_desc *a_desc; + struct vnode *a_vp; + struct vattr *a_vap; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; +{ + struct vnode *vp = ap->a_vp; + struct vattr *vap = ap->a_vap; + + if (vap->va_flags != VNOVAL || vap->va_uid != (uid_t)VNOVAL || + vap->va_gid != (gid_t)VNOVAL || vap->va_atime.ts_sec != VNOVAL || + vap->va_mtime.ts_sec != VNOVAL || vap->va_mode != (mode_t)VNOVAL) + return (EROFS); + if (vap->va_size != VNOVAL) { + switch (vp->v_type) { + case VDIR: + return (EISDIR); + case VLNK: + case VREG: + return (EROFS); + case VCHR: + case VBLK: + case VSOCK: + case VFIFO: + return (0); + } + } + return (EOPNOTSUPP); +} + +/* * Open called. * * Nothing to do. @@ -167,6 +204,22 @@ cd9660_access(ap) struct proc *a_p; } */ *ap; { + /* + * Disallow write attempts on read-only file systems; + * unless the file is a socket, fifo, or a block or + * character device resident on the file system. + */ + if (ap->a_mode & VWRITE) { + switch (ap->a_vp->v_type) { + case VDIR: + case VLNK: + case VREG: + if (ap->a_vp->v_mount->mnt_flag & MNT_RDONLY) + return (EROFS); + break; + } + } + return (0); } @@ -877,8 +930,6 @@ cd9660_enotsupp() #define cd9660_create \ ((int (*) __P((struct vop_create_args *)))cd9660_enotsupp) #define cd9660_mknod ((int (*) __P((struct vop_mknod_args *)))cd9660_enotsupp) -#define cd9660_setattr \ - ((int (*) __P((struct vop_setattr_args *)))cd9660_enotsupp) #define cd9660_write ((int (*) __P((struct vop_write_args *)))cd9660_enotsupp) #define cd9660_fsync ((int (*) __P((struct vop_fsync_args *)))nullop) #define cd9660_remove \ |
