37 lines
		
	
	
	
		
			675 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
	
		
			675 B
		
	
	
	
		
			C
		
	
	
	
	
	
#include <errno.h>
 | 
						|
 | 
						|
extern int errno;
 | 
						|
 | 
						|
#define MAXSIG	128
 | 
						|
void	(*_sig_funcs[MAXSIG])();
 | 
						|
void	_sig_catch();
 | 
						|
void	(*_signal())();
 | 
						|
 | 
						|
void
 | 
						|
(*
 | 
						|
signal(sig, handler))()
 | 
						|
	void	(*handler)();
 | 
						|
{
 | 
						|
	void	(*old)(), (*retval)();
 | 
						|
 | 
						|
	if (sig <= 0 || sig > MAXSIG) {
 | 
						|
		errno = EINVAL;
 | 
						|
		return (void (*)()) -1;
 | 
						|
	}
 | 
						|
	if ((long) handler >= 0 && (long) handler <= 2) {
 | 
						|
		retval = _signal(sig, handler);
 | 
						|
		if (retval != (void (*)()) -1) {
 | 
						|
			old = _sig_funcs[sig-1];
 | 
						|
			_sig_funcs[sig-1] = handler;
 | 
						|
			return old;
 | 
						|
		}
 | 
						|
		return retval;
 | 
						|
	}
 | 
						|
	retval = _signal(sig, _sig_catch);
 | 
						|
	if (retval != (void (*)()) -1) {
 | 
						|
		old = _sig_funcs[sig-1];
 | 
						|
		_sig_funcs[sig-1] = handler;
 | 
						|
		return old;
 | 
						|
	}
 | 
						|
	return retval;
 | 
						|
}
 |