Formerly ../hurd/hurdauth.c.~7~
[kopensolaris-gnu/glibc.git] / hurd / hurdauth.c
1 /* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB.  If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA.  */
18
19 #include <hurd.h>
20
21 struct _hurd_port _hurd_auth;
22
23 static error_t
24 add_auth (sigthread_t me,
25           auth_t addauth)
26 {
27   error_t err;
28   auth_t newauth;
29
30   if (err = _HURD_PORT_USE (&_hurd_auth,
31                             __auth_combine (port, addauth, &newauth)))
32     return err;
33
34   /* XXX clobbers errno. Need per-thread errno. */
35   err = __setauth (newauth);
36   __mach_port_deallocate (__mach_task_self (), newauth);
37   if (err)
38     return errno;
39
40   __mach_port_deallocate (__mach_task_self (), addauth);
41   return POSIX_SUCCESS;
42 }
43
44 #include "misc_server/add_auth.c"
45
46 asm (".stabs \"__hurd_sigport_ids\",23,0,0,23005"); /* XXX */
47 text_set_element (_hurd_sigport_routines, _Xadd_auth);
48
49 static error_t
50 del_auth (sigthread_t me, task_t task,
51           uid_t *uids, size_t nuids,
52           gid_t *gids, size_t ngids)
53 {
54   error_t err;
55   auth_t newauth;
56   size_t i, j;
57
58   if (task != __mach_task_self ())
59     return EPERM;
60
61   __mutex_lock (&_hurd_idlock);
62   if (!_hurd_id_valid)
63     {
64       error_t err = _HURD_PORT_USE (&_hurd_auth,
65                                     __auth_getids (port, &_hurd_id));
66       if (err)
67         {
68           __mutex_unlock (&_hurd_idlock);
69           return err;
70         }
71       _hurd_id_valid = 1;
72     }
73
74   while (nuids-- > 0)
75     {
76       const uid_t uid = *uids++;
77       for (i = 0; i < _hurd_id.nuids; ++i)
78         if (_hurd_id.uidset[i] == uid)
79           /* Move the last uid into this slot, and decrease the
80              number of uids so the last slot is no longer used.  */
81           _hurd_id.uidset[i] = _hurd_id.uidset[--_hurd_id.nuids];
82     }
83   while (ngids-- > 0)
84     {
85       const gid_t gid = *gids++;
86       for (i = 0; i < _hurd_id.ngroups; ++i)
87         if (_hurd_id.gidset[i] == gid)
88           /* Move the last gid into this slot, and decrease the
89              number of gids so the last slot is no longer used.  */
90           _hurd_id.gidset[i] = _hurd_id.gidset[--_hurd_id.ngroups];
91     }
92
93   err = _HURD_PORT_USE (&_hurd_auth,
94                         __auth_makeauth (port, &_hurd_id, &newauth));
95   _hurd_id_valid = !err;
96   __mutex_unlock (&_hurd_idlock);
97
98   if (err)
99     return err;
100   err = __setauth (newauth);    /* XXX clobbers errno */
101   __mach_port_deallocate (__mach_task_self (), newauth);
102   if (err)
103     return errno;
104   return POSIX_SUCCESS;
105 }
106
107 #include "misc_server/del_auth.c"
108
109 asm (".stabs \"__hurd_sigport_ids\",23,0,0,23006"); /* XXX */
110 text_set_element (_hurd_sigport_routines, _Xdel_auth);