Formerly ../hurd/hurdkill.c.~5~
[kopensolaris-gnu/glibc.git] / hurd / dtable.c
index 56370d2..4812c69 100644 (file)
@@ -30,7 +30,7 @@ Cambridge, MA 02139, USA.  */
 #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;
 
@@ -95,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);
@@ -139,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.  */
 }
 
-data_set_element (_hurd_fork_locks, _hurd_dtable_lock);
+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.  */
@@ -188,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);
        }
 
@@ -199,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);
@@ -252,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);