Formerly ../hurd/dtable.c.~7~
[kopensolaris-gnu/glibc.git] / hurd / dtable.c
1 /* Copyright (C) 1991 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 <gnu-stabs.h>
21 #include <stdlib.h>
22 #include <limits.h>
23
24 static void
25 init_dtable (void)
26 {
27   register size_t i;
28
29   __mutex_init (&_hurd_dtable_lock);
30
31   /* The initial size of the descriptor table is that of the passed-in
32      table, rounded up to a multiple of OPEN_MAX descriptors.  */
33   _hurd_dtable.size
34     = (_hurd_init_dtablesize + OPEN_MAX - 1) / OPEN_MAX * OPEN_MAX;
35
36   _hurd_dtable.d = malloc (_hurd_init_dtablesize * sizeof (*_hurd_dtable.d));
37   if (_hurd_dtable.d == NULL)
38     __libc_fatal ("hurd: Can't allocate descriptor table\n");
39
40   for (i = 0; i < _hurd_init_dtablesize; ++i)
41     {
42       _hurd_dtable.d[i].server = _hurd_init_dtable[i];
43       _hurd_dtable.d[i].isctty = -1;
44       _hurd_dtable.d[i].flags = 0;
45     }
46   for (; i < _hurd_dtable.size; ++i)
47     _hurd_dtable.d[i].server = MACH_PORT_NULL;
48
49   _hurd_init_dtable = NULL;
50   _hurd_init_dtablesize = 0;
51 }
52
53 text_set_element (__libc_subinit, init_dtable);
54 \f
55 /* Called on fork to install the dtable in NEWTASK.  */
56
57 static error_t
58 fork_dtable (task_t newtask)
59 {
60   int i;
61   __mutex_lock (&_hurd_dtable_lock);
62   for (i = 0; i < _hurd_dtable.size; ++i)
63     if (err = __mach_port_insert_right (newtask, _hurd_dtable.d[i].server,
64                                         _hurd_dtable.d[i].server,
65                                         MACH_PORT_COPY_SEND))
66       {
67         /* XXX for each fd with a cntlmap, reauth and re-map_cntl.  */
68         __mutex_unlock (&_hurd_dtable.lock);
69         return 1;
70       }
71   __mutex_unlock (&_hurd_dtable_lock);
72   return 0;
73 }
74
75 text_set_element (_hurd_fork_hook, fork_dtable);