summaryrefslogtreecommitdiff
path: root/sys/isofs
diff options
context:
space:
mode:
authorDavid Greenman <dg@FreeBSD.org>1995-11-12 10:40:36 +0000
committerDavid Greenman <dg@FreeBSD.org>1995-11-12 10:40:36 +0000
commit6a7f78e8170a23093bfaba38c37259a214f9cbbb (patch)
tree5a878f010d00cf0505cbedd0bf3889dc5ee589e1 /sys/isofs
parenta90694e9ba0fc126d5eae7638001718132798494 (diff)
Notes
Diffstat (limited to 'sys/isofs')
-rw-r--r--sys/isofs/cd9660/cd9660_lookup.c4
-rw-r--r--sys/isofs/cd9660/cd9660_vnops.c57
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 \