diff options
author | Michael I. Bushnell <mib@gnu.org> | 1994-02-03 20:09:05 +0000 |
---|---|---|
committer | Michael I. Bushnell <mib@gnu.org> | 1994-02-03 20:09:05 +0000 |
commit | 16d74144026b92f5d3f4b229730ed364f4729545 (patch) | |
tree | 3de8c6f93c16db20e3a8eb51a4711f3c48a3d739 /libdiskfs/io-restrict-auth.c | |
parent | bea3e0bba36cff8b2ef51e4235cf9444484f7dce (diff) |
Initial revision
Diffstat (limited to 'libdiskfs/io-restrict-auth.c')
-rw-r--r-- | libdiskfs/io-restrict-auth.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/libdiskfs/io-restrict-auth.c b/libdiskfs/io-restrict-auth.c new file mode 100644 index 00000000..88797c42 --- /dev/null +++ b/libdiskfs/io-restrict-auth.c @@ -0,0 +1,63 @@ +/* + Copyright (C) 1994 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 + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "priv.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>. */ +error_t +diskfs_S_io_restrict_auth (struct protid *cred, + mach_port_t *newport, + mach_msg_type_name_t *newportpoly, + uid_t *uids, + u_int nuids, + gid_t *gids, + u_int ngids) +{ + uid_t *newuids, *newgids; + int i, newnuids, newngids; + + 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]; + + mutex_lock (&cred->po->ip->i_toplock); + *newport = (make_protid (cred->po, newuids, newnuids, newgids, + newngids))->fspt.pi.port; + mutex_unlock (&cred->po->ip->i_toplock); + *newportpoly = MACH_MSG_TYPE_MAKE_SEND; + return 0; +} |