version 1.13, 2005/06/23 17:00:30 |
version 1.13.2.1, 2006/06/21 15:09:23 |
Line 52 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 52 __KERNEL_RCSID(0, "$NetBSD$"); |
|
#include <sys/vnode.h> |
#include <sys/vnode.h> |
#include <sys/malloc.h> |
#include <sys/malloc.h> |
#include <sys/dirent.h> |
#include <sys/dirent.h> |
|
#include <sys/kauth.h> |
|
|
#include <miscfs/fifofs/fifo.h> |
#include <miscfs/fifofs/fifo.h> |
#include <miscfs/genfs/genfs.h> |
#include <miscfs/genfs/genfs.h> |
Line 80 struct isoreaddir { |
|
Line 81 struct isoreaddir { |
|
int ncookies; |
int ncookies; |
}; |
}; |
|
|
int iso_uiodir __P((struct isoreaddir *, struct dirent *, off_t)); |
int iso_uiodir(struct isoreaddir *, struct dirent *, off_t); |
int iso_shipdir __P((struct isoreaddir *)); |
int iso_shipdir(struct isoreaddir *); |
|
|
#if 0 |
#if 0 |
/* |
/* |
Line 91 int iso_shipdir __P((struct isoreaddir * |
|
Line 92 int iso_shipdir __P((struct isoreaddir * |
|
int |
int |
cd9660_mknod(ndp, vap, cred, p) |
cd9660_mknod(ndp, vap, cred, p) |
struct nameidata *ndp; |
struct nameidata *ndp; |
struct ucred *cred; |
kauth_cred_t cred; |
struct vattr *vap; |
struct vattr *vap; |
struct proc *p; |
struct proc *p; |
{ |
{ |
Line 152 cd9660_access(v) |
|
Line 153 cd9660_access(v) |
|
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; |
kauth_cred_t a_cred; |
struct proc *a_p; |
struct lwp *a_l; |
} */ *ap = v; |
} */ *ap = v; |
struct vnode *vp = ap->a_vp; |
struct vnode *vp = ap->a_vp; |
struct iso_node *ip = VTOI(vp); |
struct iso_node *ip = VTOI(vp); |
Line 185 cd9660_getattr(v) |
|
Line 186 cd9660_getattr(v) |
|
struct vop_getattr_args /* { |
struct vop_getattr_args /* { |
struct vnode *a_vp; |
struct vnode *a_vp; |
struct vattr *a_vap; |
struct vattr *a_vap; |
struct ucred *a_cred; |
kauth_cred_t a_cred; |
struct proc *a_p; |
struct lwp *a_l; |
} */ *ap = v; |
} */ *ap = v; |
struct vnode *vp = ap->a_vp; |
struct vnode *vp = ap->a_vp; |
struct iso_node *ip = VTOI(vp); |
struct iso_node *ip = VTOI(vp); |
Line 218 cd9660_getattr(v) |
|
Line 219 cd9660_getattr(v) |
|
auio.uio_iovcnt = 1; |
auio.uio_iovcnt = 1; |
auio.uio_offset = 0; |
auio.uio_offset = 0; |
auio.uio_rw = UIO_READ; |
auio.uio_rw = UIO_READ; |
auio.uio_segflg = UIO_SYSSPACE; |
|
auio.uio_procp = NULL; |
|
auio.uio_resid = MAXPATHLEN; |
auio.uio_resid = MAXPATHLEN; |
|
UIO_SETUP_SYSSPACE(&auio); |
rdlnk.a_uio = &auio; |
rdlnk.a_uio = &auio; |
rdlnk.a_vp = ap->a_vp; |
rdlnk.a_vp = ap->a_vp; |
rdlnk.a_cred = ap->a_cred; |
rdlnk.a_cred = ap->a_cred; |
|
|
struct vnode *a_vp; |
struct vnode *a_vp; |
struct uio *a_uio; |
struct uio *a_uio; |
int a_ioflag; |
int a_ioflag; |
struct ucred *a_cred; |
kauth_cred_t a_cred; |
} */ *ap = v; |
} */ *ap = v; |
struct vnode *vp = ap->a_vp; |
struct vnode *vp = ap->a_vp; |
struct uio *uio = ap->a_uio; |
struct uio *uio = ap->a_uio; |
|
|
imp = ip->i_mnt; |
imp = ip->i_mnt; |
|
|
if (vp->v_type == VREG) { |
if (vp->v_type == VREG) { |
|
const int advice = IO_ADV_DECODE(ap->a_ioflag); |
error = 0; |
error = 0; |
|
|
while (uio->uio_resid > 0) { |
while (uio->uio_resid > 0) { |
void *win; |
void *win; |
int flags; |
int flags; |
|
|
if (bytelen == 0) |
if (bytelen == 0) |
break; |
break; |
win = ubc_alloc(&vp->v_uobj, uio->uio_offset, |
win = ubc_alloc(&vp->v_uobj, uio->uio_offset, |
&bytelen, UBC_READ); |
&bytelen, advice, UBC_READ); |
error = uiomove(win, bytelen, uio); |
error = uiomove(win, bytelen, uio); |
flags = UBC_WANT_UNMAP(vp) ? UBC_UNMAP : 0; |
flags = UBC_WANT_UNMAP(vp) ? UBC_UNMAP : 0; |
ubc_release(win, flags); |
ubc_release(win, flags); |
Line 330 iso_uiodir(idp, dp, off) |
|
Line 332 iso_uiodir(idp, dp, off) |
|
int error; |
int error; |
|
|
dp->d_name[dp->d_namlen] = 0; |
dp->d_name[dp->d_namlen] = 0; |
dp->d_reclen = DIRENT_SIZE(dp); |
dp->d_reclen = _DIRENT_SIZE(dp); |
|
|
if (idp->uio->uio_resid < dp->d_reclen) { |
if (idp->uio->uio_resid < dp->d_reclen) { |
idp->eofflag = 0; |
idp->eofflag = 0; |
Line 396 iso_shipdir(idp) |
|
Line 398 iso_shipdir(idp) |
|
} |
} |
} |
} |
} |
} |
idp->current.d_reclen = DIRENT_SIZE(&idp->current); |
idp->current.d_reclen = _DIRENT_SIZE(&idp->current); |
if (assoc) { |
if (assoc) { |
idp->assocoff = idp->curroff; |
idp->assocoff = idp->curroff; |
memcpy(&idp->assocent, &idp->current, idp->current.d_reclen); |
memcpy(&idp->assocent, &idp->current, idp->current.d_reclen); |
Line 417 cd9660_readdir(v) |
|
Line 419 cd9660_readdir(v) |
|
struct vop_readdir_args /* { |
struct vop_readdir_args /* { |
struct vnode *a_vp; |
struct vnode *a_vp; |
struct uio *a_uio; |
struct uio *a_uio; |
struct ucred *a_cred; |
kauth_cred_t a_cred; |
int *a_eofflag; |
int *a_eofflag; |
off_t **a_cookies; |
off_t **a_cookies; |
int *a_ncookies; |
int *a_ncookies; |
Line 466 cd9660_readdir(v) |
|
Line 468 cd9660_readdir(v) |
|
idp->curroff = uio->uio_offset; |
idp->curroff = uio->uio_offset; |
|
|
if ((entryoffsetinblock = idp->curroff & bmask) && |
if ((entryoffsetinblock = idp->curroff & bmask) && |
(error = VOP_BLKATOFF(vdp, (off_t)idp->curroff, NULL, &bp))) { |
(error = cd9660_blkatoff(vdp, (off_t)idp->curroff, NULL, &bp))) { |
FREE(idp, M_TEMP); |
FREE(idp, M_TEMP); |
return (error); |
return (error); |
} |
} |
Line 481 cd9660_readdir(v) |
|
Line 483 cd9660_readdir(v) |
|
if ((idp->curroff & bmask) == 0) { |
if ((idp->curroff & bmask) == 0) { |
if (bp != NULL) |
if (bp != NULL) |
brelse(bp); |
brelse(bp); |
error = VOP_BLKATOFF(vdp, (off_t)idp->curroff, |
error = cd9660_blkatoff(vdp, (off_t)idp->curroff, |
NULL, &bp); |
NULL, &bp); |
if (error) |
if (error) |
break; |
break; |
Line 490 cd9660_readdir(v) |
|
Line 492 cd9660_readdir(v) |
|
/* |
/* |
* Get pointer to next entry. |
* Get pointer to next entry. |
*/ |
*/ |
|
KASSERT(bp != NULL); |
ep = (struct iso_directory_record *) |
ep = (struct iso_directory_record *) |
((char *)bp->b_data + entryoffsetinblock); |
((char *)bp->b_data + entryoffsetinblock); |
|
|
Line 621 cd9660_readlink(v) |
|
Line 624 cd9660_readlink(v) |
|
struct vop_readlink_args /* { |
struct vop_readlink_args /* { |
struct vnode *a_vp; |
struct vnode *a_vp; |
struct uio *a_uio; |
struct uio *a_uio; |
struct ucred *a_cred; |
kauth_cred_t a_cred; |
} */ *ap = v; |
} */ *ap = v; |
ISONODE *ip; |
ISONODE *ip; |
ISODIR *dirp; |
ISODIR *dirp; |
Line 631 cd9660_readlink(v) |
|
Line 634 cd9660_readlink(v) |
|
u_short symlen; |
u_short symlen; |
int error; |
int error; |
char *symname; |
char *symname; |
|
boolean_t use_pnbuf; |
|
|
ip = VTOI(ap->a_vp); |
ip = VTOI(ap->a_vp); |
imp = ip->i_mnt; |
imp = ip->i_mnt; |
Line 670 cd9660_readlink(v) |
|
Line 674 cd9660_readlink(v) |
|
* Now get a buffer |
* Now get a buffer |
* Abuse a namei buffer for now. |
* Abuse a namei buffer for now. |
*/ |
*/ |
if (uio->uio_segflg == UIO_SYSSPACE && |
use_pnbuf = !VMSPACE_IS_KERNEL_P(uio->uio_vmspace) || |
uio->uio_iov->iov_len >= MAXPATHLEN) |
uio->uio_iov->iov_len < MAXPATHLEN; |
symname = uio->uio_iov->iov_base; |
if (use_pnbuf) { |
else |
|
symname = PNBUF_GET(); |
symname = PNBUF_GET(); |
|
} else { |
|
symname = uio->uio_iov->iov_base; |
|
} |
|
|
/* |
/* |
* Ok, we just gathering a symbolic name in SL record. |
* Ok, we just gathering a symbolic name in SL record. |
*/ |
*/ |
if (cd9660_rrip_getsymname(dirp, symname, &symlen, imp) == 0) { |
if (cd9660_rrip_getsymname(dirp, symname, &symlen, imp) == 0) { |
if (uio->uio_segflg != UIO_SYSSPACE || |
if (use_pnbuf) { |
uio->uio_iov->iov_len < MAXPATHLEN) |
|
PNBUF_PUT(symname); |
PNBUF_PUT(symname); |
|
} |
brelse(bp); |
brelse(bp); |
return (EINVAL); |
return (EINVAL); |
} |
} |
Line 694 cd9660_readlink(v) |
|
Line 700 cd9660_readlink(v) |
|
/* |
/* |
* return with the symbolic name to caller's. |
* return with the symbolic name to caller's. |
*/ |
*/ |
if (uio->uio_segflg != UIO_SYSSPACE || |
if (use_pnbuf) { |
uio->uio_iov->iov_len < MAXPATHLEN) { |
|
error = uiomove(symname, symlen, uio); |
error = uiomove(symname, symlen, uio); |
PNBUF_PUT(symname); |
PNBUF_PUT(symname); |
return (error); |
return (error); |
Line 847 cd9660_setattr(v) |
|
Line 852 cd9660_setattr(v) |
|
struct vnodeop_desc *a_desc; |
struct vnodeop_desc *a_desc; |
struct vnode *a_vp; |
struct vnode *a_vp; |
struct vattr *a_vap; |
struct vattr *a_vap; |
struct ucred *a_cred; |
kauth_cred_t a_cred; |
struct proc *a_p; |
struct proc *a_p; |
} */ *ap = v; |
} */ *ap = v; |
struct vattr *vap = ap->a_vap; |
struct vattr *vap = ap->a_vap; |
Line 875 cd9660_setattr(v) |
|
Line 880 cd9660_setattr(v) |
|
if (vap->va_size != VNOVAL |
if (vap->va_size != VNOVAL |
&& vp->v_type != VCHR |
&& vp->v_type != VCHR |
&& vp->v_type != VBLK |
&& vp->v_type != VBLK |
&& vp->v_type != VFIFO |
&& vp->v_type != VFIFO) |
) |
|
return EOPNOTSUPP; |
return EOPNOTSUPP; |
|
|
return VOP_TRUNCATE(vp, vap->va_size, 0, ap->a_cred, ap->a_p); |
return 0; |
} |
} |
|
|
/* |
/* |
Line 895 cd9660_setattr(v) |
|
Line 899 cd9660_setattr(v) |
|
#define cd9660_mkdir genfs_eopnotsupp |
#define cd9660_mkdir genfs_eopnotsupp |
#define cd9660_rmdir genfs_eopnotsupp |
#define cd9660_rmdir genfs_eopnotsupp |
#define cd9660_advlock genfs_einval |
#define cd9660_advlock genfs_einval |
#define cd9660_valloc genfs_eopnotsupp |
|
#define cd9660_vfree genfs_nullop |
|
#define cd9660_truncate genfs_eopnotsupp |
|
#define cd9660_update genfs_nullop |
|
#define cd9660_bwrite genfs_eopnotsupp |
#define cd9660_bwrite genfs_eopnotsupp |
#define cd9660_revoke genfs_revoke |
#define cd9660_revoke genfs_revoke |
|
|
/* |
/* |
* Global vfs data structures for cd9660 |
* Global vfs data structures for cd9660 |
*/ |
*/ |
int (**cd9660_vnodeop_p) __P((void *)); |
int (**cd9660_vnodeop_p)(void *); |
const struct vnodeopv_entry_desc cd9660_vnodeop_entries[] = { |
const struct vnodeopv_entry_desc cd9660_vnodeop_entries[] = { |
{ &vop_default_desc, vn_default_error }, |
{ &vop_default_desc, vn_default_error }, |
{ &vop_lookup_desc, cd9660_lookup }, /* lookup */ |
{ &vop_lookup_desc, cd9660_lookup }, /* lookup */ |
Line 945 const struct vnodeopv_entry_desc cd9660_ |
|
Line 945 const struct vnodeopv_entry_desc cd9660_ |
|
{ &vop_islocked_desc, genfs_islocked }, /* islocked */ |
{ &vop_islocked_desc, genfs_islocked }, /* islocked */ |
{ &vop_pathconf_desc, cd9660_pathconf }, /* pathconf */ |
{ &vop_pathconf_desc, cd9660_pathconf }, /* pathconf */ |
{ &vop_advlock_desc, cd9660_advlock }, /* advlock */ |
{ &vop_advlock_desc, cd9660_advlock }, /* advlock */ |
{ &vop_blkatoff_desc, cd9660_blkatoff }, /* blkatoff */ |
|
{ &vop_valloc_desc, cd9660_valloc }, /* valloc */ |
|
{ &vop_vfree_desc, cd9660_vfree }, /* vfree */ |
|
{ &vop_truncate_desc, cd9660_truncate }, /* truncate */ |
|
{ &vop_update_desc, cd9660_update }, /* update */ |
|
{ &vop_bwrite_desc, vn_bwrite }, /* bwrite */ |
{ &vop_bwrite_desc, vn_bwrite }, /* bwrite */ |
{ &vop_getpages_desc, genfs_getpages }, /* getpages */ |
{ &vop_getpages_desc, genfs_getpages }, /* getpages */ |
{ &vop_putpages_desc, genfs_putpages }, /* putpages */ |
{ &vop_putpages_desc, genfs_putpages }, /* putpages */ |
Line 961 const struct vnodeopv_desc cd9660_vnodeo |
|
Line 956 const struct vnodeopv_desc cd9660_vnodeo |
|
/* |
/* |
* Special device vnode ops |
* Special device vnode ops |
*/ |
*/ |
int (**cd9660_specop_p) __P((void *)); |
int (**cd9660_specop_p)(void *); |
const struct vnodeopv_entry_desc cd9660_specop_entries[] = { |
const struct vnodeopv_entry_desc cd9660_specop_entries[] = { |
{ &vop_default_desc, vn_default_error }, |
{ &vop_default_desc, vn_default_error }, |
{ &vop_lookup_desc, spec_lookup }, /* lookup */ |
{ &vop_lookup_desc, spec_lookup }, /* lookup */ |
Line 1002 const struct vnodeopv_entry_desc cd9660_ |
|
Line 997 const struct vnodeopv_entry_desc cd9660_ |
|
{ &vop_islocked_desc, genfs_islocked }, /* islocked */ |
{ &vop_islocked_desc, genfs_islocked }, /* islocked */ |
{ &vop_pathconf_desc, spec_pathconf }, /* pathconf */ |
{ &vop_pathconf_desc, spec_pathconf }, /* pathconf */ |
{ &vop_advlock_desc, spec_advlock }, /* advlock */ |
{ &vop_advlock_desc, spec_advlock }, /* advlock */ |
{ &vop_blkatoff_desc, spec_blkatoff }, /* blkatoff */ |
|
{ &vop_valloc_desc, spec_valloc }, /* valloc */ |
|
{ &vop_vfree_desc, spec_vfree }, /* vfree */ |
|
{ &vop_truncate_desc, spec_truncate }, /* truncate */ |
|
{ &vop_update_desc, cd9660_update }, /* update */ |
|
{ &vop_bwrite_desc, vn_bwrite }, /* bwrite */ |
{ &vop_bwrite_desc, vn_bwrite }, /* bwrite */ |
{ &vop_getpages_desc, spec_getpages }, /* getpages */ |
{ &vop_getpages_desc, spec_getpages }, /* getpages */ |
{ &vop_putpages_desc, spec_putpages }, /* putpages */ |
{ &vop_putpages_desc, spec_putpages }, /* putpages */ |
Line 1015 const struct vnodeopv_entry_desc cd9660_ |
|
Line 1005 const struct vnodeopv_entry_desc cd9660_ |
|
const struct vnodeopv_desc cd9660_specop_opv_desc = |
const struct vnodeopv_desc cd9660_specop_opv_desc = |
{ &cd9660_specop_p, cd9660_specop_entries }; |
{ &cd9660_specop_p, cd9660_specop_entries }; |
|
|
int (**cd9660_fifoop_p) __P((void *)); |
int (**cd9660_fifoop_p)(void *); |
const struct vnodeopv_entry_desc cd9660_fifoop_entries[] = { |
const struct vnodeopv_entry_desc cd9660_fifoop_entries[] = { |
{ &vop_default_desc, vn_default_error }, |
{ &vop_default_desc, vn_default_error }, |
{ &vop_lookup_desc, fifo_lookup }, /* lookup */ |
{ &vop_lookup_desc, fifo_lookup }, /* lookup */ |
Line 1056 const struct vnodeopv_entry_desc cd9660_ |
|
Line 1046 const struct vnodeopv_entry_desc cd9660_ |
|
{ &vop_islocked_desc, genfs_islocked }, /* islocked */ |
{ &vop_islocked_desc, genfs_islocked }, /* islocked */ |
{ &vop_pathconf_desc, fifo_pathconf }, /* pathconf */ |
{ &vop_pathconf_desc, fifo_pathconf }, /* pathconf */ |
{ &vop_advlock_desc, fifo_advlock }, /* advlock */ |
{ &vop_advlock_desc, fifo_advlock }, /* advlock */ |
{ &vop_blkatoff_desc, fifo_blkatoff }, /* blkatoff */ |
|
{ &vop_valloc_desc, fifo_valloc }, /* valloc */ |
|
{ &vop_vfree_desc, fifo_vfree }, /* vfree */ |
|
{ &vop_truncate_desc, fifo_truncate }, /* truncate */ |
|
{ &vop_update_desc, cd9660_update }, /* update */ |
|
{ &vop_bwrite_desc, vn_bwrite }, /* bwrite */ |
{ &vop_bwrite_desc, vn_bwrite }, /* bwrite */ |
{ &vop_putpages_desc, fifo_putpages }, /* putpages */ |
{ &vop_putpages_desc, fifo_putpages }, /* putpages */ |
{ NULL, NULL } |
{ NULL, NULL } |