summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_syscalls.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2002-10-09 21:48:22 +0000
committerrwatson <rwatson@FreeBSD.org>2002-10-09 21:48:22 +0000
commit48070e93ee8fc5e3c967806e44eda9cbd15e708f (patch)
tree7397896ab55cfc3eea38f3053cca8b05bf348498 /sys/kern/vfs_syscalls.c
parent6f14c978b7230453dd26250094a6ba1856d82d0f (diff)
downloadFreeBSD-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_syscalls.c')
-rw-r--r--sys/kern/vfs_syscalls.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 55ec316..38265bd 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.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);
+}
OpenPOWER on IntegriCloud