summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/syscall/unlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/syscall/unlink.c')
-rw-r--r--usr/src/uts/common/syscall/unlink.c43
1 files changed, 10 insertions, 33 deletions
diff --git a/usr/src/uts/common/syscall/unlink.c b/usr/src/uts/common/syscall/unlink.c
index 8ee0b9ff0d..8f48ad0d15 100644
--- a/usr/src/uts/common/syscall/unlink.c
+++ b/usr/src/uts/common/syscall/unlink.c
@@ -50,44 +50,21 @@
int
unlinkat(int fd, char *name, int flags)
{
- file_t *dirfp;
- vnode_t *dirvp;
+ vnode_t *startvp;
int error;
- char startchar;
- if (fd == AT_FDCWD && name == NULL)
+ if (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) {
- dirvp = NULL;
- } else {
- if (startchar != '/') {
- if ((dirfp = getf(fd)) == NULL) {
- return (set_errno(EBADF));
- }
- dirvp = dirfp->f_vnode;
- VN_HOLD(dirvp);
- releasef(fd);
- } else {
- dirvp = NULL;
- }
- }
-
- if (AU_AUDITING() && (dirvp != NULL))
+ if ((error = fgetstartvp(fd, name, &startvp)) != 0)
+ return (set_errno(error));
+ if (AU_AUDITING() && startvp != NULL)
audit_setfsat_path(1);
- error = vn_removeat(dirvp, name,
- UIO_USERSPACE, (flags == AT_REMOVEDIR) ? RMDIRECTORY : RMFILE);
- if (dirvp != NULL)
- VN_RELE(dirvp);
-
- if (error != NULL)
+ error = vn_removeat(startvp, name, UIO_USERSPACE,
+ (flags == AT_REMOVEDIR) ? RMDIRECTORY : RMFILE);
+ if (startvp != NULL)
+ VN_RELE(startvp);
+ if (error)
return (set_errno(error));
return (0);
}