Back to index

glibc  2.9
Functions
ctty-input.c File Reference
#include <hurd.h>
#include <hurd/signal.h>

Go to the source code of this file.

Functions

error_t _hurd_ctty_input (io_t port, io_t ctty, error_t(*rpc)(io_t))

Function Documentation

error_t _hurd_ctty_input ( io_t  port,
io_t  ctty,
error_t(*)(io_t)  rpc 
)

Definition at line 27 of file ctty-input.c.

{
  error_t err;

  if (ctty == MACH_PORT_NULL)
    return (*rpc) (port);

  do
    {
      err = (*rpc) (ctty);
      if (err == EBACKGROUND)
       {
         /* We are a background job and tried to read from the tty.
            We should probably get a SIGTTIN signal.  */
         if (_hurd_orphaned)
           /* Our process group is orphaned.  Don't stop; just fail.  */
           err = EIO;
         else
           {
             struct hurd_sigstate *ss = _hurd_self_sigstate ();
             __spin_lock (&ss->lock);
             if (__sigismember (&ss->blocked, SIGTTIN) ||
                ss->actions[SIGTTIN].sa_handler == SIG_IGN)
              /* We are blocking or ignoring SIGTTIN.  Just fail.  */
              err = EIO;
             __spin_unlock (&ss->lock);

             if (err == EBACKGROUND)
              {
                /* Send a SIGTTIN signal to our process group.

                   We must remember here not to clobber ERR, since
                   the loop condition below uses it to recall that
                we should retry after a stop.  */

                __USEPORT (CTTYID, _hurd_sig_post (0, SIGTTIN, port));
                /* XXX what to do if error here? */

                /* At this point we should have just run the handler for
                   SIGTTIN or resumed after being stopped.  Now this is
                   still a "system call", so check to see if we should
                restart it.  */
                __spin_lock (&ss->lock);
                if (!(ss->actions[SIGTTIN].sa_flags & SA_RESTART))
                  err = EINTR;
                __spin_unlock (&ss->lock);
              }
           }
       }
      /* If the last RPC generated a SIGTTIN, loop to try it again.  */
    } while (err == EBACKGROUND);

  return err;
}

Here is the call graph for this function:

Here is the caller graph for this function: