aboutsummaryrefslogtreecommitdiff
path: root/libnetfs/io-restrict-auth.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnetfs/io-restrict-auth.c')
-rw-r--r--libnetfs/io-restrict-auth.c62
1 files changed, 26 insertions, 36 deletions
diff --git a/libnetfs/io-restrict-auth.c b/libnetfs/io-restrict-auth.c
index 1a175a35..bddc8fea 100644
--- a/libnetfs/io-restrict-auth.c
+++ b/libnetfs/io-restrict-auth.c
@@ -1,5 +1,5 @@
-/*
- Copyright (C) 1995 Free Software Foundation, Inc.
+/*
+ Copyright (C) 1995,96,2001,02 Free Software Foundation, Inc.
Written by Michael I. Bushnell, p/BSG.
This file is part of the GNU Hurd.
@@ -21,16 +21,6 @@
#include "netfs.h"
#include "io_S.h"
-static inline int
-listmember (int *list, int query, int n)
-{
- int i;
- for (i = 0; i < n; i++)
- if (list[i] == query)
- return 1;
- return 0;
-}
-
error_t
netfs_S_io_restrict_auth (struct protid *user,
mach_port_t *newport,
@@ -40,33 +30,33 @@ netfs_S_io_restrict_auth (struct protid *user,
gid_t *gids,
mach_msg_type_number_t ngids)
{
- uid_t *newuids, *newgids, *olduids, *oldgids;
- int i, newnuids, newngids, oldnuids, oldngids;
+ error_t err;
struct protid *newpi;
-
+ struct iouser *new_user;
+
if (!user)
return EOPNOTSUPP;
-
+
+ err = iohelp_restrict_iouser (&new_user, user->user,
+ uids, nuids, gids, ngids);
+ if (err)
+ return err;
+
mutex_lock (&user->po->np->lock);
- netfs_interpret_credential (user->credential, &olduids, &oldnuids,
- &oldgids, &oldngids);
- newuids = alloca (sizeof (uid_t) * oldnuids);
- newgids = alloca (sizeof (gid_t) * oldngids);
- for (i = newnuids = 0; i < oldnuids; i++)
- if (listmember (uids, olduids[i], nuids))
- newuids[newnuids++] = olduids[i];
- for (i = newngids = 0; i < oldngids; i++)
- if (listmember (gids, oldgids[i], ngids))
- newgids[newngids++] = oldgids[i];
-
- newpi = netfs_make_protid (user->po,
- netfs_make_credential (newuids, newnuids,
- newgids, newngids));
- *newport = ports_get_right (newpi);
- mutex_unlock (&user->po->np->lock);
-
- *newporttype = MACH_MSG_TYPE_MAKE_SEND;
+ newpi = netfs_make_protid (user->po, new_user);
+ if (newpi)
+ {
+ *newport = ports_get_right (newpi);
+ mutex_unlock (&user->po->np->lock);
+ *newporttype = MACH_MSG_TYPE_MAKE_SEND;
+ }
+ else
+ {
+ mutex_unlock (&user->po->np->lock);
+ iohelp_free_iouser (new_user);
+ err = ENOMEM;
+ }
+
ports_port_deref (newpi);
- return 0;
+ return err;
}
-