Formerly ../hurd/alloc-fd.c.~6~
[kopensolaris-gnu/glibc.git] / hurd / hurdid.c
1 /* Copyright (C) 1993, 1994 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 #include <hurd/id.h>
21 #include <gnu-stabs.h>
22
23 struct hurd_id_data _hurd_id;
24
25 static void
26 init_id (void)
27 {
28 #ifdef noteven
29   __mutex_init (&_hurd_id.lock);
30 #endif
31   _hurd_id.valid = 0;
32 }
33
34 text_set_element (__libc_subinit, init_id);
35 \f
36 /* Check that _hurd_id.{gen,aux} are valid and update them if not.
37    Expects _hurd_id.lock to be held and does not release it.  */
38
39 error_t
40 _hurd_check_ids (void)
41 {
42   if (! _hurd_id.valid)
43     {
44       error_t err;
45       inline void dealloc (__typeof (_hurd_id.gen) *p)
46         {
47           if (p->uids)
48             {
49               __vm_deallocate (__mach_task_self (),
50                                (vm_address_t) p->uids,
51                                p->nuids * sizeof (uid_t));
52               p->uids = NULL;
53             }
54           if (p->gids)
55             {
56               __vm_deallocate (__mach_task_self (),
57                                (vm_address_t) p->gids,
58                                p->ngids * sizeof (gid_t));
59               p->gids = NULL;
60             }
61         }
62
63       dealloc (&_hurd_id.gen);
64       dealloc (&_hurd_id.aux);
65       if (_hurd_id.rid_auth)
66         {
67           __mach_port_deallocate (__mach_task_self (), _hurd_id.rid_auth);
68           _hurd_id.rid_auth = MACH_PORT_NULL;
69         }
70
71       if (err = __USEPORT (AUTH, __auth_getids
72                            (port,
73                             &_hurd_id.gen.uids, &_hurd_id.gen.nuids,
74                             &_hurd_id.aux.uids, &_hurd_id.aux.nuids,
75                             &_hurd_id.gen.gids, &_hurd_id.gen.ngids,
76                             &_hurd_id.aux.gids, &_hurd_id.aux.ngids)))
77         return err;
78
79       _hurd_id.valid = 1;
80     }
81
82   return 0;
83 }