mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-26 00:57:39 +03:00 
			
		
		
		
	2001-07-06 Paul Eggert <eggert@twinsun.com> * manual/argp.texi: Remove ignored LGPL copyright notice; it's not appropriate for documentation anyway. * manual/libc-texinfo.sh: "Library General Public License" -> "Lesser General Public License". 2001-07-06 Andreas Jaeger <aj@suse.de> * All files under GPL/LGPL version 2: Place under LGPL version 2.1.
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* _hurd_ctty_input -- Do an input RPC and generate SIGTTIN if necessary.
 | |
|    Copyright (C) 1995,97,99 Free Software Foundation, Inc.
 | |
|    This file is part of the GNU C Library.
 | |
| 
 | |
|    The GNU C Library is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU Lesser General Public
 | |
|    License as published by the Free Software Foundation; either
 | |
|    version 2.1 of the License, or (at your option) any later version.
 | |
| 
 | |
|    The GNU C Library is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|    Lesser General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU Lesser General Public
 | |
|    License along with the GNU C Library; if not, write to the Free
 | |
|    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 | |
|    02111-1307 USA.  */
 | |
| 
 | |
| #include <hurd.h>
 | |
| #include <hurd/signal.h>
 | |
| 
 | |
| /* Call *RPC on PORT and/or CTTY.  If a call on CTTY returns EBACKGROUND,
 | |
|    generate SIGTTIN or EIO as appropriate.  */
 | |
| 
 | |
| error_t
 | |
| _hurd_ctty_input (io_t port, io_t ctty, error_t (*rpc) (io_t))
 | |
| {
 | |
|   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;
 | |
| }
 |