(get_myaddress): Avoid loopback interfaces, return loopback address
[kopensolaris-gnu/glibc.git] / hurd / hurdid.c
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.  */
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);