summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/syscall/chown.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/syscall/chown.c')
-rw-r--r--usr/src/uts/common/syscall/chown.c82
1 files changed, 9 insertions, 73 deletions
diff --git a/usr/src/uts/common/syscall/chown.c b/usr/src/uts/common/syscall/chown.c
index ccb0b584ee..40c76e61bc 100644
--- a/usr/src/uts/common/syscall/chown.c
+++ b/usr/src/uts/common/syscall/chown.c
@@ -55,13 +55,10 @@
* Change ownership of file.
*/
int
-fchownat(int fd, char *name, uid_t uid, gid_t gid, int flags)
+fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag)
{
- vnode_t *startvp, *vp;
- file_t *filefp;
struct vattr vattr;
- int error = 0;
- char startchar;
+ int error;
struct zone *zone = crgetzone(CRED());
if (uid != (uid_t)-1 && !VALID_UID(uid, zone) ||
@@ -76,83 +73,22 @@ fchownat(int fd, char *name, uid_t uid, gid_t gid, int flags)
if (vattr.va_gid != -1)
vattr.va_mask |= AT_GID;
-
- if (fd == AT_FDCWD && name == NULL)
- return (set_errno(EFAULT));
-
- if (name != NULL) {
- if (copyin(name, &startchar, sizeof (char)))
- return (set_errno(EFAULT));
- } else {
- startchar = '\0';
- }
-
-
- if (fd == AT_FDCWD)
- startvp = NULL;
- else {
- /*
- * only get fd if not doing absolute lookup
- */
- if (startchar != '/') {
- if ((filefp = getf(fd)) == NULL)
- return (set_errno(EBADF));
- startvp = filefp->f_vnode;
- VN_HOLD(startvp);
- releasef(fd);
- } else {
- startvp = NULL;
- }
- }
-
- if (AU_AUDITING() && (startvp != NULL))
- audit_setfsat_path(1);
-
- /*
- * Do lookup for fchownat when name not NULL
- */
- if (name != NULL) {
- if (error = lookupnameat(name, UIO_USERSPACE,
- (flags == AT_SYMLINK_NOFOLLOW) ?
- NO_FOLLOW : FOLLOW,
- NULLVPP, &vp, startvp)) {
- if (startvp != NULL)
- VN_RELE(startvp);
- return (set_errno(error));
- }
- } else {
- vp = startvp;
- ASSERT(vp);
- VN_HOLD(vp);
- }
-
- if (vn_is_readonly(vp)) {
- error = EROFS;
- } else {
- error = VOP_SETATTR(vp, &vattr, 0, CRED(), NULL);
- }
-
- if (startvp != NULL)
- VN_RELE(startvp);
- if (vp != NULL)
- VN_RELE(vp);
-
- if (error != 0)
+ error = fsetattrat(fd, path, flag, &vattr);
+ if (error)
return (set_errno(error));
- else
- return (error);
+ return (0);
}
int
-chown(char *fname, uid_t uid, gid_t gid)
+chown(char *path, uid_t uid, gid_t gid)
{
- return (fchownat(AT_FDCWD, fname, uid, gid, 0));
+ return (fchownat(AT_FDCWD, path, uid, gid, 0));
}
int
-lchown(char *fname, uid_t uid, gid_t gid)
+lchown(char *path, uid_t uid, gid_t gid)
{
- return (fchownat(AT_FDCWD, fname, uid, gid, AT_SYMLINK_NOFOLLOW));
+ return (fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW));
}
int