diff options
Diffstat (limited to 'libdiskfs/io-restrict-auth.c')
-rw-r--r-- | libdiskfs/io-restrict-auth.c | 49 |
1 files changed, 11 insertions, 38 deletions
diff --git a/libdiskfs/io-restrict-auth.c b/libdiskfs/io-restrict-auth.c index 0a3a5021..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,41 +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; - struct idvec *uvec, *gvec; + struct iouser *user; struct protid *newpi; - int i; - + if (!cred) return EOPNOTSUPP; - uvec = make_idvec (); - gvec = make_idvec (); - - if (idvec_contains (cred->user->uids, 0)) - { - /* CRED has root access, and so may use any ids. */ - idvec_set_ids (uvec, uids, nuids); - idvec_set_ids (gvec, gids, ngids); - } - else - { - /* Otherwise, use any of the requested ids that CRED already has. */ - for (i = 0; i < cred->user->uids->num; i++) - if (listmember (uids, cred->user->uids->ids[i], nuids)) - idvec_add (uvec, cred->user->uids->ids[i]); - for (i = 0; i < cred->user->gids->num; i++) - if (listmember (gids, cred->user->gids->ids[i], ngids)) - idvec_add (gvec, cred->user->gids->ids[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, iohelp_create_iouser (uvec, gvec), - &newpi); + err = diskfs_create_protid (cred->po, user, &newpi); if (! err) { *newport = ports_get_right (newpi); @@ -78,5 +50,6 @@ diskfs_S_io_restrict_auth (struct protid *cred, } mutex_unlock (&cred->po->np->lock); + iohelp_free_iouser (user); return err; } |