diff options
Diffstat (limited to 'libdiskfs/io-restrict-auth.c')
-rw-r--r-- | libdiskfs/io-restrict-auth.c | 43 |
1 files changed, 13 insertions, 30 deletions
diff --git a/libdiskfs/io-restrict-auth.c b/libdiskfs/io-restrict-auth.c index f2e00293..c1560ac1 100644 --- a/libdiskfs/io-restrict-auth.c +++ b/libdiskfs/io-restrict-auth.c @@ -1,5 +1,5 @@ -/* - Copyright (C) 1994, 1995, 1996 Free Software Foundation +/* + Copyright (C) 1994,95,96,2001, 2002 Free Software Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -18,16 +18,6 @@ #include "priv.h" #include "io_S.h" -/* Tell if the array LIST (of size N) contains a member equal to QUERY. */ -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; -} /* Implement io_restrict_auth as described in <hurd/io.defs>. */ kern_return_t @@ -35,31 +25,23 @@ diskfs_S_io_restrict_auth (struct protid *cred, mach_port_t *newport, mach_msg_type_name_t *newportpoly, uid_t *uids, - u_int nuids, + size_t nuids, gid_t *gids, - u_int ngids) + size_t ngids) { error_t err; - uid_t *newuids, *newgids; - int i, newnuids, newngids; + struct iouser *user; struct protid *newpi; - + if (!cred) return EOPNOTSUPP; - - newuids = alloca (sizeof (uid_t) * cred->nuids); - newgids = alloca (sizeof (uid_t) * cred->ngids); - - for (i = newnuids = 0; i < cred->nuids; i++) - if (listmember (uids, cred->uids[i], nuids)) - newuids[newnuids++] = cred->uids[i]; - for (i = newngids = 0; i < cred->ngids; i++) - if (listmember (gids, cred->gids[i], ngids)) - newgids[newngids++] = cred->gids[i]; - + + err = iohelp_restrict_iouser (&user, cred->user, uids, nuids, gids, ngids); + if (err) + return err; + mutex_lock (&cred->po->np->lock); - err = diskfs_create_protid (cred->po, newuids, newnuids, newgids, newngids, - &newpi); + err = diskfs_create_protid (cred->po, user, &newpi); if (! err) { *newport = ports_get_right (newpi); @@ -68,5 +50,6 @@ diskfs_S_io_restrict_auth (struct protid *cred, } mutex_unlock (&cred->po->np->lock); + iohelp_free_iouser (user); return err; } |