From b40c254986521a7b9ec49e1e51f1582def697b80 Mon Sep 17 00:00:00 2001 From: green Date: Tue, 11 Dec 2001 20:48:20 +0000 Subject: Add VOP_GETEXTATTR(9) passthrough support to pseudofs. Obtained from: TrustedBSD Project Sponsored by: DARPA, NAI Labs --- sys/fs/pseudofs/pseudofs.h | 13 +++++++++++++ sys/fs/pseudofs/pseudofs_vnops.c | 42 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) (limited to 'sys/fs/pseudofs') diff --git a/sys/fs/pseudofs/pseudofs.h b/sys/fs/pseudofs/pseudofs.h index 2432748..ba0a93b 100644 --- a/sys/fs/pseudofs/pseudofs.h +++ b/sys/fs/pseudofs/pseudofs.h @@ -133,6 +133,18 @@ typedef int (*pfs_vis_t)(PFS_VIS_ARGS); typedef int (*pfs_ioctl_t)(PFS_IOCTL_ARGS); /* + * Getextattr callback + */ +#define PFS_GETEXTATTR_ARGS \ + struct thread *td, struct proc *p, struct pfs_node *pn, \ + int attrnamespace, const char *name, struct uio *uio, \ + struct ucred *cred +#define PFS_GETEXTATTR_PROTO(name) \ + int name(PFS_GETEXTATTR_ARGS); +struct ucred; +typedef int (*pfs_getextattr_t)(PFS_GETEXTATTR_ARGS); + +/* * Last-close callback */ #define PFS_CLOSE_ARGS \ @@ -172,6 +184,7 @@ struct pfs_node { pfs_close_t pn_close; pfs_attr_t pn_attr; pfs_vis_t pn_vis; + pfs_getextattr_t pn_getextattr; void *pn_data; int pn_flags; diff --git a/sys/fs/pseudofs/pseudofs_vnops.c b/sys/fs/pseudofs/pseudofs_vnops.c index 4c869b2..e7741b8 100644 --- a/sys/fs/pseudofs/pseudofs_vnops.c +++ b/sys/fs/pseudofs/pseudofs_vnops.c @@ -251,6 +251,47 @@ pfs_ioctl(struct vop_ioctl_args *va) } /* + * Perform getextattr + */ +static int +pfs_getextattr(struct vop_getextattr_args *va) +{ + struct vnode *vn = va->a_vp; + struct pfs_vdata *pvd = (struct pfs_vdata *)vn->v_data; + struct pfs_node *pn = pvd->pvd_pn; + struct proc *proc = NULL; + int error; + + PFS_TRACE((pd->pn_name)); + + if (pn->pn_getextattr == NULL) + PFS_RETURN (EOPNOTSUPP); + + /* + * This is necessary because either process' privileges may + * have changed since the open() call. + */ + if (!pfs_visible(curthread, pn, pvd->pvd_pid)) + PFS_RETURN (EIO); + + /* XXX duplicates bits of pfs_visible() */ + if (pvd->pvd_pid != NO_PID) { + if ((proc = pfind(pvd->pvd_pid)) == NULL) + PFS_RETURN (EIO); + _PHOLD(proc); + PROC_UNLOCK(proc); + } + + error = (pn->pn_getextattr)(curthread, proc, pn, va->a_attrnamespace, + va->a_name, va->a_uio, va->a_cred); + + if (proc != NULL) + PRELE(proc); + + PFS_RETURN (error); +} + +/* * Look up a file or directory */ static int @@ -748,6 +789,7 @@ static struct vnodeopv_entry_desc pfs_vnodeop_entries[] = { { &vop_close_desc, (vop_t *)pfs_close }, { &vop_create_desc, (vop_t *)pfs_badop }, { &vop_getattr_desc, (vop_t *)pfs_getattr }, + { &vop_getextattr_desc, (vop_t *)pfs_getextattr }, { &vop_ioctl_desc, (vop_t *)pfs_ioctl }, { &vop_link_desc, (vop_t *)pfs_badop }, { &vop_lookup_desc, (vop_t *)pfs_lookup }, -- cgit v1.1