xref: /plan9/sys/src/ape/lib/ap/stdio/exit.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include <unistd.h>
2*3e12c5d1SDavid du Colombier #define	NONEXIT	34
3*3e12c5d1SDavid du Colombier int (*_atexitfns[NONEXIT])(void);
4*3e12c5d1SDavid du Colombier void exit(int status){
5*3e12c5d1SDavid du Colombier 	int i, (*f)(void);
6*3e12c5d1SDavid du Colombier 	for(i = NONEXIT-1; i >= 0; i--)
7*3e12c5d1SDavid du Colombier 		if(_atexitfns[i]){
8*3e12c5d1SDavid du Colombier 			f = _atexitfns[i];
9*3e12c5d1SDavid du Colombier 			_atexitfns[i] = 0;	/* self defense against bozos */
10*3e12c5d1SDavid du Colombier 			(*f)();
11*3e12c5d1SDavid du Colombier 		}
12*3e12c5d1SDavid du Colombier 	_exit(status);
13*3e12c5d1SDavid du Colombier }
14*3e12c5d1SDavid du Colombier atexit(int (*f)(void))
15*3e12c5d1SDavid du Colombier {
16*3e12c5d1SDavid du Colombier 	int i;
17*3e12c5d1SDavid du Colombier 	for(i=0; i<NONEXIT; i++)
18*3e12c5d1SDavid du Colombier 		if(!_atexitfns[i]){
19*3e12c5d1SDavid du Colombier 			_atexitfns[i] = f;
20*3e12c5d1SDavid du Colombier 			return(0);
21*3e12c5d1SDavid du Colombier 		}
22*3e12c5d1SDavid du Colombier 	return(1);
23*3e12c5d1SDavid du Colombier }
24