Formerly ../hurd/hurdkill.c.~5~
[kopensolaris-gnu/glibc.git] / hurd / dtable.c
index 27bd275..4812c69 100644 (file)
@@ -27,12 +27,12 @@ Cambridge, MA 02139, USA.  */
 #include <limits.h>
 #include <cthreads.h>          /* For `struct mutex'.  */
 #include "set-hooks.h"
+#include "hurdmalloc.h"                /* XXX */
 
 
-struct mutex _hurd_dtable_lock;
+struct mutex _hurd_dtable_lock = MUTEX_INITIALIZER; /* XXX ld bug; must init */
 struct hurd_fd **_hurd_dtable;
 int _hurd_dtablesize;
-int _hurd_dtable_rlimit;       /* Resource limit on open descriptors.  */
 
 
 DEFINE_HOOK (_hurd_fd_subinit, (void));
@@ -50,14 +50,6 @@ init_dtable (void)
      table.  It will be expanded as necessary up to _hurd_dtable_rlimit.  */
   _hurd_dtablesize = _hurd_init_dtablesize;
 
-  /* In lieu of a real resource limit value inherited from the parent
-     (XXX), compute a reasonable seeming limit: the size the passed-in
-     table, rounded up to a multiple of FOPEN_MAX descriptors.  */
-  _hurd_dtable_rlimit
-    = (_hurd_init_dtablesize + FOPEN_MAX - 1) / FOPEN_MAX * FOPEN_MAX;
-  if (_hurd_dtable_rlimit == 0)
-    _hurd_dtable_rlimit = FOPEN_MAX;
-
   /* Allocate the vector of pointers.  */
   _hurd_dtable = malloc (_hurd_dtablesize * sizeof (*_hurd_dtable));
   if (_hurd_dtablesize != 0 && _hurd_dtable == NULL)
@@ -103,6 +95,8 @@ init_dtable (void)
   /* Run things that want to run after the file descriptor table
      is initialized.  */
   RUN_HOOK (_hurd_fd_subinit, ());
+
+  (void) &init_dtable;         /* Avoid "defined but not used" warning.  */
 }
 
 text_set_element (_hurd_subinit, init_dtable);
@@ -133,44 +127,6 @@ file_t (*_hurd_getdport_fn) (int fd) = get_dtable_port;
 \f
 #include <hurd/signal.h>
 
-/* Called on fork to install the dtable in NEWTASK.  The dtable lock is
-   held now and was taken before the child was created, copying our memory.
-   Insert send rights for all of the normal io ports for fds, with the same
-   names they have in our task.  We trust that none of the ports in the
-   dtable were be changed while we have been holding the lock, so the port
-   names copied by the child are still valid in our task.  */
-
-static error_t
-fork_parent_dtable (task_t newtask)
-{
-  error_t err;
-  int i;
-
-  err = 0;
-
-  for (i = 0; !err && i < _hurd_dtablesize; ++i)
-    {
-      struct hurd_userlink ulink, ctty_ulink;
-      io_t port = _hurd_port_get (&_hurd_dtable[i]->port, &ulink);
-      io_t ctty = _hurd_port_get (&_hurd_dtable[i]->ctty, &ctty_ulink);
-
-      /* If there is a ctty-special port (it will be in PORT),
-        insert only the normal io port.  The child will get a fresh
-        ctty-special port.  */
-      if (ctty != MACH_PORT_NULL)
-       err = __mach_port_insert_right (newtask, ctty, ctty,
-                                       MACH_MSG_TYPE_COPY_SEND);
-      else if (port != MACH_PORT_NULL)
-       /* There is no ctty-special port; PORT is the normal io port.  */
-       err = __mach_port_insert_right (newtask, port, port,
-                                       MACH_MSG_TYPE_COPY_SEND);
-
-      _hurd_port_free (&_hurd_dtable[i]->port, &ulink, port);
-      _hurd_port_free (&_hurd_dtable[i]->ctty, &ctty_ulink, ctty);
-    }
-  return err;
-}
-
 /* We are in the child fork; the dtable lock is still held.
    The parent has inserted send rights for all the normal io ports,
    but we must recover ctty-special ports for ourselves.  */
@@ -185,25 +141,34 @@ fork_child_dtable (void)
   for (i = 0; !err && i < _hurd_dtablesize; ++i)
     {
       struct hurd_fd *d = _hurd_dtable[i];
+      if (d == NULL)
+       continue;
 
+      /* No other thread is using the send rights in the child task.  */
       d->port.users = d->ctty.users = NULL;
 
-      if (d->ctty.port)
-       /* There was a ctty-special port in the parent.
-          We need to get one for ourselves too.  */
-         err = __term_become_ctty (d->ctty.port,
-                                   /* XXX no guarantee that init_pids hook
-                                      has been run BEFORE this one! */
-                                   _hurd_pid, _hurd_pgrp, _hurd_msgport,
-                                   &d->port.port);
+      if (d->ctty.port != MACH_PORT_NULL)
+       {
+         /* There was a ctty-special port in the parent.
+            We need to get one for ourselves too.  */
+         __mach_port_deallocate (__mach_task_self (), d->port.port);
+         err = __term_open_ctty (d->ctty.port, _hurd_pid, _hurd_pgrp,
+                                 &d->port.port);
+         if (err)
+           {
+             d->port.port = d->ctty.port;
+             d->ctty.port = MACH_PORT_NULL;
+           }
+       }
 
       /* XXX for each fd with a cntlmap, reauth and re-map_cntl.  */
     }
   return err;
+
+  (void) &fork_child_dtable;   /* Avoid "defined but not used" warning.  */
 }
 
-text_set_element (_hurd_fork_locks, _hurd_dtable_lock);
-text_set_element (_hurd_fork_setup_hook, fork_parent_dtable);
+data_set_element (_hurd_fork_locks, _hurd_dtable_lock);        /* XXX ld bug: bss */
 text_set_element (_hurd_fork_child_hook, fork_child_dtable);
 \f
 /* Called when our process group has changed.  */
@@ -234,8 +199,7 @@ ctty_new_pgrp (void)
          /* This fd has a ctty-special port.  We need a new one, to tell
              the io server of our different process group.  */
          io_t new;
-         if (! __term_become_ctty (ctty, _hurd_pid, _hurd_pgrp, _hurd_msgport,
-                                   &new))
+         if (! __term_open_ctty (ctty, _hurd_pid, _hurd_pgrp, &new))
            _hurd_port_set (&d->port, new);
        }
 
@@ -245,6 +209,8 @@ ctty_new_pgrp (void)
 
   __mutex_unlock (&_hurd_dtable_lock);
   HURD_CRITICAL_END;
+
+  (void) &ctty_new_pgrp;       /* Avoid "defined but not used" warning.  */
 }
 
 text_set_element (_hurd_pgrp_changed_hook, ctty_new_pgrp);
@@ -298,6 +264,8 @@ reauth_dtable (void)
 
   __mutex_unlock (&_hurd_dtable_lock);
   HURD_CRITICAL_END;
+
+  (void) &reauth_dtable;       /* Avoid "defined but not used" warning.  */
 }
 
 text_set_element (_hurd_reauth_hook, reauth_dtable);