Formerly ../hurd/fd-write.c.~5~
authorroland <roland>
Tue, 5 Jul 1994 23:28:16 +0000 (23:28 +0000)
committerroland <roland>
Tue, 5 Jul 1994 23:28:16 +0000 (23:28 +0000)
hurd/fd-write.c

index 728bf44..8c6b39b 100644 (file)
@@ -27,40 +27,47 @@ _hurd_fd_write (struct hurd_fd *fd, const void *buf, size_t *nbytes)
   error_t err;
   mach_msg_type_number_t wrote;
   int noctty;
+  struct _hurd_sigstate *ss;
 
-#ifdef notyet
-  struct _hurd_sigstate *ss = _hurd_self_sigstate ();
+  /* Note that __ioctl.c implements the same SIGTTOU behavior.
+     Any changes here should be done there as well.  */
 
-  /* Don't use the ctty io port if we are orphaned, or are blocking or
-     ignoring SIGTTOU.  */
-  noctty = (_hurd_orphaned ||
-           __sigismember (SIGTTOU, &ss->blocked) ||
+  /* Don't use the ctty io port if we are blocking or ignoring SIGTTOU.  */
+  ss = _hurd_self_sigstate ();
+  noctty = (__sigismember (SIGTTOU, &ss->blocked) ||
            ss->actions[SIGTTOU].sa_handler == SIG_IGN);
   __mutex_unlock (&ss->lock);
-#else
-  noctty = 1;
-#endif
-  
+
   err = HURD_FD_PORT_USE
     (fd,
      ({
-     call:
-       err = __io_write (noctty ? port : ctty, buf, *nbytes, -1, &wrote);
-       if (!noctty && ctty != MACH_PORT_NULL && err == EBACKGROUND)
+       const io_t ioport = (noctty && ctty != MACH_PORT_NULL) ? ctty : port;
+       do
         {
-#if 1
-          abort ();
-#else
-          int restart;
-          __mutex_lock (&ss->lock);
-          restart = ss->actions[SIGTTOU].sa_flags & SA_RESTART;
-          _hurd_raise_signal (ss, SIGTTOU, 0); /* Unlocks SS->lock.  */
-          if (restart)
-            goto call;
-          else
-            err = EINTR;       /* XXX Is this right? */
-#endif
-        }
+          err = __io_write (ioport, buf, *nbytes, -1, &wrote);
+          if (ioport == ctty && err == EBACKGROUND)
+            {
+              if (_hurd_orphaned)
+                /* Our process group is orphaned, so we never generate a
+                   signal; we just fail.  */
+                err = EIO;
+              else
+                {
+                  /* Send a SIGTTOU signal to our process group.  */
+                  int restart;
+                  err = __USEPORT (CTTYID, _hurd_sig_post (0, SIGTTOU, port));
+                  /* XXX what to do if error here? */
+                  /* At this point we should have just run the handler for
+                     SIGTTOU or resumed after being stopped.  Now this is
+                     still a "system call", so check to see if we should
+                     restart it.  */
+                  __mutex_lock (&ss->lock);
+                  if (!(ss->actions[SIGTTOU].sa_flags & SA_RESTART))
+                    err = EINTR;
+                  __mutex_unlock (&ss->lock);
+                }
+            }
+        } while (err == EBACKGROUND);
        err;
      }));