1*b30d1939SAndy Fiddaman /*********************************************************************** 2*b30d1939SAndy Fiddaman * * 3*b30d1939SAndy Fiddaman * This software is part of the ast package * 4*b30d1939SAndy Fiddaman * Copyright (c) 1985-2011 AT&T Intellectual Property * 5*b30d1939SAndy Fiddaman * and is licensed under the * 6*b30d1939SAndy Fiddaman * Eclipse Public License, Version 1.0 * 7*b30d1939SAndy Fiddaman * by AT&T Intellectual Property * 8*b30d1939SAndy Fiddaman * * 9*b30d1939SAndy Fiddaman * A copy of the License is available at * 10*b30d1939SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html * 11*b30d1939SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12*b30d1939SAndy Fiddaman * * 13*b30d1939SAndy Fiddaman * Information and Software Systems Research * 14*b30d1939SAndy Fiddaman * AT&T Research * 15*b30d1939SAndy Fiddaman * Florham Park NJ * 16*b30d1939SAndy Fiddaman * * 17*b30d1939SAndy Fiddaman * Glenn Fowler <gsf@research.att.com> * 18*b30d1939SAndy Fiddaman * David Korn <dgk@research.att.com> * 19*b30d1939SAndy Fiddaman * Phong Vo <kpv@research.att.com> * 20*b30d1939SAndy Fiddaman * * 21*b30d1939SAndy Fiddaman ***********************************************************************/ 22*b30d1939SAndy Fiddaman #pragma prototyped 23*b30d1939SAndy Fiddaman 24*b30d1939SAndy Fiddaman /* 25*b30d1939SAndy Fiddaman * ANSI C atexit() 26*b30d1939SAndy Fiddaman * arrange for func to be called LIFO on exit() 27*b30d1939SAndy Fiddaman */ 28*b30d1939SAndy Fiddaman 29*b30d1939SAndy Fiddaman #include <ast.h> 30*b30d1939SAndy Fiddaman 31*b30d1939SAndy Fiddaman #if _lib_atexit 32*b30d1939SAndy Fiddaman 33*b30d1939SAndy Fiddaman NoN(atexit) 34*b30d1939SAndy Fiddaman 35*b30d1939SAndy Fiddaman #else 36*b30d1939SAndy Fiddaman 37*b30d1939SAndy Fiddaman #if _lib_onexit || _lib_on_exit 38*b30d1939SAndy Fiddaman 39*b30d1939SAndy Fiddaman #if !_lib_onexit 40*b30d1939SAndy Fiddaman #define onexit on_exit 41*b30d1939SAndy Fiddaman #endif 42*b30d1939SAndy Fiddaman 43*b30d1939SAndy Fiddaman extern int onexit(void(*)(void)); 44*b30d1939SAndy Fiddaman 45*b30d1939SAndy Fiddaman int 46*b30d1939SAndy Fiddaman atexit(void (*func)(void)) 47*b30d1939SAndy Fiddaman { 48*b30d1939SAndy Fiddaman return(onexit(func)); 49*b30d1939SAndy Fiddaman } 50*b30d1939SAndy Fiddaman 51*b30d1939SAndy Fiddaman #else 52*b30d1939SAndy Fiddaman 53*b30d1939SAndy Fiddaman struct list 54*b30d1939SAndy Fiddaman { 55*b30d1939SAndy Fiddaman struct list* next; 56*b30d1939SAndy Fiddaman void (*func)(void); 57*b30d1939SAndy Fiddaman }; 58*b30d1939SAndy Fiddaman 59*b30d1939SAndy Fiddaman static struct list* funclist; 60*b30d1939SAndy Fiddaman 61*b30d1939SAndy Fiddaman extern void _exit(int); 62*b30d1939SAndy Fiddaman 63*b30d1939SAndy Fiddaman int 64*b30d1939SAndy Fiddaman atexit(void (*func)(void)) 65*b30d1939SAndy Fiddaman { 66*b30d1939SAndy Fiddaman register struct list* p; 67*b30d1939SAndy Fiddaman 68*b30d1939SAndy Fiddaman if (!(p = newof(0, struct list, 1, 0))) return(-1); 69*b30d1939SAndy Fiddaman p->func = func; 70*b30d1939SAndy Fiddaman p->next = funclist; 71*b30d1939SAndy Fiddaman funclist = p; 72*b30d1939SAndy Fiddaman return(0); 73*b30d1939SAndy Fiddaman } 74*b30d1939SAndy Fiddaman 75*b30d1939SAndy Fiddaman void 76*b30d1939SAndy Fiddaman _ast_atexit(void) 77*b30d1939SAndy Fiddaman { 78*b30d1939SAndy Fiddaman register struct list* p; 79*b30d1939SAndy Fiddaman 80*b30d1939SAndy Fiddaman while (p = funclist) 81*b30d1939SAndy Fiddaman { 82*b30d1939SAndy Fiddaman funclist = p->next; 83*b30d1939SAndy Fiddaman (*p->func)(); 84*b30d1939SAndy Fiddaman } 85*b30d1939SAndy Fiddaman } 86*b30d1939SAndy Fiddaman 87*b30d1939SAndy Fiddaman #if _std_cleanup 88*b30d1939SAndy Fiddaman 89*b30d1939SAndy Fiddaman #if _lib__cleanup 90*b30d1939SAndy Fiddaman extern void _cleanup(void); 91*b30d1939SAndy Fiddaman #endif 92*b30d1939SAndy Fiddaman 93*b30d1939SAndy Fiddaman void 94*b30d1939SAndy Fiddaman exit(int code) 95*b30d1939SAndy Fiddaman { 96*b30d1939SAndy Fiddaman _ast_atexit(); 97*b30d1939SAndy Fiddaman #if _lib__cleanup 98*b30d1939SAndy Fiddaman _cleanup(); 99*b30d1939SAndy Fiddaman #endif 100*b30d1939SAndy Fiddaman _exit(code); 101*b30d1939SAndy Fiddaman } 102*b30d1939SAndy Fiddaman 103*b30d1939SAndy Fiddaman #else 104*b30d1939SAndy Fiddaman 105*b30d1939SAndy Fiddaman void 106*b30d1939SAndy Fiddaman _cleanup(void) 107*b30d1939SAndy Fiddaman { 108*b30d1939SAndy Fiddaman _ast_atexit(); 109*b30d1939SAndy Fiddaman } 110*b30d1939SAndy Fiddaman 111*b30d1939SAndy Fiddaman #endif 112*b30d1939SAndy Fiddaman 113*b30d1939SAndy Fiddaman #endif 114*b30d1939SAndy Fiddaman 115*b30d1939SAndy Fiddaman #endif 116