diff options
author | rwatson <rwatson@FreeBSD.org> | 2002-10-09 21:48:22 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2002-10-09 21:48:22 +0000 |
commit | 48070e93ee8fc5e3c967806e44eda9cbd15e708f (patch) | |
tree | 7397896ab55cfc3eea38f3053cca8b05bf348498 /sys/kern/vfs_extattr.c | |
parent | 6f14c978b7230453dd26250094a6ba1856d82d0f (diff) | |
download | FreeBSD-src-48070e93ee8fc5e3c967806e44eda9cbd15e708f.zip FreeBSD-src-48070e93ee8fc5e3c967806e44eda9cbd15e708f.tar.gz |
Implement extattr_{delete,get,set}_link() system calls: extended attribute
operations that do not follow links. Sync to MAC tree.
Obtained from: TrustedBSD Project
Sponsored by: DARPA, Network Associates Laboratories
Diffstat (limited to 'sys/kern/vfs_extattr.c')
-rw-r--r-- | sys/kern/vfs_extattr.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index 55ec316..38265bd 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -3898,6 +3898,37 @@ extattr_set_fd(td, uap) return (error); } +int +extattr_set_link(td, uap) + struct thread *td; + struct extattr_set_link_args /* { + syscallarg(const char *) path; + syscallarg(int) attrnamespace; + syscallarg(const char *) attrname; + syscallarg(void *) data; + syscallarg(size_t) nbytes; + } */ *uap; +{ + struct nameidata nd; + char attrname[EXTATTR_MAXNAMELEN]; + int error; + + error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); + if (error) + return (error); + + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); + if ((error = namei(&nd)) != 0) + return (error); + NDFREE(&nd, NDF_ONLY_PNBUF); + + error = extattr_set_vp(nd.ni_vp, uap->attrnamespace, attrname, + uap->data, uap->nbytes, td); + + vrele(nd.ni_vp); + return (error); +} + /*- * Get a named extended attribute on a file or directory * @@ -4028,6 +4059,37 @@ extattr_get_fd(td, uap) return (error); } +int +extattr_get_link(td, uap) + struct thread *td; + struct extattr_get_link_args /* { + syscallarg(const char *) path; + syscallarg(int) attrnamespace; + syscallarg(const char *) attrname; + syscallarg(void *) data; + syscallarg(size_t) nbytes; + } */ *uap; +{ + struct nameidata nd; + char attrname[EXTATTR_MAXNAMELEN]; + int error; + + error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); + if (error) + return (error); + + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); + if ((error = namei(&nd)) != 0) + return (error); + NDFREE(&nd, NDF_ONLY_PNBUF); + + error = extattr_get_vp(nd.ni_vp, uap->attrnamespace, attrname, + uap->data, uap->nbytes, td); + + vrele(nd.ni_vp); + return (error); +} + /* * extattr_delete_vp(): Delete a named extended attribute on a file or * directory @@ -4118,3 +4180,31 @@ extattr_delete_fd(td, uap) fdrop(fp, td); return (error); } + +int +extattr_delete_link(td, uap) + struct thread *td; + struct extattr_delete_link_args /* { + syscallarg(const char *) path; + syscallarg(int) attrnamespace; + syscallarg(const char *) attrname; + } */ *uap; +{ + struct nameidata nd; + char attrname[EXTATTR_MAXNAMELEN]; + int error; + + error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); + if (error) + return(error); + + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); + if ((error = namei(&nd)) != 0) + return(error); + NDFREE(&nd, NDF_ONLY_PNBUF); + + error = extattr_delete_vp(nd.ni_vp, uap->attrnamespace, attrname, td); + + vrele(nd.ni_vp); + return(error); +} |