41 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <lib.h>
 | |
| #define signal	_signal
 | |
| #include <signal.h>
 | |
| 
 | |
| extern _PROTOTYPE(void (*_vectab[_NSIG]), (int));	/* array of funcs to catch signals */
 | |
| 
 | |
| /* The definition of signal really should be
 | |
|  *  PUBLIC void (*signal(signr, func))()
 | |
|  * but some compilers refuse to accept this, even though it is correct.
 | |
|  * The only thing to do if you are stuck with such a defective compiler is
 | |
|  * change it to
 | |
|  *  PUBLIC void *signal(signr, func)
 | |
|  * and change ../h/signal.h accordingly.
 | |
|  */
 | |
| 
 | |
| PUBLIC void (*signal(signr, func))()
 | |
| int signr;			/* which signal is being set */
 | |
| _PROTOTYPE( void (*func), (int));	/* pointer to function that catches signal */
 | |
| {
 | |
|   int r;
 | |
|   _PROTOTYPE( void (*old), (int));
 | |
| 
 | |
|   old = _vectab[signr - 1];
 | |
|   _M.m6_i1 = signr;
 | |
|   if (func == SIG_IGN || func == SIG_DFL)
 | |
| 	/* Keep old signal catcher until it is completely de-installed */
 | |
| 	_M.m6_f1 = func;
 | |
|   else {
 | |
| 	/* Use new signal catcher immediately (old one may not exist) */
 | |
| 	_vectab[signr - 1] = func;
 | |
| 	_M.m6_f1 = _begsig;
 | |
|   }
 | |
|   r = _callx(MM, SIGNAL);
 | |
|   if (r < 0) {
 | |
| 	_vectab[signr - 1] = old;/* undo any pre-installation */
 | |
| 	return((void (*) ()) r);
 | |
|   }
 | |
|   _vectab[signr - 1] = func;	/* redo any pre-installation */
 | |
|   if (r == 1) return(SIG_IGN);
 | |
|   return(old);
 | |
| }
 |