]>
Commit | Line | Data |
---|---|---|
c84142e8 UD |
1 | /* Copyright (C) 1993, 1994, 1995, 1997 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 not, | |
16 | write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
17 | Boston, MA 02111-1307, USA. */ | |
28f540f4 RM |
18 | |
19 | #include <hurd.h> | |
20 | #include <hurd/id.h> | |
21 | ||
22 | struct hurd_id_data _hurd_id; | |
23 | ||
24 | ||
25 | /* Check that _hurd_id.{gen,aux} are valid and update them if not. | |
26 | Expects _hurd_id.lock to be held and does not release it. */ | |
27 | ||
28 | error_t | |
29 | _hurd_check_ids (void) | |
30 | { | |
31 | if (! _hurd_id.valid) | |
32 | { | |
33 | inline void dealloc (__typeof (_hurd_id.gen) *p) | |
34 | { | |
35 | if (p->uids) | |
36 | { | |
37 | __vm_deallocate (__mach_task_self (), | |
38 | (vm_address_t) p->uids, | |
39 | p->nuids * sizeof (uid_t)); | |
40 | p->uids = NULL; | |
41 | } | |
42 | p->nuids = 0; | |
43 | if (p->gids) | |
44 | { | |
45 | __vm_deallocate (__mach_task_self (), | |
46 | (vm_address_t) p->gids, | |
47 | p->ngids * sizeof (gid_t)); | |
48 | p->gids = NULL; | |
49 | } | |
50 | p->ngids = 0; | |
51 | } | |
52 | ||
53 | error_t err; | |
54 | ||
55 | dealloc (&_hurd_id.gen); | |
56 | dealloc (&_hurd_id.aux); | |
57 | ||
58 | if (_hurd_id.rid_auth != MACH_PORT_NULL) | |
59 | { | |
60 | __mach_port_deallocate (__mach_task_self (), _hurd_id.rid_auth); | |
61 | _hurd_id.rid_auth = MACH_PORT_NULL; | |
62 | } | |
63 | ||
64 | if (err = __USEPORT (AUTH, __auth_getids | |
65 | (port, | |
66 | &_hurd_id.gen.uids, &_hurd_id.gen.nuids, | |
67 | &_hurd_id.aux.uids, &_hurd_id.aux.nuids, | |
68 | &_hurd_id.gen.gids, &_hurd_id.gen.ngids, | |
69 | &_hurd_id.aux.gids, &_hurd_id.aux.ngids))) | |
70 | return err; | |
71 | ||
72 | _hurd_id.valid = 1; | |
73 | } | |
74 | ||
75 | return 0; | |
76 | } | |
77 | ||
78 | static void | |
79 | init_id (void) | |
80 | { | |
81 | __mutex_init (&_hurd_id.lock); | |
82 | _hurd_id.valid = 0; | |
83 | _hurd_id.rid_auth = MACH_PORT_NULL; | |
84 | _hurd_id.gen.uids = _hurd_id.aux.uids = NULL; | |
85 | _hurd_id.gen.nuids = _hurd_id.aux.nuids = 0; | |
86 | _hurd_id.gen.gids = _hurd_id.aux.gids = NULL; | |
87 | _hurd_id.gen.ngids = _hurd_id.aux.ngids = 0; | |
88 | ||
89 | (void) &init_id; /* Avoid "defined but not used" warning. */ | |
90 | } | |
91 | text_set_element (_hurd_preinit_hook, init_id); |