summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libtrivfs/fsys-getroot.c78
1 files changed, 25 insertions, 53 deletions
diff --git a/libtrivfs/fsys-getroot.c b/libtrivfs/fsys-getroot.c
index c082b7d4..9eca01f5 100644
--- a/libtrivfs/fsys-getroot.c
+++ b/libtrivfs/fsys-getroot.c
@@ -39,11 +39,10 @@ trivfs_S_fsys_getroot (struct trivfs_control *cntl,
mach_port_t *newpt,
mach_msg_type_name_t *newpttype)
{
- struct trivfs_protid *cred;
- mach_port_t new_realnode;
- error_t err = 0;
int perms;
- int i;
+ error_t err = 0;
+ mach_port_t new_realnode;
+ struct trivfs_protid *cred;
if (!cntl)
return EOPNOTSUPP;
@@ -58,60 +57,33 @@ trivfs_S_fsys_getroot (struct trivfs_control *cntl,
flags &= O_HURD;
flags &= ~(O_CREAT|O_EXCL|O_NOLINK|O_NOTRANS);
- io_restrict_auth (cntl->underlying, &new_realnode,
- uids, nuids, gids, ngids);
+ err = io_restrict_auth (cntl->underlying,
+ &new_realnode, uids, nuids, gids, ngids);
+ if (err)
+ return err;
+
file_check_access (new_realnode, &perms);
if ((flags & (O_READ|O_WRITE|O_EXEC) & perms)
!= (flags & (O_READ|O_WRITE|O_EXEC)))
- {
- mach_port_deallocate (mach_task_self (), new_realnode);
- return EACCES;
- }
+ err = EACCES;
+
+ if (!err && trivfs_check_open_hook)
+ err = (*trivfs_check_open_hook) (cntl, uids, nuids, gids, ngids, flags);
+ if (!err)
+ err = trivfs_open (cntl, uids, nuids, gids, ngids, flags, new_realnode,
+ &cred);
+ if (err)
+ mach_port_deallocate (mach_task_self (), new_realnode);
- if (trivfs_check_open_hook)
+ if (!err)
{
- err = (*trivfs_check_open_hook) (cntl, uids, nuids, gids, ngids, flags);
- if (err)
- {
- mach_port_deallocate (mach_task_self (), new_realnode);
- return err;
- }
+ *do_retry = FS_RETRY_NORMAL;
+ *retry_name = '\0';
+ *newpt = ports_get_right (cred);
+ *newpttype = MACH_MSG_TYPE_MAKE_SEND;
+ ports_port_deref (cred);
+ mach_port_deallocate (mach_task_self (), dotdot);
}
-
- cred = ports_allocate_port (cntl->protid_bucket,
- sizeof (struct trivfs_protid),
- cntl->protid_class);
- cred->isroot = 0;
- for (i = 0; i < nuids; i++)
- if (uids[i] == 0)
- cred->isroot = 1;
- cred->uids = malloc (nuids * sizeof (uid_t));
- cred->gids = malloc (ngids * sizeof (uid_t));
- bcopy (uids, cred->uids, nuids * sizeof (uid_t));
- bcopy (gids, cred->gids, ngids * sizeof (uid_t));
- cred->nuids = nuids;
- cred->ngids = ngids;
- cred->hook = 0;
- cred->po = malloc (sizeof (struct trivfs_peropen));
- cred->po->refcnt = 1;
- cred->po->cntl = cntl;
- cred->po->openmodes = flags;
- cred->po->hook = 0;
- ports_port_ref (cntl);
- if (trivfs_peropen_create_hook)
- (*trivfs_peropen_create_hook) (cred->po);
-
- cred->realnode = new_realnode;
- if (trivfs_protid_create_hook)
- (*trivfs_protid_create_hook) (cred);
-
- *do_retry = FS_RETRY_NORMAL;
- *retry_name = '\0';
- *newpt = ports_get_right (cred);
- *newpttype = MACH_MSG_TYPE_MAKE_SEND;
- ports_port_deref (cred);
- mach_port_deallocate (mach_task_self (), dotdot);
- return 0;
+ return err;
}
-